如何解决计算一个月中的日期观测值
我有一个数据框,其中包含几年内具有相应日期的证券交易所的每日价格。这些日期是交易日期,因此不包括周末和节假日。例如:
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 举报,一经查实,本站将立刻删除。