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

如何在R语言中计算tibble数据框中多时段与指定时段的总重叠时长?

计算时间段与目标区间的总重叠时长

所需工具

需要用到 tidyverse(处理数据框和映射操作)、hms(处理时分秒格式)包,先安装并加载:

install.packages(c("tidyverse", "hms"))
library(tidyverse)
library(hms)

步骤实现

  1. 定义目标时间区间
    先设定需要对比的目标时间段:12:00:00 至 15:00:00,转成时分秒对象:
target_start <- as_hms("12:00:00")
target_end <- as_hms("15:00:00")
  1. 编写重叠时长计算函数
    这个函数负责处理单个时间段字符串,计算其与目标区间的重叠时长(单位:小时):
calc_overlap <- function(period_str) {
  # 拆分时间段为开始和结束时间
  time_parts <- str_split(period_str, "-")[[1]]
  
  # 补全时间格式(处理类似"21:15"这种缺秒的情况)
  format_time <- function(t) {
    if (str_count(t, ":") == 1) paste0(t, ":00") else t
  }
  
  # 转成时分秒对象,处理"24:00"为当天最后一秒
  start_time <- as_hms(format_time(time_parts[1]))
  end_time <- as_hms(format_time(time_parts[2]))
  if (end_time == as_hms("00:00:00") && time_parts[2] == "24:00") {
    end_time <- as_hms("23:59:59")
  }
  
  # 计算重叠区间的起止点
  overlap_start <- max(start_time, target_start)
  overlap_end <- min(end_time, target_end)
  
  # 无重叠返回0,否则计算时长(转成小时)
  if (overlap_start > overlap_end) {
    0
  } else {
    as.duration(overlap_end - overlap_start) / dhours(1)
  }
}
  1. 批量计算每行的总重叠时长
    使用map_dbl对每行的时间段列表批量处理,求和后保留两位小数:
df <- df %>%
  mutate(hrs = round(map_dbl(period, ~ sum(map_dbl(.x, calc_overlap))), 2))

验证结果

运行后得到的df与预期输出一致:

# 输出结果
df
#> # A tibble: 4 × 2
#>   period                                                                 hrs
#>   <list>                                                               <dbl>
#> 1 <chr [2]>                                                             3   
#> 2 <chr [3]>                                                             0   
#> 3 <chr [1]>                                                             1.33
#> 4 <chr [2]>                                                             0.75

内容的提问来源于stack exchange,提问作者flâneur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:13:13