如何用Python解析CSV文件:计算平均耗时、找最长耗时及合并时间区间
解决方案代码与说明
以下是针对三个需求的完整实现代码,匹配你提供的CSV结构和数据:
import datetime import csv from collections import defaultdict # 读取CSV并按姓名分组存储时间区间 person_intervals = defaultdict(list) with open('people.csv', 'r', encoding='utf-8') as file: reader = csv.DictReader(file) for row in reader: name = row['姓名(Name)'] # 转换时间字符串为datetime对象(统一日期不影响时间差计算) start = datetime.datetime.strptime(row['开始时间(Start)'], "%H:%M") end = datetime.datetime.strptime(row['结束时间(End)'], "%H:%M") person_intervals[name].append((start, end)) # 需求1:计算每个人的平均耗时 print("不同人员的平均耗时:") for name, intervals in person_intervals.items(): durations = [] total = 0 for start, end in intervals: mins = int((end - start).total_seconds() // 60) durations.append(str(mins)) total += mins count = len(durations) print(f"{name} ({'+'.join(durations)})/{count} 分钟") # 需求2:找出总耗时最长的人员 total_durations = {name: sum(int((end - start).total_seconds() // 60) for start, end in intervals) for name, intervals in person_intervals.items()} max_name = max(total_durations, key=total_durations.get) print(f"\n总耗时最长的人员:{max_name}(总耗时{total_durations[max_name]}分钟)") # 需求3:合并同一人员的时间区间 def merge_intervals(intervals): # 按开始时间排序 sorted_intervals = sorted(intervals, key=lambda x: x[0]) merged = [] for interval in sorted_intervals: if not merged: merged.append(interval) else: last_start, last_end = merged[-1] curr_start, curr_end = interval # 重叠或连续则合并 if curr_start <= last_end: merged[-1] = (last_start, max(last_end, curr_end)) else: merged.append(interval) # 转换为字符串格式 return [f"[{s.strftime('%H:%M')},{e.strftime('%H:%M')}]" for s, e in merged] print("\n合并后的时间区间:") for name, intervals in person_intervals.items(): merged_str = ','.join(merge_intervals(intervals)) print(f"{name}: {merged_str}")
代码说明
- 数据分组读取:用
defaultdict自动按姓名分组存储时间区间,解决了你无法按人名解析对应行的问题。 - 平均耗时计算:遍历每个姓名的所有时间区间,计算单个区间的分钟数,收集后按你要求的格式输出,同时统计总时长和区间数量。
- 总耗时最长人员:通过字典推导式快速计算每个人的总耗时,用
max函数直接定位总耗时最长的姓名。 - 时间区间合并:先对区间按开始时间排序,再逐个判断是否与已合并区间重叠,重叠则合并为更大的区间,最终转换为你需要的字符串格式输出。
示例输出
运行代码后,针对你提供的CSV数据,输出如下:
不同人员的平均耗时: John (60+50+60+10)/4 分钟 Tom (70)/1 分钟 Jerry (30+240)/2 分钟 Alice (60)/1 分钟 总耗时最长的人员:Jerry(总耗时270分钟) 合并后的时间区间: John: [12:00,13:20],[13:50,14:00] Tom: [12:00,13:10] Jerry: [11:00,15:00] Alice: [15:00,16:00]
内容的提问来源于stack exchange,提问作者Bk thomas
相关产品推荐
相关产品推荐

