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

基于CSV列值提取数据,计算同一ID首次进出时间差

问题与解决方案:提取ID首次进出时间并计算时间差

需求说明

现有CSV文件包含三列数据:

  1. 第一列:Entry/Exit(进出标识)
  2. 第二列:ID(唯一标识)
  3. 第三列:时间(数值格式)

需要实现:

  • 提取每个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}")

代码逻辑说明

  1. 字典初始化:用id_times字典存储每个ID的首次Entry和Exit时间,结构为{ID: {'first_entry': 时间值, 'first_exit': 时间值}}
  2. 数据清洗:分割每行数据后去除字段多余空格,跳过格式错误或时间转换失败的行
  3. 首次时间记录:仅当ID对应的Entry/Exit时间未被记录时,才更新为当前行的时间,确保只保留首次出现的时间
  4. 时间差计算:遍历字典,仅对同时有Entry和Exit记录的ID计算时间差,保留两位小数后输出

运行上述代码后,会输出:

25, 15.20
35, 50.00

内容的提问来源于stack exchange,提问作者Sona S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:20:26