如何从R生成的日期序列中筛选澳大利亚月末工作日?
获取澳大利亚时区月末工作日序列
这里提供两种直接可行的方案,基于你已有的代码逻辑优化:
方案1:基于现有每日序列筛选
如果你已经生成了完整的每日工作日标记数据,可以通过分组筛选快速得到每个月的最后一个工作日:
pacman::p_load(RQuantLib, dplyr) # 你的原有代码 daysSeq = seq(from = as.Date("2017-08-31"), to = as.Date("2023-08-31"), by = "1 day") business_days <- data.frame(dates = daysSeq, bizday = isBusinessDay("Australia", daysSeq)) # 按年月分组,提取每个月最后一个工作日 monthly_last_bizday <- business_days %>% # 生成年月分组标识 mutate(year_month = format(dates, "%Y-%m")) %>% group_by(year_month) %>% # 只保留工作日 filter(bizday) %>% # 取每组最后一条(即该月最后一个工作日) slice_tail(n = 1) %>% ungroup() %>% # 只保留日期列 select(dates)
方案2:直接调用RQuantLib获取(更高效)
不需要生成完整每日序列,直接用getLastBusinessDay函数针对每个月份获取澳大利亚时区的月末工作日,效率更高:
pacman::p_load(RQuantLib) # 生成需要覆盖的年月范围(每个月的第一天) year_months <- seq(as.Date("2017-08-01"), as.Date("2023-08-01"), by = "month") # 遍历每个年月,获取对应月末工作日 monthly_last_bizday <- sapply(year_months, function(ym) { getLastBusinessDay( calendar = "Australia", month = as.integer(format(ym, "%m")), year = as.integer(format(ym, "%Y")) ) }) # 转换为日期格式并整理成数据框 monthly_last_bizday <- as.Date(monthly_last_bizday, origin = "1970-01-01") monthly_last_bizday <- data.frame(dates = monthly_last_bizday)
两种方案都会返回2017-08到2023-08期间每个月的澳大利亚月末工作日序列,结果完全一致。方案2避免了生成海量每日数据,适合时间范围较大的场景。
内容的提问来源于stack exchange,提问作者Jak Carty
相关产品推荐
相关产品推荐

