R时间序列自定义3月窗口下floor_date分组计算分位数结果不符问题求助
问题解决方法
问题原因
lubridate::floor_date()使用3个月为单位向下取整时,默认与1月对齐生成自然季度(1-3/4-6/7-9/10-12),和你筛选的自定义3月窗口没有关联,所以FMA窗口的2-3月会被归到1月起始的季度,4月归到4月起始的季度,才会出现一年返回两组结果的问题。
修复原代码的方法
只需要给floor_date()增加start_month参数,指定你当前窗口的起始月份即可,比如FMA窗口起始月为2月,修改后代码如下:
df.FMA %>% group_by(Year = floor_date(Date, "3 months", start_month = 2)) %>% summarize(Q = quantile(Q, 0.5, na.rm = T))
运行后返回的结果就会是每年一组,共3行符合预期的结果。
不同窗口对应start_month取值:
- JFM(1-3月):1
- FMA(2-4月):2
- ...
- OND(10-12月):10
更高效的批量处理方案
不需要手动拆分10个独立数据框,可一次性计算所有滑动窗口的3个分位数,代码如下:
# 加载依赖包 library(lubridate) library(dplyr) library(purrr) # 定义所有滑动3月窗口 window_list <- tibble( start_month = 1:10, window_name = c("JFM","FMA","MAM","AMJ","MJJ","JJA","JAS","ASO","SON","OND") ) # 批量计算所有窗口的0.1/0.5/0.9分位数 all_quantile_result <- pmap_dfr(window_list, function(start_month, window_name){ df %>% # 筛选当前窗口对应的3个月份 filter(month(Date) %in% start_month:(start_month+2)) %>% # 按年份+自定义窗口分组 group_by(year = year(Date), window = window_name) %>% summarise( q10 = quantile(Q, 0.1, na.rm = TRUE), q50 = quantile(Q, 0.5, na.rm = TRUE), q90 = quantile(Q, 0.9, na.rm = TRUE), .groups = "drop" ) })
输出的all_quantile_result会包含10个窗口、每年的三个分位数结果,适合长时序批量计算场景。
内容的提问来源于stack exchange,提问作者adamrusn
相关产品推荐
相关产品推荐

