使用dateutil.relativedelta计算时间差输出始终为0是什么原因?
问题原因
- 核心错误1:代码中
t1和t2的解析逻辑完全相同,都取了每行拆分后的前两个元素(即每行的第一个日期时间),两个变量存储的是完全相同的时间,差值自然为0。 - 逻辑问题2:
dateutil.relativedelta的seconds属性仅返回差值的秒数部分,不是两个时间的总秒差,跨天/跨年的差值会分别存储在days、years等独立属性中,不会被统计到seconds里。 - 参数顺序问题:
relativedelta的参数顺序为relativedelta(较晚时间, 较早时间),顺序写反会得到负的差值。
修复方案
根据需求选择以下两种方案即可:
方案1:需要获取按年/月/日/时/分/秒拆分的差值
修正时间解析逻辑,正确读取每行的第二个日期时间,示例代码如下:
import dateutil.relativedelta, datetime with open("data", "r") as f: for line in f: parts = line.strip().split() # 正确解析两个时间 t1 = datetime.datetime.strptime(f"{parts[0]} {parts[1]}", "%m/%d/%Y %H:%M:%S") t2 = datetime.datetime.strptime(f"{parts[2]} {parts[3]}", "%m/%d/%Y %H:%M:%S") rd = dateutil.relativedelta.relativedelta(t2, t1) # 示例输出完整差值,可按需取对应属性 print(f"相差{rd.years}年{rd.months}月{rd.days}天{rd.hours}时{rd.minutes}分{rd.seconds}秒")
方案2:需要获取两个时间的总秒差值
直接用datetime对象相减得到timedelta,调用total_seconds()方法即可,无需引入relativedelta,示例代码如下:
import datetime with open("data", "r") as f: for line in f: parts = line.strip().split() t1 = datetime.datetime.strptime(f"{parts[0]} {parts[1]}", "%m/%d/%Y %H:%M:%S") t2 = datetime.datetime.strptime(f"{parts[2]} {parts[3]}", "%m/%d/%Y %H:%M:%S") diff_seconds = (t2 - t1).total_seconds() print(diff_seconds)
内容的提问来源于stack exchange,提问作者idiot one
相关产品推荐
相关产品推荐

