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

