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

R语言按日级别拆分更新时间段起止时间的实现方法

实现代码

library(data.table)
library(lubridate)

# 1. 转换日期时间字段格式
DT[, c("begin", "end") := lapply(.SD, ymd_hms), .SDcols = c("begin", "end")]

# 2. 按人员+原始起止时间分组,给同组内的重复行编号
DT[, n := seq_len(.N), by = .(person, begin, end)]

# 3. 计算拆分后的每日起止时间
DT[, `:=`(
  new_begin = fifelse(
    n == 1, 
    begin, 
    floor_date(begin, unit = "day") + days(n - 1)
  ),
  new_end = fifelse(
    n == .N,
    end,
    floor_date(begin, unit = "day") + days(n)
  )
)]

# 4. 清理冗余字段,调整列顺序
DT[, c("begin", "end", "n") := NULL]
setnames(DT, c("new_begin", "new_end"), c("begin", "end"))
setcolorder(DT, c("begin", "end", "person"))

# 查看结果
print(DT)

逻辑说明

  • 原始数据已经按照跨天数量生成了对应行数的重复记录,只需对同个时段的重复行按顺序做日期偏移即可
  • 分组逻辑:同一个人员、相同原始起止时间的记录属于同一个待拆分时段
  • 每行拆分规则:
    • 时段第一行:起始时间保留原始起始时间,结束时间为原始起始时间当天的次日零点
    • 时段中间行:起始时间为当日零点,结束时间为次日零点
    • 时段最后一行:起始时间为当日零点,结束时间保留原始结束时间

运行后输出结果和预期完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:06:05