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

Python datetime类型相减报错及CSV场站内移动耗时计算问题

问题原因

  • 类型转换错误:datetime.strptime()本身返回的就是datetime.datetime类型,但你在外层套了date()方法,将其转为了datetime.date类型,如果你需要计算精确到时分秒的任务耗时,这步转换是多余的,还会丢失时分秒信息。
  • 初始值设置错误:你将start_time和stop_time的初始值设为字符串'0',在首次匹配到有效时间之前,执行减法运算时实际是字符串相减,自然会报错。
  • 逻辑时序错误:你在遍历每一行CSV数据时都会执行打印差值的操作,但只有同一拖车的开始、结束事件都被成功匹配后,才能得到有效的耗时结果,否则要么是无效初始值,要么是上一个任务的旧时间数据,结果完全不符合预期。且原有逻辑的事件匹配顺序是反的,任务必然是先触发开始事件,再触发结束事件。

修正方案

import csv
from datetime import datetime

start_time = None
stop_time = None
trailer = None

# 用with语句管理文件对象,执行完自动关闭避免资源泄漏
with open('move_times.csv', 'r', encoding='utf-8') as t_time:
    t_time_reader = csv.reader(t_time, delimiter=',')
    for row in t_time_reader:
        event_type = row[2]
        current_trailer = row[11]
        # 先匹配开始事件,记录对应拖车的开始时间
        if event_type == 'HOSTLER_START':
            start_time = datetime.strptime(row[4], '%Y-%m-%d %H:%M:%S')
            trailer = current_trailer
        # 再匹配同一拖车的结束事件,计算耗时
        elif event_type == 'HOSTLER_COMPLETE' and current_trailer == trailer:
            stop_time = datetime.strptime(row[4], '%Y-%m-%d %H:%M:%S')
            if start_time and stop_time:
                print(f"拖车{trailer}任务耗时:{stop_time - start_time}")
                # 计算完成重置状态,避免影响下一个任务匹配
                start_time = None
                stop_time = None
                trailer = None

额外说明

用strptime处理时间字符串是完全正确的方案,只要你传入的格式字符串和CSV里的时间格式完全匹配即可。两个同类型的datetime对象、date对象都是支持减法运算的,返回的是timedelta类型的时间差对象,你之前报错本质是参与运算的变量不是同类型的有效时间对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:15:02