如何合并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
相关产品推荐
相关产品推荐

