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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:36:20