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
相关产品推荐
相关产品推荐

