微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算一个月中的日期观测值

如何解决计算一个月中的日期观测值

我有一个数据框,其中包含几年内具有相应日期的证券交易所的每日价格。这些日期是交易日期,因此不包括周末和节假日。例如:

df$date <- c(as.Date("2017-03-30","2017-03-31","2017-04-03","2017-04-04")

我已使用lubridate提取包含每个日期在哪个月份的列,但是我所苦恼的是创建一个列,该列用于每年的每个月,计算该月的哪个交易日。即从示例中可以看到,一个计数器将从2017-04-03的1开始,因为这是该月的第一个观测值,而不是3,因为它是该月的第三天,并在该月的最后一个观测值结束。这样列将如下所示:

df$DayofMonth <- c(22,23,1,2)

不是

df$DayofMonth <- c(30,31,3,4)

有人可以帮助我吗?

解决方法

也许有帮助:

library(data.table)
library(stringr)
df <-  setDT(df)
df[,YearMonth:=str_sub(Date,1,7)]
df[,DayofMonth := seq(.N),by = YearMonth]

您有一个名为YearMonth的列,其值类似于“ 2020-01”。 然后,对于每个组(月),给每个日期一个索引,该索引对应您的交易日。

如您所见,这将导致日期“ 2017-04-03”为1,因为它是该月的第一个交易日。如果您的df是从第一个日期到最后一个日期排序的,则此方法有效。

,

有一种使用lubridate提取日期成分和dplyr的方法。

library(dplyr)
library(lubridate)
df <- data.frame(date = as.Date(c("2017-03-30","2017-03-31","2017-04-03","2017-04-04")))
df %>%
  mutate(month = month(date),year = year(date),day = day(date)) %>%
  group_by(year,month) %>%
  mutate(DayofMonth = day - min(day) + 1) 
# A tibble: 4 x 5
# Groups:   year,month [2]
  date       month  year   day DayofMonth
  <date>     <dbl> <dbl> <int>      <dbl>
1 2017-03-30     3  2017    30          1
2 2017-03-31     3  2017    31          2
3 2017-04-03     4  2017     3          1
4 2017-04-04     4  2017     4          2
,

您可以尝试以下操作:

  • 对于每个日期,请找出该月的第一天。
  • 计算first_day_of_month与当前日期之间有多少个工作日。
library(dplyr)  
library(lubridate)

df %>%
  mutate(first_day_of_month = floor_date(date,'month'),day_of_month = purrr::map2_dbl(first_day_of_month,date,~sum(!weekdays(seq(.x,.y,by = 'day')) %in% c('Saturday','Sunday'))))

#        date first_day_of_month day_of_month
#1 2017-03-30         2017-03-01           22
#2 2017-03-31         2017-03-01           23
#3 2017-04-03         2017-04-01            1
#4 2017-04-04         2017-04-01            2

如果不需要,您可以删除first_day_of_month列。

数据

df <- data.frame(Date = as.Date(c("2017-03-30","2017-04-04")))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。