如何不使用Pandas合并CSV文件中的重叠时间区间?
解决CSV时间区间合并问题
首先看你代码里的几个明显问题:
- 变量名错误:你定义了
name = row["Tasks"],但后面用dict[tasks],tasks是未定义的变量,应该替换成name - 数据结构设计错误:直接赋值
dict[name] = [start_time, end_time]会覆盖同一任务的上一个区间,应该把每个任务对应的所有时间区间收集成列表 - 表头匹配错误:你的样本CSV表头是中文的"任务"、"开始时间"、"结束时间",原代码用的英文表头会导致读取失败
下面是完整的实现代码,仅用csv模块完成需求:
import csv def merge_intervals(intervals): # 按开始时间排序区间 sorted_intervals = sorted(intervals, key=lambda x: x[0]) if not sorted_intervals: return [] merged = [list(sorted_intervals[0])] for current_start, current_end in sorted_intervals[1:]: last_start, last_end = merged[-1] # 判断当前区间是否和最后一个合并区间重叠或相邻 if current_start <= last_end: # 合并区间,更新结束时间为较大值 merged[-1][1] = max(last_end, current_end) else: merged.append([current_start, current_end]) return merged # 读取CSV并按任务分组 task_intervals = {} with open('sample.csv', mode='r', encoding='utf-8') as csv_file: csv_reader = csv.DictReader(csv_file) for row in csv_reader: task_name = row["任务"] start = row["开始时间"] end = row["结束时间"] # 收集同一任务的所有区间,自动初始化列表 task_intervals.setdefault(task_name, []).append((start, end)) # 处理每个任务的区间并输出结果 for task, intervals in task_intervals.items(): merged = merge_intervals(intervals) # 格式化为期望的字符串格式 interval_strs = [f"[{s},{e}]" for s, e in merged] print(f"{task} - {', '.join(interval_strs)}")
代码说明:
- 分组收集区间:用
dict.setdefault()方法自动为每个任务创建区间列表,避免覆盖已有数据 - 区间合并逻辑:
- 先把区间按开始时间排序,确保后续比较顺序正确
- 遍历排序后的区间,逐个和已合并的最后一个区间对比,重叠则更新结束时间,否则新增区间
- 输出格式化:将合并后的区间转换成
[开始,结束]的格式,拼接成目标输出字符串
运行代码后,输出结果如下:
阅读 - [10:00,13:00], [13:50,14:00] 写作 - [11:00,15:00]
(注:你的期望输出中写作的区间为[14:00,15:00],但根据样本数据的11:00-15:00和14:00-14:30,合并后正确结果应为[11:00,15:00])
内容的提问来源于stack exchange,提问作者Rishabh
相关产品推荐
相关产品推荐

