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

在R中拆分重叠时间区间、设置优先级并填充间隙的方法

处理带优先级的重叠机器事件数据:无重叠区间转换、间隙填充与合并

问题背景

我在R中处理机器事件数据,每条事件包含:

  • 开始时间、结束时间
  • 唯一事件码
  • 优先级(有序因子,级别越高优先级越高)

需要实现三个核心需求:

  1. 将重叠事件拆分为无重叠时间区间,每个区间继承该时段内优先级最高的事件属性
  2. 用虚拟事件(event_code = 0,precedence = Level 0)填充事件之间的无事件间隙
  3. 合并具有相同事件码和优先级的连续区间,避免碎片化

可复现示例

输入数据(startstate)

startstate <- structure(list(
  event_code = c(101, 202, 303, 202, 404),
  start_time = structure(c(1735689600, 1735707600, 1735725600, 1735743600, 1735756200), class = c("POSIXct", "POSIXt"), tzone = "UTC"),
  end_time   = structure(c(1735718400, 1735722000, 1735740000, 1735758000, 1735776000), class = c("POSIXct", "POSIXt"), tzone = "UTC"),
  precedence = structure(c(1L, 2L, 1L, 2L, 3L), levels = c("Level 1", "Level 2", "Level 3"), class = c("ordered", "factor"))
), class = "data.frame", row.names = c(NA, -5L))

# 查看输入
startstate

输出展示:

event_code          start_time            end_time precedence
1        101 2025-01-01 00:00:00 2025-01-01 08:00:00    Level 1
2        202 2025-01-01 05:00:00 2025-01-01 09:00:00    Level 2
3        303 2025-01-01 10:00:00 2025-01-01 14:00:00    Level 1
4        202 2025-01-01 15:00:00 2025-01-01 19:00:00    Level 2
5        404 2025-01-01 18:30:00 2025-01-02 00:00:00    Level 3

期望输出(endstate)

endstate <- structure(list(
  event_code = c(101, 202, 0, 303, 0, 202, 404),
  start_time = structure(c(1735689600, 1735707600, 1735722000, 1735725600, 1735740000, 1735743600, 1735756200), tzone = "UTC", class = c("POSIXct", "POSIXt")),
  end_time   = structure(c(1735707600, 1735722000, 1735725600, 1735740000, 1735743600, 1735756200, 1735776000), tzone = "UTC", class = c("POSIXct", "POSIXt")),
  precedence = c("Level 1", "Level 2", "Level 0", "Level 1", "Level 0", "Level 2", "Level 3")
), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame"))

# 查看期望输出
endstate

输出展示:

event_code start_time          end_time            precedence
1        101 2025-01-01 00:00:00 2025-01-01 05:00:00 Level 1   
2        202 2025-01-01 05:00:00 2025-01-01 09:00:00 Level 2   
3          0 2025-01-01 09:00:00 2025-01-01 10:00:00 Level 0   
4        303 2025-01-01 10:00:00 2025-01-01 14:00:00 Level 1   
5          0 2025-01-01 14:00:00 2025-01-01 15:00:00 Level 0   
6        202 2025-01-01 15:00:00 2025-01-01 18:30:00 Level 2   
7        404 2025-01-01 18:30:00 2025-01-02 00:00:00 Level 3   

编辑说明:修正了endstate中的event_code笔误,感谢@jon-spring指出。

当前尝试与遇到的问题

我尝试用ivs包处理重叠区间(因其支持右开区间),但遇到两个主要问题:

  1. 拆分后出现相同事件码和优先级的相邻行,需要手动合并(如下示例中后两行202事件应合并)
event_code start_time          end_time            precedence
       101 2025-01-01 00:00:00 2025-01-01 05:00:00 Level 1          
       202 2025-01-01 05:00:00 2025-01-01 08:00:00 Level 2          
       202 2025-01-01 08:00:00 2025-01-01 09:00:00 Level 2  <- 应与上一行合并
  1. 不清楚如何简洁地插入间隙填充行,实现无事件时段的虚拟事件填充

寻求解决方案

需要解决以下三个核心问题的实现方法:

  • 将重叠区间拆分为无重叠区间,并正确分配最高优先级的事件属性
  • 自动插入Level 0虚拟事件填充事件间隙
  • 自动合并相同属性的连续区间

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:25:57