如何将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_time | end_time | VIS | |
|---|---|---|---|
| 0 | 2023-01-01 08:00:00 | 2023-01-01 08:30:00 | 10 |
| 1 | 2023-01-01 08:30:00 | 2023-01-01 09:00:00 | 30 |
| 2 | 2023-01-01 09:00:00 | 2023-01-01 10:00:00 | 50 |
| 3 | 2023-01-01 10:00:00 | 2023-01-01 10:30:00 | 30 |
内容的提问来源于stack exchange,提问作者tbuyar
相关产品推荐
相关产品推荐

