如何移除早于前一事件结束时间的重叠事件及代码调试
解决时间重叠事件过滤问题
需求说明
生成无重复、无时间重叠的事件列表,要求同一timename分组内,下一个事件的开始时间不早于前一事件的结束时间。已将日期时间转换为儒略日,数据示例如下:
转换前数据
timename starttime endtime 1 20170103 2017/01/03T05:36:05 2017/01/03T13:42:04 2 20170103 2017/01/03T14:00:04 2017/01/03T20:30:07 3 20170112 2017/01/12T16:24:05 2017/01/12T23:42:05 4 20170114 2017/01/14T05:00:05 2017/01/14T09:42:06 5 20170114 2017/01/14T08:24:05 2017/01/14T14:18:05 ...
转换后数据
timename starttime endtime 1 2457756.5 2457756.733391204 2457757.07087963 2 2457756.5 2457757.0833796295 2457757.354247685 3 2457765.5 2457766.1833912036 2457766.4875578703 4 2457767.5 2457767.7083912035 2457767.9042361113 5 2457767.5 2457767.85005787 2457768.0958912037 ...
例如第5行事件的开始时间早于第4行的结束时间,属于重叠事件,需要移除。
原代码问题分析
你提供的代码存在以下核心问题:
- 嵌套循环逻辑完全错误:仅判断了
i<j的事件顺序,但没有处理重叠事件的移除逻辑,反而直接写入整个DataFrame - 使用
df.to_string()输出全部数据,导致无论条件如何,最终输出都和输入一致 - 未按
timename分组处理,无法针对同一天的事件做重叠过滤
正确解决方案
以下是实现需求的Python Pandas代码:
import pandas as pd infilename2 = 'D:/My works/C3_jdate/2017.txt' outfilename2 = 'D:/My works/2017_1.txt' # 读取输入数据 df = pd.read_csv(infilename2, sep='\t', engine='python', header=0) # 按timename分组,每组内按starttime升序排序,确保事件按时间顺序排列 df_sorted = df.sort_values(by=['timename', 'starttime']) # 存储过滤后的有效事件 filtered_rows = [] last_end_time = None current_timename = None # 遍历排序后的每行数据 for _, row in df_sorted.iterrows(): # 切换分组时重置上一个事件的结束时间 if row['timename'] != current_timename: current_timename = row['timename'] last_end_time = None # 第一个事件直接保留,或当前事件开始时间不早于上一个事件结束时间则保留 if last_end_time is None or row['starttime'] >= last_end_time: filtered_rows.append(row) last_end_time = row['endtime'] # 转换为DataFrame并输出到文件 filtered_df = pd.DataFrame(filtered_rows) filtered_df.to_csv(outfilename2, sep='\t', index=False)
代码说明
- 排序分组:先按
timename分组,每组内按starttime排序,确保同一组内事件按时间先后排列 - 过滤逻辑:遍历每行数据,维护当前组的上一个事件结束时间,仅保留不重叠的事件
- 输出结果:将过滤后的事件写入目标文件,确保输出无重叠、符合要求的事件列表
内容的提问来源于stack exchange,提问作者Khojiakbar Karimov
相关产品推荐
相关产品推荐

