You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 03:06:01