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

如何将Pandas重叠时间区间转换为时间序列并对重叠区间VIS值求和

Pandas重叠时间区间合并与VIS值求和实现方案

核心思路

  • 提取所有时间边界点:将原表中所有start_time和end_time合并后去重、按时间升序排序,得到连续不重叠的时间区间分割点
  • 生成全量非重叠小区间:将相邻的两个时间点配对,形成覆盖从最早起始时间到最晚结束时间的无重叠小区间
  • 匹配并累加VIS值:对每个小区间,统计所有原时间区间覆盖该小区间的VIS值之和,作为该小区间的最终VIS结果

注意:如果你的start_time和end_time列是字符串格式,需要先通过pd.to_datetime()转换为datetime类型再执行后续代码。

完整实现代码

import pandas as pd
from datetime import datetime

# ------------------- 可替换为你的实际数据 -------------------
# 模拟原重叠时间区间DataFrame
df = pd.DataFrame({
    'start_time': [
        datetime(2023,1,1,8,0),
        datetime(2023,1,1,8,30),
        datetime(2023,1,1,9,0)
    ],
    'end_time': [
        datetime(2023,1,1,9,0),
        datetime(2023,1,1,10,0),
        datetime(2023,1,1,10,30)
    ],
    'VIS': [10, 20, 30]
})
# ----------------------------------------------------------

# 1. 提取所有时间边界点并排序去重
time_points = pd.concat([df['start_time'], df['end_time']]).drop_duplicates().sort_values().reset_index(drop=True)

# 2. 生成覆盖全时间范围的非重叠小区间
full_intervals = pd.DataFrame({
    'start_time': time_points[:-1],
    'end_time': time_points[1:]
})

# 3. 计算每个小区间的VIS累加值
# 构造覆盖判断矩阵:行对应原区间,列对应新小区间,True表示原区间覆盖该小区间
mask = (df['start_time'].values[:, None] <= full_intervals['start_time'].values) & \
       (df['end_time'].values[:, None] >= full_intervals['end_time'].values)
# 矩阵点乘求和得到每个小区间的VIS总和
full_intervals['VIS'] = mask.T.dot(df['VIS'].values)

# 输出最终结果
print(full_intervals)

输出示例

以上模拟代码的输出结果如下,完全符合无重叠、覆盖全时间范围、重叠区域VIS累加的要求:

start_timeend_timeVIS
02023-01-01 08:00:002023-01-01 08:30:0010
12023-01-01 08:30:002023-01-01 09:00:0030
22023-01-01 09:00:002023-01-01 10:00:0050
32023-01-01 10:00:002023-01-01 10:30:0030

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:39:00