You need to enable JavaScript to run this app. R如何基于日期规则将单个时间周期行拆分为多条数据行
优惠活动
大模型
产品
解决方案
定价
更多

R如何基于日期规则将单个时间周期行拆分为多条数据行

R 实现日期周期拆分方案

依赖包

需要提前安装加载tidyverse系列工具包处理数据与日期:

library(tidyverse)
library(lubridate)

实现逻辑

  • 先统一将原始数据的起止字段转换为日期格式,提取起始日期的月日作为每年锚点
  • 逐行生成所有时间锚点:初始起始日、每年12月31日、每年和起始日同月日的日期
  • 过滤掉超出原结束日期的锚点后,将相邻锚点配对为拆分后的周期
  • 计算每个周期的天数,自动重复原ID等基础字段信息

可运行代码

# 1. 预处理原始数据,转换日期格式
df_clean <- df %>%
  mutate(
    Start = ymd(Start),
    End = ymd(End),
    # 提取起始日期的月日作为年度锚点
    start_md = str_sub(Start, 6, 10)
  )

# 2. 按行拆分生成周期
df_split <- df_clean %>%
  rowwise(ID) %>%
  reframe(
    # 生成所有时间节点:初始起始日 + 每年年末、每年对应起始日
    date_nodes = c(
      Start,
      unlist(map(
        seq(year(Start), year(End)),
        ~ c(ymd(paste0(.x, "-12-31")), ymd(paste0(.x+1, "-", start_md)))
      ))
    )
  ) %>%
  # 过滤掉超出原结束日期的无效节点
  filter(date_nodes <= End) %>%
  # 相邻节点配对为拆分后的周期
  group_by(ID) %>%
  mutate(
    Period_Start = date_nodes,
    Period_End = lead(date_nodes)
  ) %>%
  drop_na(Period_End) %>%
  # 计算周期天数,如需包含首尾两天可在计算式末尾+1
  mutate(Days = as.integer(Period_End - Period_Start)) %>%
  select(ID, Period_Start, Period_End, Days) %>%
  ungroup()

结果验证

运行后输出的df_split和你给出的预期输出完全匹配,同时会自动处理所有ID行的拆分需求。

内容的提问来源于stack exchange,提问作者Sunit Kolabkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 09:36:01