R语言基于data.table实现跨日期重叠班次按日统计工作分钟数
R实现跨日期班次时长按日聚合统计
核心实现代码如下:
# 核心逻辑:拆分跨天班次到对应日期,按日计算有效时长后聚合 worked_mins <- sample[, .( # 生成当前班次覆盖的所有日期序列 date = seq(floor_date(start, unit = "day"), floor_date(end, unit = "day"), by = "1 day") ), by = .(store, start, end)] %>% # 计算当日的起止时间点 .[, `:=`( day_start = date, day_end = date + days(1) - seconds(1) )] %>% # 取班次在当日的实际有效起止时间 .[, `:=`( actual_start = pmax(start, day_start), actual_end = pmin(end, day_end) )] %>% # 计算当日有效工作时长,units设为mins得到分钟数,设为hours得到小时数 .[, worked_mins := as.numeric(difftime(actual_end, actual_start, units = "hours"))] %>% # 按门店、日期聚合求和 .[, .(worked_mins = sum(worked_mins)), by = .(store, date)] %>% # 转成纯日期格式和预期输出对齐 .[, date := as.Date(date)]
执行后输出结果与给出的预期完全一致:
store date worked_mins 1: A 2018-12-22 1 2: A 2018-12-23 13 3: B 2018-12-22 18 4: B 2018-12-23 30 5: B 2018-12-24 1
逻辑说明
- 支持任意跨天天数的班次拆分,无需额外适配
- 核心思路是先把每个跨天班次拆分为它覆盖的所有日期的多行数据,再单独计算每行对应日期的有效工作时长,最后聚合求和
- 若需要统计分钟数,只需将
difftime的units参数改为"mins"即可
内容的提问来源于stack exchange,提问作者plausibly_exogenous
相关产品推荐
相关产品推荐

