You need to enable JavaScript to run this app. Pandas实现最高值优先的无重叠datetime区间拆分优化方案
优惠活动
大模型
产品
解决方案
定价
更多

Pandas实现最高值优先的无重叠datetime区间拆分优化方案

区间重叠处理需求与现有实现

数据场景

现有pandas DataFrame,每行存储一组带起始时间、结束时间、关联值的datetime区间,典型输入样例如下:

id   start          end            value
1    08:00:00.000   12:00:00.000   5
2    09:00:00.000   10:00:00.000   6
2    10:00:00.000   14:00:00.000   4
1    12:00:00.000   15:00:00.000   3

期望输出

生成连续无重叠的时间区间序列,重叠时段优先保留关联值最高的区间记录,结果样例如下:

id   start          end            value 
1    08:00:00.000   09:00:00.000   5
2    09:00:00.000   10:00:00.000   6
1    10:00:00.000   12:00:00.000   5
2    12:00:00.000   14:00:00.000   4
1    14:00:00.000   15:00:00.000   3

优化方向

当前嵌套循环逐行识别重叠、切分区间的方案性能较差,计划替换为向量化逻辑:

  • 提取所有区间的首尾时间点作为全局切分边界
  • 基于边界将全量时间轴切分为无重叠的原子小区间
  • 逐段匹配覆盖该小区间的原始区间,筛选关联值最高的记录作为最终输出

现有循环实现代码

done = True

while done:
    done = False
    df_copy = df
    for i, row in df.iterrows():
        row_interval = pd.Interval(row.start, row.end)
        if done:
            break
        for j, row_copy in row_copy.iterrows():
            row_copy_interval = pd.Interval(row_copy.start, row_copy.end)
            if i is not j and row_interval.overlaps(row_copy_interval):
                earliest_start = np.minimum(row.start, row_copy.start)
                latest_start = np.maximum(row.start, row_copy.start)
                earliest_end = np.minimum(row.end, row_copy.end)
                latest_end = np.maximum(row.end, row_copy.end)

                if row.value > row_copy.value:
                    value = row.value
                else:
                    value = row_copy.value

                if row_interval == pd.Interval(earliest_start, earliest_end):
                    df = df.append('value': row.value, 'start': earliest_start,'end': latest_start}, ignore_index=True)
                    df = df.append('value': value, 'start': latest_start,'end': earliest_end}, ignore_index=True)
                    df = df.append('value': row_copy.value, 'start': earliest_end,'end': latest_end}, ignore_index=True)
                elif row_interval == pd.Interval(earliest_start, latest_end):
                    # 其他重叠分支处理逻辑
                    ...
                elif row_interval == pd.Interval(latest_start, latest_end):
                    # 其他重叠分支处理逻辑
                    ...
                elif row_interval == pd.Interval(latest_start, earliest_end):
                    # 其他重叠分支处理逻辑
                    ...

                df = df.drop([i, j]).drop_duplicates()
                done = True
                break

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 03:36:07