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

如何合并任意链式重叠的时间范围?

合并链式重叠时间范围的解决方案

核心处理逻辑

要搞定任意形式的重叠(包括直接重叠、链式重叠、包含关系),最直接的方法是先排序再顺序合并:

  • 把所有事件按开始时间戳从小到大排序,确保可以按顺序处理每个事件
  • 用一个列表存储合并后的结果,遍历每个事件时和列表最后一个合并好的事件对比:
    • 如果当前事件的开始时间在最后一个合并事件的时间范围内(或刚好衔接),就把两个事件合并成一个新事件:开始时间取两者最小值,结束时间取两者最大值
    • 如果完全不重叠,就直接把当前事件加入结果列表

Python代码实现(结合CSV数据)

假设你的CSV文件包含start_timestamp和end_timestamp两列,代码如下:

import pandas as pd

def merge_overlapping_events(df):
    # 按开始时间排序,这是合并的前提
    sorted_events = df.sort_values('start_timestamp').reset_index(drop=True)
    merged_results = []
    
    for _, event in sorted_events.iterrows():
        curr_start = event['start_timestamp']
        curr_end = event['end_timestamp']
        
        if not merged_results:
            merged_results.append({'start': curr_start, 'end': curr_end})
        else:
            last_merged = merged_results[-1]
            # 判断是否重叠或可以链式合并
            if curr_start <= last_merged['end']:
                # 更新合并事件的结束时间为两者的最大值
                last_merged['end'] = max(last_merged['end'], curr_end)
            else:
                merged_results.append({'start': curr_start, 'end': curr_end})
    
    return pd.DataFrame(merged_results)

# 读取原始CSV数据并执行合并
raw_events = pd.read_csv('events_data.csv')
merged_events = merge_overlapping_events(raw_events)
print(merged_events)

各种场景的处理效果

  • 多事件直接重叠:排序后第一个事件会和所有后续重叠的事件依次合并,最终生成一个覆盖所有重叠范围的事件
  • 链式重叠(事件1→事件2→事件3):事件1和事件2合并后,新的事件会继续和事件3合并,最终得到一个连续的完整时间范围
  • 事件被完全包含:排序后包含性事件的结束时间不会被改变,被包含的事件会直接被合并进去,不会单独保留
  • 无重叠事件:这类事件会直接被保留在结果列表中,不会被修改

可视化验证(用Plotly)

可以用你提供的Plotly函数对比原始事件和合并后的结果,确保合并正确:

import plotly.express as px

def visualize_events(raw_df, merged_df):
    # 给两类事件添加标识
    raw_df['事件类型'] = '原始事件'
    merged_df['事件类型'] = '合并后事件'
    
    # 统一列名并合并数据
    plot_data = pd.concat([
        raw_df.rename(columns={'start_timestamp':'start', 'end_timestamp':'end'}),
        merged_df
    ])
    
    # 生成时间线图
    fig = px.timeline(plot_data, x_start='start', x_end='end', y='事件类型', color='事件类型')
    fig.update_layout(title='原始事件与合并后事件对比')
    fig.show()

# 调用可视化函数
visualize_events(raw_events, merged_events)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:25:23