基于PROD事件时间戳对Pandas DataFrame重塑生成新事件
基于PROD事件时间区间生成关联子事件的Pandas实现
原始数据
import pandas as pd df = pd.DataFrame({ 'Start': ['2022-06-07 06:24:48','2022-06-07 14:37:16','2022-06-07 08:00:59', '2022-06-07 17:06:55','2022-06-07 06:02:41', '2022-06-07 13:03:17', '2022-06-07 05:02:01'], 'End': ['2022-06-07 14:07:00','2022-06-07 21:51:21','2022-06-07 13:18:34','2022-06-07 22:14:35','2022-06-07 10:56:35', '2022-06-07 17:20:08', '2022-06-07 23:32:42'], 'Process': ['PROD','PROD','VORG','VORG','NCPNA','NCPNA','STO'], 'Value': ['','','FAUF1','FAUF2','PROG1','PROG2','ERR1'], 'Duration Min': [462,434,318,308,294,257,1110] })
需求说明
基于Process=PROD的两个时间区间(2022-06-07 06:24:48至2022-06-07 14:07:00、2022-06-07 14:37:16至2022-06-07 21:51:21),对其他Process的事件,根据其时间与PROD区间的重叠关系(包含、交叉、覆盖),生成对应重叠部分的新事件,最终合并原始事件(标记为Orginal)和新生成的关联事件(标记为PROD),得到目标DataFrame。
事件时间关系示意:
- PROD区间1:[06:24-14:07],PROD区间2:[14:37-21:51]
- VORG事件1完全落在PROD区间1内,VORG事件2与PROD区间2交叉
- NCPNA事件1与PROD区间1交叉,NCPNA事件2与PROD两个区间分别交叉
- STO事件覆盖两个PROD区间,需拆分出两个PROD区间对应的子事件
实现代码
# 1. 转换时间列为datetime类型,便于时间计算 df['Start'] = pd.to_datetime(df['Start']) df['End'] = pd.to_datetime(df['End']) # 2. 提取所有PROD事件的时间区间 prod_intervals = df[df['Process'] == 'PROD'][['Start', 'End']].reset_index(drop=True) # 3. 遍历非PROD事件,生成与PROD区间重叠的子事件 prod_related_events = [] non_prod_events = df[df['Process'] != 'PROD'] # 逐个处理每个PROD区间 for _, prod_interval in prod_intervals.iterrows(): prod_start, prod_end = prod_interval['Start'], prod_interval['End'] # 逐个匹配非PROD事件 for _, np_event in non_prod_events.iterrows(): np_start, np_end = np_event['Start'], np_event['End'] # 计算重叠区间的起止时间 overlap_start = max(np_start, prod_start) overlap_end = min(np_end, prod_end) # 仅当重叠区间有效时生成新记录 if overlap_start < overlap_end: # 计算重叠区间的分钟数 duration_min = (overlap_end - overlap_start).total_seconds() // 60 # 复制原事件数据并更新时间和时长 new_event = np_event.copy() new_event['Start'] = overlap_start new_event['End'] = overlap_end new_event['Duration Min'] = duration_min prod_related_events.append(new_event) # 4. 转换为DataFrame并添加标记列 prod_related_df = pd.DataFrame(prod_related_events) prod_related_df['Marker'] = 'PROD' # 5. 给原始数据添加标记并合并结果 df['Marker'] = 'Orginal' final_df = pd.concat([df, prod_related_df], ignore_index=True) # 调整列顺序与目标输出一致 final_df = final_df[['Start', 'End', 'Process', 'Value', 'Duration Min', 'Marker']]
结果验证
运行代码后得到的final_df与目标输出完全匹配:
- 前7条为原始事件,标记为
Orginal - 后续为与PROD区间关联的子事件,标记为
PROD,时间区间为原事件与PROD区间的重叠部分,Duration Min为重叠区间的分钟数
内容的提问来源于stack exchange,提问作者phappy
相关产品推荐
相关产品推荐

