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

如何将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

代码说明

  1. 时间格式转换:用hms()将字符串时间转为可计算的时间对象,同时提取每个时间段的起始、结束小时数。
  2. 区间展开:把每个原始时间段拆分为它覆盖的所有小时区间(比如18:42-20:00会拆为18、19两个区间)。
  3. 重叠时长计算:针对每个小时区间,计算原始时间段与该区间的重叠部分,转换为小时数。
  4. 汇总统计:按18to19这类区间标签汇总时长,得到最终统计结果。

运行代码后将得到与预期一致的表格:

clockDuration (hour)
18to190.6
19to201
20to210.8
21to221
22to230.6

内容的提问来源于stack exchange,提问作者Fadhil Dzikri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:43:18