基于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
相关产品推荐
相关产品推荐

