如何在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