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

如何在R中复制行并添加15分钟时间间隔的新数据?

用data.table生成签到签出覆盖的15分钟间隔行

这需求太常见了!我之前处理员工考勤数据时经常遇到,用data.table的分组操作就能轻松搞定,效率还很高,不用写复杂的循环。

第一步:先构造示例数据(方便你对照)

假设你的data.table长这样,已经是15分钟取整的时间戳:

library(data.table)
dt <- data.table(
  id = c(1, 2),
  check_in = as.POSIXct(c("2024-05-20 10:00:00", "2024-05-20 14:30:00")),
  check_out = as.POSIXct(c("2024-05-20 11:00:00", "2024-05-20 15:15:00"))
)

第二步:核心代码生成间隔行

直接用data.table的分组+序列生成功能,一行代码搞定:

result <- dt[, .(interval = seq(check_in, check_out - 15*60, by = "15 mins")), 
             by = .(id, check_in, check_out)]

为什么要这么写?

  • by = .(id, check_in, check_out):按每一行的人员ID、签到签出时间分组,保证每个人的记录单独处理
  • seq(check_in, check_out - 15*60, by = "15 mins"):生成从签到时间到签出时间前15分钟的15分钟间隔序列——这刚好对应你例子里的情况:10:00签到11:00签出,最后一个间隔是10:45,不会包含11:00本身
  • 生成的interval列就是你要的每个15分钟间隔的时间戳

看一下输出结果

运行后result会变成这样:

print(result)
#    id           check_in          check_out            interval
# 1:  1 2024-05-20 10:00:00 2024-05-20 11:00:00 2024-05-20 10:00:00
# 2:  1 2024-05-20 10:00:00 2024-05-20 11:00:00 2024-05-20 10:15:00
# 3:  1 2024-05-20 10:00:00 2024-05-20 11:00:00 2024-05-20 10:30:00
# 4:  1 2024-05-20 10:00:00 2024-05-20 11:00:00 2024-05-20 10:45:00
# 5:  2 2024-05-20 14:30:00 2024-05-20 15:15:00 2024-05-20 14:30:00
# 6:  2 2024-05-20 14:30:00 2024-05-20 15:15:00 2024-05-20 14:45:00
# 7:  2 2024-05-20 14:30:00 2024-05-20 15:15:00 2024-05-20 15:00:00

额外小提示

如果你的原始数据里时间还没做15分钟取整,可以先加一步处理:

# 对签到签出时间做15分钟取整
dt[, `:=`(check_in = round.POSIXct(check_in, "15 mins"),
          check_out = round.POSIXct(check_out, "15 mins"))]

要是不需要保留原来的check_in和check_out列,只保留id和interval,可以把by里的列去掉,或者后续用result <- result[, .(id, interval)]筛选。

内容的提问来源于stack exchange,提问作者Gabriel Rosen-Duran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:51:21