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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:15:50