如何在R中的日期范围及其各自的值之间找到所有月份的第三个星期日日期
How to find third Sunday date for all months between a date range in R and their respective values
对于特定的日期范围,例如 2020-01-29 和 2021-05-02 之间,我想找出每个月的每个第三个星期日的日期及其关联的 value
data.frame
.
此外,如果任何一个月有任何第 5 个星期一,那么我想在单独的 data.frame
.
中获取它的日期和相应的值
请注意,它必须介于 data.frame
中给出的日期范围内。
## for creating data frame in R wrt dates and values
dates_seq<-(seq(as.Date("2019/12/28"), by = "day", length.out = 1000))
dates_seq<-as.data.frame(dates_seq)
values<-seq(1:1000)
df<-as.data.frame(cbind(dates_seq,values))
总而言之,我想找到每个月的第三个星期日日期及其对应的值,以及每个月的第五个星期一(如果有的话)及其值。
与 lubridate
星期日是一周的第一天一样,此代码将为您提供包含所有第三个星期日的数据框:
df <- df %>%
mutate(dates_seq = as.Date(dates_seq)) %>%
mutate(year = year(dates_seq),
month = month(dates_seq),
day = wday(dates_seq)) %>%
filter(day == 1) %>%
group_by(year, month) %>%
slice(3)
您可以与原始数据框进行匹配以找到行索引。
这是基本的 R 方法:
# Get date between 2020-01-29 and 2021-05-0
temp <- subset(df, dates_seq >= as.Date('2020-01-29') &
dates_seq <= as.Date('2021-05-02'))
#Add weekday
temp$week_day <- weekdays(temp$dates_seq)
#Add week number for each month
temp$week_number <- ave(temp$week_day, temp$week_day,
format(temp$dates_seq, "%Y-%m"), FUN = seq_along)
#Subset 3rd Sunday and 5th Monday
subset(temp, week_number == 3 & week_day == 'Sunday' |
week_number == 5 & week_day == 'Monday')
# dates_seq values week_day week_number
#51 2020-02-16 51 Sunday 3
#79 2020-03-15 79 Sunday 3
#94 2020-03-30 94 Monday 5
#114 2020-04-19 114 Sunday 3
#142 2020-05-17 142 Sunday 3
#177 2020-06-21 177 Sunday 3
#185 2020-06-29 185 Monday 5
#205 2020-07-19 205 Sunday 3
#233 2020-08-16 233 Sunday 3
#248 2020-08-31 248 Monday 5
#268 2020-09-20 268 Sunday 3
#296 2020-10-18 296 Sunday 3
#324 2020-11-15 324 Sunday 3
#339 2020-11-30 339 Monday 5
#359 2020-12-20 359 Sunday 3
#387 2021-01-17 387 Sunday 3
#422 2021-02-21 422 Sunday 3
#450 2021-03-21 450 Sunday 3
#458 2021-03-29 458 Monday 5
#478 2021-04-18 478 Sunday 3
对于特定的日期范围,例如 2020-01-29 和 2021-05-02 之间,我想找出每个月的每个第三个星期日的日期及其关联的 value
data.frame
.
此外,如果任何一个月有任何第 5 个星期一,那么我想在单独的 data.frame
.
请注意,它必须介于 data.frame
中给出的日期范围内。
## for creating data frame in R wrt dates and values
dates_seq<-(seq(as.Date("2019/12/28"), by = "day", length.out = 1000))
dates_seq<-as.data.frame(dates_seq)
values<-seq(1:1000)
df<-as.data.frame(cbind(dates_seq,values))
总而言之,我想找到每个月的第三个星期日日期及其对应的值,以及每个月的第五个星期一(如果有的话)及其值。
与 lubridate
星期日是一周的第一天一样,此代码将为您提供包含所有第三个星期日的数据框:
df <- df %>%
mutate(dates_seq = as.Date(dates_seq)) %>%
mutate(year = year(dates_seq),
month = month(dates_seq),
day = wday(dates_seq)) %>%
filter(day == 1) %>%
group_by(year, month) %>%
slice(3)
您可以与原始数据框进行匹配以找到行索引。
这是基本的 R 方法:
# Get date between 2020-01-29 and 2021-05-0
temp <- subset(df, dates_seq >= as.Date('2020-01-29') &
dates_seq <= as.Date('2021-05-02'))
#Add weekday
temp$week_day <- weekdays(temp$dates_seq)
#Add week number for each month
temp$week_number <- ave(temp$week_day, temp$week_day,
format(temp$dates_seq, "%Y-%m"), FUN = seq_along)
#Subset 3rd Sunday and 5th Monday
subset(temp, week_number == 3 & week_day == 'Sunday' |
week_number == 5 & week_day == 'Monday')
# dates_seq values week_day week_number
#51 2020-02-16 51 Sunday 3
#79 2020-03-15 79 Sunday 3
#94 2020-03-30 94 Monday 5
#114 2020-04-19 114 Sunday 3
#142 2020-05-17 142 Sunday 3
#177 2020-06-21 177 Sunday 3
#185 2020-06-29 185 Monday 5
#205 2020-07-19 205 Sunday 3
#233 2020-08-16 233 Sunday 3
#248 2020-08-31 248 Monday 5
#268 2020-09-20 268 Sunday 3
#296 2020-10-18 296 Sunday 3
#324 2020-11-15 324 Sunday 3
#339 2020-11-30 339 Monday 5
#359 2020-12-20 359 Sunday 3
#387 2021-01-17 387 Sunday 3
#422 2021-02-21 422 Sunday 3
#450 2021-03-21 450 Sunday 3
#458 2021-03-29 458 Monday 5
#478 2021-04-18 478 Sunday 3