基于CSV列值提取数据,计算同一ID首次进出时间差
问题与解决方案:提取ID首次进出时间并计算时间差
需求说明
现有CSV文件包含三列数据:
- 第一列:Entry/Exit(进出标识)
- 第二列:ID(唯一标识)
- 第三列:时间(数值格式)
需要实现:
- 提取每个ID的首次Entry时间
- 提取每个ID的首次Exit时间
- 计算并输出每个ID的「首次Exit时间 - 首次Entry时间」的差值
CSV数据示例:
Entry,25, 10.05 Entry,25, 15.25 Entry,25, 20.25 Exit, 25, 25.25 Entry, 35, 30.20 Entry, 35, 70.25 Exit, 35, 80.20 Exit, 35, 90.20
用户现有代码(不符合需求,需修改):
with open('datapipe.csv') as f: next(f) #- If header needs to be skipped. for line in f: en, id, value = line.rsplit(',', maxsplit=2) d[id] = d.get(id, 0) + float(value) for k, v in d.items(): print(f"{k}, {v}")
修改后的解决方案代码
# 初始化字典,存储每个ID的首次Entry和首次Exit时间 id_times = {} with open('datapipe.csv', 'r') as f: # 如果CSV有表头,取消下面一行的注释跳过表头 # next(f) for line in f: # 分割行数据并去除每个字段的多余空格 parts = [p.strip() for p in line.strip().split(',')] if len(parts) != 3: continue # 跳过格式错误的行 entry_exit, id_str, time_str = parts try: time_val = float(time_str) except ValueError: continue # 跳过时间格式错误的行 # 确保ID作为字符串统一存储(避免数字/字符串类型问题) if id_str not in id_times: id_times[id_str] = {'first_entry': None, 'first_exit': None} # 记录首次Entry时间(仅当未记录过时更新) if entry_exit == 'Entry' and id_times[id_str]['first_entry'] is None: id_times[id_str]['first_entry'] = time_val # 记录首次Exit时间(仅当未记录过时更新) elif entry_exit == 'Exit' and id_times[id_str]['first_exit'] is None: id_times[id_str]['first_exit'] = time_val # 遍历计算并输出结果 for id_str, times in id_times.items(): entry_time = times['first_entry'] exit_time = times['first_exit'] # 仅输出同时有Entry和Exit记录的ID if entry_time is not None and exit_time is not None: time_diff = exit_time - entry_time # 保留两位小数,和示例格式一致 print(f"{id_str}, {time_diff:.2f}")
代码逻辑说明
- 字典初始化:用
id_times字典存储每个ID的首次Entry和Exit时间,结构为{ID: {'first_entry': 时间值, 'first_exit': 时间值}} - 数据清洗:分割每行数据后去除字段多余空格,跳过格式错误或时间转换失败的行
- 首次时间记录:仅当ID对应的Entry/Exit时间未被记录时,才更新为当前行的时间,确保只保留首次出现的时间
- 时间差计算:遍历字典,仅对同时有Entry和Exit记录的ID计算时间差,保留两位小数后输出
运行上述代码后,会输出:
25, 15.20 35, 50.00
内容的提问来源于stack exchange,提问作者Sona S
相关产品推荐
相关产品推荐

