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
相关产品推荐
相关产品推荐

