如何合并Pandas DataFrame重叠时间区间、统计合并次数并筛选跨机高频区间
重叠时间区间合并与筛选实现方案
实现思路
通过扫描线算法处理所有时间区间的起止事件,实时统计当前重叠区间的得分总和与覆盖机器数,最终筛选出跨机器重叠次数最多的区间:
- 将每个时间区间拆分为「起点+得分+新增机器」、「终点-得分-移除机器」两个事件
- 所有事件按时间戳排序后逐个扫描,相邻两个时间点之间的区间状态稳定,可直接记录统计值
- 最后过滤无效空区间,筛选出覆盖机器数最多的结果
完整实现代码
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'start': [1631816145, 1631817088, 1631819637, 1631816844, 1631817073, 1631818103], 'end': [1631816312, 1631817228, 1631819844, 1631817030, 1631817225, 1631818261], 'score': [0.5, 0.6, 0.2, 0.7, 0.4, 0.7], 'machine': [1, 1, 1, 2, 2, 2] }) # 生成扫描事件列表 events = [] for _, row in df.iterrows(): events.append((row['start'], 1, row['score'], row['machine'])) events.append((row['end'], -1, -row['score'], row['machine'])) # 按时间戳排序事件 events.sort(key=lambda x: x[0]) # 扫描事件生成合并区间 merged_intervals = [] current_total_score = 0 current_cover_machines = set() last_time = None for curr_time, event_type, score_delta, machine_id in events: if last_time is not None and curr_time > last_time and len(current_cover_machines) > 0: merged_intervals.append({ "start": last_time, "end": curr_time, "total_score": current_total_score, "count": len(current_cover_machines) }) # 更新当前状态 current_total_score += score_delta if event_type == 1: current_cover_machines.add(machine_id) else: current_cover_machines.discard(machine_id) last_time = curr_time # 转换为DataFrame merged_df = pd.DataFrame(merged_intervals) # 筛选覆盖机器数最多的区间 max_cover_count = merged_df['count'].max() target_intervals = merged_df[merged_df['count'] == max_cover_count] print("覆盖最多机器的重叠区间:") print(target_intervals)
结果说明
运行上述代码后,输出的target_intervals就是目标区间,其中:
total_score是该区间所有覆盖的原始区间score叠加值count是覆盖该区间的机器总数,也就是合并的原始区间数量
内容的提问来源于stack exchange,提问作者siaabd001
相关产品推荐
相关产品推荐

