如何将R数据框中的时间区间拆分至小时级并按比例统计时长?
实现R数据框的小时级时长统计
可以借助lubridate、dplyr和tidyr包高效实现需求,核心思路是将原始时间段拆分为覆盖的小时区间,计算每个区间内的重叠时长后汇总,具体代码如下:
# 加载依赖包 library(lubridate) library(dplyr) library(tidyr) # 原始数据 df1 <- data.frame( Start = c("18:12", "18:42", "20:12", "22:30"), End = c("18:30", "20:00", "22:30", "22:36"), `Duration (hour)` = c(0.3, 1.3, 2.3, 0.1) ) # 转换时间格式并提取小时信息 df_processed <- df1 %>% mutate( Start_time = hms(Start), End_time = hms(End), start_hour = hour(Start_time), end_hour = hour(End_time) ) # 展开原始记录到覆盖的所有小时区间 df_expanded <- df_processed %>% rowwise() %>% mutate(clock = list(seq(start_hour, end_hour))) %>% unnest(clock) %>% ungroup() # 计算每个小时区间内的实际时长 df_calculated <- df_expanded %>% mutate( interval_start = hms(paste0(clock, ":00:00")), interval_end = hms(paste0(clock + 1, ":00:00")), overlap_start = pmax(Start_time, interval_start), overlap_end = pmin(End_time, interval_end), duration_hour = as.duration(overlap_end - overlap_start) / dhours(1) ) # 汇总得到小时级统计结果 final_result <- df_calculated %>% mutate(clock = paste0(clock, "to", clock + 1)) %>% group_by(clock) %>% summarise(`Duration (hour)` = sum(duration_hour)) # 输出结果 final_result
代码说明
- 时间格式转换:用
hms()将字符串时间转为可计算的时间对象,同时提取每个时间段的起始、结束小时数。 - 区间展开:把每个原始时间段拆分为它覆盖的所有小时区间(比如18:42-20:00会拆为18、19两个区间)。
- 重叠时长计算:针对每个小时区间,计算原始时间段与该区间的重叠部分,转换为小时数。
- 汇总统计:按
18to19这类区间标签汇总时长,得到最终统计结果。
运行代码后将得到与预期一致的表格:
| clock | Duration (hour) |
|---|---|
| 18to19 | 0.6 |
| 19to20 | 1 |
| 20to21 | 0.8 |
| 21to22 | 1 |
| 22to23 | 0.6 |
内容的提问来源于stack exchange,提问作者Fadhil Dzikri
相关产品推荐
相关产品推荐

