基于前一行值分组连续事件:DataFrame数据处理需求
事件合并需求
现有存储事件的DataFrame,原始数据如下:
| start_event | end_event | |
|---|---|---|
| 1 | 2023-09-23 17:20 | 2023-09-23 17:40 |
| 2 | 2023-09-24 10:00 | 2023-09-24 10:20 |
| 3 | 2023-09-24 10:20 | 2023-09-24 10:40 |
| 4 | 2023-09-24 10:40 | 2023-09-24 11:00 |
| 5 | 2023-09-25 11:00 | 2023-09-25 11:20 |
| 6 | 2023-09-25 11:20 | 2023-09-25 11:40 |
已知每个事件的start_event与end_event间隔恒为20分钟,需将前一事件结束后立即启动的连续事件进行分组合并,合并后事件最长时长为1小时,单日可包含多个事件。期望得到的分组后数据如下:
| start_event | end_event | |
|---|---|---|
| 1 | 2023-09-23 17:20 | 2023-09-23 17:40 |
| 2 | 2023-09-24 10:00 | 2023-09-24 11:00 |
| 3 | 2023-09-25 11:00 | 2023-09-25 11:40 |
解决步骤(基于Pandas)
- 转换时间格式:确保时间列转为datetime类型,方便后续计算。
- 标记连续事件组:先识别非连续的分界点,再拆分出时长不超过1小时的子组(每个子组最多含3个20分钟事件)。
- 分组聚合:按最终分组键,取每组的起始时间和结束时间。
代码实现
import pandas as pd # 构造原始数据 data = { 'start_event': ['2023-09-23 17:20', '2023-09-24 10:00', '2023-09-24 10:20', '2023-09-24 10:40', '2023-09-25 11:00', '2023-09-25 11:20'], 'end_event': ['2023-09-23 17:40', '2023-09-24 10:20', '2023-09-24 10:40', '2023-09-24 11:00', '2023-09-25 11:20', '2023-09-25 11:40'] } df = pd.DataFrame(data) # 转换为datetime类型 df['start_event'] = pd.to_datetime(df['start_event']) df['end_event'] = pd.to_datetime(df['end_event']) # 标记连续事件组 df['is_break'] = df['start_event'] != df['end_event'].shift(1) df['group'] = df['is_break'].cumsum() # 拆分出不超过1小时的子组(3个20分钟事件为一组) df['sub_group'] = df.groupby('group').cumcount() // 3 df['final_group'] = df['group'].astype(str) + '_' + df['sub_group'].astype(str) # 聚合得到结果 result = df.groupby('final_group').agg( start_event=('start_event', 'first'), end_event=('end_event', 'last') ).reset_index(drop=True).reset_index(drop=False) result['index'] += 1 # 索引从1开始 print(result)
输出结果
index start_event end_event 0 1 2023-09-23 17:20:00 2023-09-23 17:40:00 1 2 2023-09-24 10:00:00 2023-09-24 11:00:00 2 3 2023-09-25 11:00:00 2023-09-25 11:40:00
内容的提问来源于stack exchange,提问作者GreatFilter
相关产品推荐
相关产品推荐

