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

如何按时间顺序合并两个含Duration与Event列的DataFrame?

按时间顺序合并事件序列DataFrame并生成状态追踪

问题背景

我有两个结构一致的DataFrame,都包含以下两列:

  • Duration:浮点数类型的事件持续时长(单位:小时),范围从0.007到数千小时,事件间隔完全不均匀
  • Event:仅取0或1,0代表故障状态,1代表成功状态,每当Event值变化时就会触发新事件

需要把这两个DataFrame里的所有事件按全局时间轴的先后顺序合并,最终生成包含Duration、Event和连续编号State列的结果。

示例数据

DataFrame 1

DurationEvent
0.060
23401
1450

DataFrame 2

DurationEvent
91
12000
1241

预期输出

DurationEventState
0.060State 0
23401State 1
91State 2
12000State 3
1241State 4
1450State 5

解决方案

核心思路是先把每个DataFrame的Duration转换成时间区间(开始/结束时间),再收集所有时间节点排序,生成连续的事件片段,最后匹配对应Event并计算时长。

代码实现

import pandas as pd

# 初始化示例数据
df1 = pd.DataFrame({'Duration': [0.06, 2340, 145], 'Event': [0, 1, 0]})
df2 = pd.DataFrame({'Duration': [9, 1200, 124], 'Event': [1, 0, 1]})

def convert_to_intervals(df):
    # 计算每个事件的起始时间(累计前序时长)
    df['start_time'] = df['Duration'].cumsum().shift(fill_value=0)
    # 计算事件的结束时间
    df['end_time'] = df['start_time'] + df['Duration']
    return df[['start_time', 'end_time', 'Event']]

# 处理两个DataFrame,转换为时间区间格式
df1_intervals = convert_to_intervals(df1)
df2_intervals = convert_to_intervals(df2)

# 合并所有事件区间
all_events = pd.concat([df1_intervals, df2_intervals])

# 提取所有关键时间点并排序
all_time_points = sorted(all_events['start_time'].tolist() + all_events['end_time'].tolist())

# 生成连续的事件片段
final_segments = []
for idx in range(len(all_time_points) - 1):
    current_start = all_time_points[idx]
    current_end = all_time_points[idx + 1]
    # 找到覆盖当前时间段的事件(时间轴无重叠,取第一个匹配项即可)
    matched_event = all_events[
        (all_events['start_time'] <= current_start) & 
        (all_events['end_time'] >= current_end)
    ]['Event'].iloc[0]
    final_segments.append({
        'Duration': round(current_end - current_start, 3),  # 保留三位小数对齐示例
        'Event': matched_event
    })

# 转换为结果DataFrame并生成State列
result_df = pd.DataFrame(final_segments)
result_df['State'] = result_df.index.map(lambda x: f'State {x}')

print(result_df)

代码说明

  1. convert_to_intervals函数:把每个事件的Duration转换成从0开始的时间区间,方便后续按全局时间轴对齐
  2. 合并与排序时间点:收集所有事件的开始/结束时间,排序后得到全局时间轴的所有节点
  3. 生成事件片段:遍历相邻时间节点,计算片段时长,匹配对应时间段的Event值
  4. 生成State列:用片段的索引生成连续的状态编号

运行代码后会输出与示例完全一致的结果,也能适配任意时长范围的事件数据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:35:19