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

如何不使用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)}")

代码说明:

  1. 分组收集区间:用dict.setdefault()方法自动为每个任务创建区间列表,避免覆盖已有数据
  2. 区间合并逻辑:
    • 先把区间按开始时间排序,确保后续比较顺序正确
    • 遍历排序后的区间,逐个和已合并的最后一个区间对比,重叠则更新结束时间,否则新增区间
  3. 输出格式化:将合并后的区间转换成[开始,结束]的格式,拼接成目标输出字符串

运行代码后,输出结果如下:

阅读 - [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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:39:25