如何在R中按跨年日期范围对日期变量进行分组?
按跨年固定日期范围分组的解决方案
要实现按每年11月15日至次年2月15日这样的跨年时间段分组,核心是给每个日期分配对应的跨年度分组标识,再用该标识完成group_by操作。以下是具体实现步骤:
1. 加载依赖包
如果使用tidyverse生态工具,先加载必要的包:
library(dplyr) library(lubridate) # 简化日期处理,可选但推荐
2. 创建分组标识列
通过判断日期所属的月日范围,给每个日期匹配对应的跨年度分组:
df <- df %>% mutate( # 提取"月-日"字符串,用于跨年份的日期范围判断 month_day = format(time, "%m-%d"), # 确定分组的起始年份:11-15至年末归为当年起始,年初至2-15归为前一年起始 group_year = case_when( month_day >= "11-15" ~ year(time), month_day <= "02-15" ~ year(time) - 1, TRUE ~ NA_integer_ # 不在目标时间段的日期标记为NA,可后续过滤 ), # 生成易读的分组ID,例如"2010-2011"代表2010年11月15日至2011年2月15日 group_id = paste(group_year, group_year + 1, sep = "-") )
无lubridate的替代方案
如果不想使用lubridate,可通过base R的日期函数实现相同逻辑:
df <- df %>% mutate( month = as.integer(format(time, "%m")), day = as.integer(format(time, "%d")), group_year = case_when( (month == 11 & day >= 15) | month == 12 ~ as.integer(format(time, "%Y")), month == 1 | (month == 2 & day <= 15) ~ as.integer(format(time, "%Y")) - 1, TRUE ~ NA_integer_ ), group_id = paste(group_year, group_year + 1, sep = "-") )
3. 按分组标识聚合数据
现在可以用group_id进行分组操作,例如计算每组的均值、起止日期:
df_grouped <- df %>% filter(!is.na(group_id)) %>% # 过滤掉不在目标时间段的日期(可选) group_by(group_id) %>% summarise( avg_value = mean(value, na.rm = TRUE), period_start = min(time), period_end = max(time) ) %>% ungroup()
说明
- 代码中
>= "11-15"和<= "02-15"会包含11月15日和2月15日当天,若需排除可改为> "11-15"或< "02-15" - 不在目标时间段的日期会被标记为
NA,可根据需求选择保留或过滤
内容的提问来源于stack exchange,提问作者asm
相关产品推荐
相关产品推荐

