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

如何用R语言计算无重叠的单组活跃时间区间?

解决方案

要找出仅单个组活跃且无其他组时间重叠的时段,可以通过分割所有时间点→统计每个子区间的活跃组数→筛选单组活跃区间的思路实现,具体代码如下:

步骤1:加载依赖包

library(tidyverse)
library(lubridate)

步骤2:提取并排序所有时间节点

把所有组的起始、结束时间提取出来,去重后排序,得到所有可能的区间分割点:

time_points <- data %>%
  pivot_longer(cols = c(start, end), values_to = "time") %>%
  pull(time) %>%
  unique() %>%
  sort()

步骤3:生成所有连续子区间

用排序后的时间点生成一系列连续的小时间区间:

time_intervals <- tibble(
  interval_start = time_points[-length(time_points)],
  interval_end = time_points[-1]
)

步骤4:统计每个子区间的活跃组数并筛选

对每个子区间,判断哪些组的时间范围覆盖它,统计活跃组数后筛选出仅单个组活跃的区间:

single_group_intervals <- time_intervals %>%
  rowwise() %>%
  mutate(
    # 找出当前子区间内活跃的所有组
    active_groups = list(data %>%
                          filter(start < interval_end, end > interval_start) %>%
                          pull(group)),
    group_count = length(active_groups)
  ) %>%
  ungroup() %>%
  # 仅保留单个组活跃的区间
  filter(group_count == 1) %>%
  mutate(group = unlist(active_groups))

查看结果

格式化时间后输出结果:

single_group_intervals %>%
  select(group, interval_start, interval_end) %>%
  mutate(
    interval_start = format(interval_start, "%Y-%m-%d %H:%M:%S"),
    interval_end = format(interval_end, "%Y-%m-%d %H:%M:%S")
  )

输出结果:

# A tibble: 1 × 3
  group interval_start     interval_end      
  <chr> <chr>              <chr>             
1 C     2022-01-03 14:00:00 2022-01-03 15:00:00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:15:32