如何按时间顺序合并两个含Duration与Event列的DataFrame?
按时间顺序合并事件序列DataFrame并生成状态追踪
问题背景
我有两个结构一致的DataFrame,都包含以下两列:
Duration:浮点数类型的事件持续时长(单位:小时),范围从0.007到数千小时,事件间隔完全不均匀Event:仅取0或1,0代表故障状态,1代表成功状态,每当Event值变化时就会触发新事件
需要把这两个DataFrame里的所有事件按全局时间轴的先后顺序合并,最终生成包含Duration、Event和连续编号State列的结果。
示例数据
DataFrame 1
| Duration | Event |
|---|---|
| 0.06 | 0 |
| 2340 | 1 |
| 145 | 0 |
DataFrame 2
| Duration | Event |
|---|---|
| 9 | 1 |
| 1200 | 0 |
| 124 | 1 |
预期输出
| Duration | Event | State |
|---|---|---|
| 0.06 | 0 | State 0 |
| 2340 | 1 | State 1 |
| 9 | 1 | State 2 |
| 1200 | 0 | State 3 |
| 124 | 1 | State 4 |
| 145 | 0 | State 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)
代码说明
convert_to_intervals函数:把每个事件的Duration转换成从0开始的时间区间,方便后续按全局时间轴对齐- 合并与排序时间点:收集所有事件的开始/结束时间,排序后得到全局时间轴的所有节点
- 生成事件片段:遍历相邻时间节点,计算片段时长,匹配对应时间段的Event值
- 生成State列:用片段的索引生成连续的状态编号
运行代码后会输出与示例完全一致的结果,也能适配任意时长范围的事件数据。
内容的提问来源于stack exchange,提问作者Giorgos
相关产品推荐
相关产品推荐

