在R中按双周(Fortnight)分组时间序列数据的问题求助
按年度划分双周分组计算均值的解决方案
问题描述
拥有10年时间序列数据,需计算周度、月度及双周(Fortnight)均值,周度和月度计算已完成,但双周分组时遇到报错。使用lubridate::floor_date(date, unit = "2 weeks")时,系统提示Rounding with week > 1 is not supported。
解决方案
以下是几种按年度划分双周分组的可行方法:
方法1:基于年度内天数计算双周组
通过将日期转换为年度内的天数,再按每14天为一组划分,确保双周组严格在年度内,不会跨年度:
library(lubridate) library(dplyr) # 生成示例时间序列数据 dates <- seq(as.Date("2015-06-06"), as.Date("2022-12-18"), by = "day") values <- rnorm(length(dates), mean = 100, sd = 10) data <- data.frame(date = dates, value = values) # 按年度划分双周并计算均值 grouped_data <- data %>% mutate( year = year(date), day_of_year = yday(date), # 每14天为一组,生成年度内的双周组编号 fortnight_group = ceiling(day_of_year / 14) ) %>% group_by(year, fortnight_group) %>% summarise( mean_value = mean(value), # 可选:添加每组的起始/结束日期,便于查看分组范围 start_date = min(date), end_date = max(date) ) %>% ungroup() print(grouped_data)
方法2:结合年度周数实现双周分组
利用lubridate的epiweek函数获取日期对应的年度周数,再通过整数除法将每两周合并为一组:
grouped_data <- data %>% mutate( year = year(date), # 将年度周数除以2并向下取整,得到双周组编号 fortnight_group = floor(epiweek(date) / 2) ) %>% group_by(year, fortnight_group) %>% summarise( mean_value = mean(value), start_date = min(date), end_date = max(date) ) %>% ungroup()
方法3:自定义双周起始日(按需选择)
如果需要指定双周的起始基准日(比如每年1月1日为第一组起始),可以通过计算日期与年度起始日的天数差来分组:
grouped_data <- data %>% mutate( year = year(date), # 生成当年1月1日的日期 year_start = as.Date(paste0(year, "-01-01")), # 计算日期与年度起始日的天数差,每14天为一组 fortnight_group = floor(as.numeric(date - year_start) / 14) + 1 ) %>% group_by(year, fortnight_group) %>% summarise( mean_value = mean(value), start_date = min(date), end_date = max(date) ) %>% ungroup()
补充说明
- 方法1和方法3的双周组严格限制在年度内,不会出现跨年度的分组;方法2基于年度周数,年末部分双周可能跨年度,可根据实际需求选择。
- 所有方法均通过
year与fortnight_group联合分组,保证每年度的双周组独立计数。
内容的提问来源于stack exchange,提问作者Pad
相关产品推荐
相关产品推荐

