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

基于R语言time series/lubridate实现不规则日期滑动窗口多值汇总

解决方案

核心思路

手动生成以指定日为端点的滑动窗口日期序列,再遍历每个窗口筛选数据并计算汇总指标,完美解决指定日控制、多指标输出及日期关联的问题。

步骤1:准备示例数据

假设你的数据框名为sales_data,包含sale_date(日期型)和price(数值型)列,先构造模拟数据适配场景:

library(tidyverse)
library(lubridate)

# 模拟数据:含不规则日期、同一日期多观测值的住宅销售数据
set.seed(123)
sales_data <- tibble(
  sale_date = sample(seq(ymd("2020-01-01"), ymd("2023-06-30"), by = "day"), 1000, replace = TRUE),
  price = round(rnorm(1000, mean = 500000, sd = 100000), 0)
) %>% arrange(sale_date)

# 定义核心参数:生效日期、每月指定日、窗口宽度、步长
effective_date <- ymd("2023-07-11")
target_day <- 11 # 每月11日作为窗口端点,可改为17等任意合法日期
window_width <- 3 # 窗口宽度:支持1-6个月调整
step_size <- 1 # 步长:固定1个月

步骤2:生成指定日的滑动窗口序列

生成所有符合要求的窗口起止日期,自动修正2月无30/31日等异常情况:

# 生成窗口结束日期:从生效日期往前推,步长1个月
end_dates <- seq(effective_date, 
                 ymd(paste(year(min(sales_data$sale_date)) + ceiling(window_width/12), target_day, month(min(sales_data$sale_date)), sep = "-")),
                 by = paste0(-step_size, " months")) %>%
  # 强制修正为每月target_day
  map_dbl(~ ifelse(day(.x) != target_day, 
                   floor_date(.x, "month") + days(target_day - 1), 
                   as.numeric(.x))) %>%
  as_date() %>%
  sort()

# 生成对应窗口的起始日期:结束日期往前推window_width个月,同样修正为指定日
start_dates <- end_dates %>%
  map_dbl(~ floor_date(.x - months(window_width), "month") + days(target_day - 1)) %>%
  as_date()

# 组合成窗口表,过滤掉起始日早于数据最早日期的无效窗口
window_table <- tibble(start_date = start_dates, end_date = end_dates) %>%
  filter(start_date >= min(sales_data$sale_date))

步骤3:遍历窗口计算汇总指标

用purrr遍历每个窗口,一次性输出所有要求的统计量:

# 定义窗口汇总函数
summarize_window <- function(start, end, data) {
  filtered <- data %>% filter(sale_date >= start & sale_date <= end)
  tibble(
    start_date = start,
    end_date = end,
    min_price = min(filtered$price, na.rm = TRUE),
    max_price = max(filtered$price, na.rm = TRUE),
    median_price = median(filtered$price, na.rm = TRUE),
    obs_count = nrow(filtered)
  )
}

# 遍历所有窗口生成最终结果表
final_result <- window_table %>%
  mutate(summary = pmap(list(start_date, end_date), summarize_window, data = sales_data)) %>%
  unnest(summary) %>%
  arrange(end_date)

步骤4:绘制趋势图

直接用结果表中的end_date关联指标绘图,完全满足可视化需求:

ggplot(final_result, aes(x = end_date, y = median_price)) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_point(size = 2) +
  labs(title = "住宅价格中位数滑动窗口趋势",
       x = "窗口结束日期", y = "中位数价格") +
  theme_minimal()

关键优势

  • 完全控制窗口起止为指定日,解决slider自然月的局限
  • 输出所有要求的统计指标,同时关联窗口日期,直接用于可视化
  • 兼容日期不规则、多观测值的原始数据
  • 窗口宽度(1-6个月)可通过参数灵活调整

内容的提问来源于stack exchange,提问作者Joseph Harvard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:43:17