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

如何合并Pandas DataFrame中时间间隔小于阈值的事件?

合并重叠或间隔小于10分钟的时间事件DataFrame

我有一个名为capsules的DataFrame,存储了带时间范围的事件数据:

Start                 End
0  2022-01-05 04:35:00 2022-01-05 04:45:00
1  2022-02-04 21:05:00 2022-02-04 21:15:00
2  2022-03-09 04:35:00 2022-03-09 04:45:00
3  2022-03-09 04:35:00 2022-03-09 04:45:00
4  2022-03-09 20:15:00 2022-03-09 20:25:00
5  2022-03-09 20:25:00 2022-03-09 21:15:00
6  2022-04-27 17:05:00 2022-04-27 17:25:00
7  2022-04-27 17:05:00 2022-04-27 17:15:00
8  2022-04-27 21:05:00 2022-04-27 21:55:00
9  2022-04-27 21:05:00 2022-04-27 21:15:00
10 2022-05-06 12:45:00 2022-05-06 12:55:00
11 2022-05-06 12:45:00 2022-05-06 12:55:00
12 2022-05-06 13:15:00 2022-05-06 13:25:00
13 2022-05-06 13:45:00 2022-05-06 13:55:00
14 2022-05-06 16:50:00 2022-05-06 16:50:00
15 2022-05-06 17:35:00 2022-05-06 17:55:00
16 2022-05-06 22:45:00 2022-05-06 22:55:00
17 2022-05-07 00:45:00 2022-05-07 00:55:00
18 2022-05-07 02:15:00 2022-05-07 02:25:00
19 2022-06-21 06:25:00 2022-06-21 06:35:00
20 2022-06-21 19:25:00 2022-06-21 19:35:00
21 2022-06-21 21:35:00 2022-06-21 21:45:00
22 2022-06-22 15:25:00 2022-06-22 15:55:00
23 2022-06-22 16:15:00 2022-06-22 16:25:00
24 2022-06-22 18:30:00 2022-06-22 18:55:00
25 2022-06-22 19:25:00 2022-06-22 19:35:00
26 2022-06-22 21:05:00 2022-06-22 21:15:00
27 2022-06-23 07:35:00 2022-06-23 07:45:00
28 2022-06-23 07:35:00 2022-06-23 07:45:00
29 2022-07-31 18:35:00 2022-07-31 18:45:00
30 2022-07-31 19:05:00 2022-07-31 19:15:00
31 2022-07-31 19:25:00 2022-07-31 19:35:00
32 2022-07-31 22:00:00 2022-07-31 22:00:00
33 2022-07-31 23:55:00 2022-08-01 00:05:00
34 2022-08-03 23:35:00 2022-08-03 23:45:00
35 2022-08-06 07:20:00 2022-08-06 07:20:00
36 2022-08-08 04:35:00 2022-08-08 04:40:00
37 2022-10-17 12:05:00 2022-10-17 12:15:00
38 2022-10-21 19:05:00 2022-10-21 19:15:00
39 2022-10-22 17:35:00 2022-10-22 17:45:00
40 2022-10-23 07:25:00 2022-10-23 07:35:00
41 2022-11-01 18:25:00 2022-11-01 18:45:00
42 2022-11-01 18:25:00 2022-11-01 18:35:00
43 2022-11-01 23:05:00 2022-11-01 23:15:00
44 2022-11-01 23:05:00 2022-11-01 23:25:00
45 2022-11-02 02:35:00 2022-11-02 03:25:00
46 2022-11-02 03:15:00 2022-11-02 03:25:00
47 2022-11-30 23:45:00 2022-11-30 23:55:00
48 2022-11-30 23:45:00 2022-11-30 23:55:00
49 2022-12-01 00:15:00 2022-12-01 00:35:00
50 2022-12-01 00:55:00 2022-12-01 01:05:00
51 2022-12-01 01:15:00 2022-12-01 01:25:00
52 2022-12-01 03:15:00 2022-12-01 03:25:00
53 2022-12-01 03:35:00 2022-12-01 03:45:00
54 2022-12-01 03:45:00 2022-12-01 03:55:00
55 2022-12-01 04:35:00 2022-12-01 05:15:00
56 2022-12-01 05:25:00 2022-12-01 05:35:00
57 2022-12-01 22:05:00 2022-12-01 22:15:00
58 2022-12-01 23:05:00 2022-12-01 23:15:00
59 2022-12-09 07:45:00 2022-12-09 07:55:00
60 2022-12-09 08:05:00 2022-12-09 08:15:00
61 2022-12-09 08:05:00 2022-12-09 08:15:00
62 2022-12-11 15:15:00 2022-12-11 15:35:00

其中部分事件存在重叠或间隔小于10分钟的情况,需要将这些事件合并为单个事件,生成相邻事件无重叠的新DataFrame。

我已通过以下代码识别出需要与下一个事件合并的时间窗口,但不知道如何执行实际的合并操作:

capsules["Gap to Next"] = -(capsules.End - capsules.Start.shift(-1)) / pd.Timedelta(minutes=1)
capsules["Merge with Next"] = capsules["Gap to Next"].abs() <= THRS_MERGE

合并事件的实现步骤

1. 确保时间列类型正确

如果Start和End列还不是datetime类型,先转换:

capsules['Start'] = pd.to_datetime(capsules['Start'])
capsules['End'] = pd.to_datetime(capsules['End'])

2. 创建分组标识

通过反转Merge with Next的逻辑,标记每个新分组的起始点,再通过累积求和生成分组ID:

# 当不需要合并时,标记为新分组的开始
capsules['Group'] = (~capsules['Merge with Next']).cumsum()

3. 按分组聚合得到合并结果

对每个分组取最小的Start时间和最大的End时间,即可得到合并后的事件:

merged_capsules = capsules.groupby('Group').agg(
    Start=('Start', 'min'),
    End=('End', 'max')
).reset_index(drop=True)

执行上述代码后,merged_capsules就是所有重叠或间隔小于10分钟的事件合并后的结果,相邻事件之间无重叠且间隔超过10分钟。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:24:53