如何在R语言中计算tibble数据框中多时段与指定时段的总重叠时长?
计算时间段与目标区间的总重叠时长
所需工具
需要用到 tidyverse(处理数据框和映射操作)、hms(处理时分秒格式)包,先安装并加载:
install.packages(c("tidyverse", "hms")) library(tidyverse) library(hms)
步骤实现
- 定义目标时间区间
先设定需要对比的目标时间段:12:00:00 至 15:00:00,转成时分秒对象:
target_start <- as_hms("12:00:00") target_end <- as_hms("15:00:00")
- 编写重叠时长计算函数
这个函数负责处理单个时间段字符串,计算其与目标区间的重叠时长(单位:小时):
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) } }
- 批量计算每行的总重叠时长
使用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
相关产品推荐
相关产品推荐

