如何将跨年度每日数据聚合为周均值?(R语言)
跨年度周均值计算的解决方案
当数据跨年度时,仅用week()函数提取周数会导致不同年份的同周数被错误聚合。解决这个问题的核心是给周数加上年份标识,确保每个分组唯一对应某一年的某一周,以下是三种实用方法:
方法1:使用lubridate::yearweek()(最简洁)
yearweek()函数会直接生成包含年份和周数的复合对象,天然避免跨年度混淆,直接用这个对象分组即可:
library(dplyr) library(lubridate) weekly_avg <- dta %>% group_by(week_group = yearweek(when)) %>% summarise(weekly_mean = mean(y)) %>% ungroup() # 查看前几组结果 head(weekly_avg)
方法2:同时按年份和周数分组
手动提取年份和周数,将二者作为联合分组键,确保每个分组是「年份+周数」的唯一组合:
weekly_avg <- dta %>% mutate( year = year(when), week = week(when) ) %>% group_by(year, week) %>% summarise(weekly_mean = mean(y)) %>% ungroup() # 查看跨年前后的分组结果 weekly_avg %>% filter(year %in% c(2021, 2022) & week %in% c(53, 1))
方法3:按周起始日期分组
用floor_date()将日期取整到每周的起始点(默认以周日为周起始,可通过week_start参数调整为周一),以起始日期作为分组依据,自然区分不同年份的周:
weekly_avg <- dta %>% group_by(week_start = floor_date(when, unit = "week", week_start = 1)) %>% # week_start=1指定周一为周起始 summarise(weekly_mean = mean(y)) %>% ungroup() # 查看跨年附近的周起始分组 weekly_avg %>% filter(week_start >= as.POSIXct("2021-12-26") & week_start <= as.POSIXct("2022-01-09"))
这三种方法都能解决跨年度周聚合的问题,可根据后续分析需求选择:
- 若只需年份+周的标识,选
yearweek()最便捷; - 若需要单独查看年份和周数,选「年份+周数」联合分组;
- 若需保留具体日期信息用于时间序列可视化或分析,选按周起始日期分组。
内容的提问来源于stack exchange,提问作者riccardo-df
相关产品推荐
相关产品推荐

