Python日期相减报错:TypeError: unsupported operand type(s) for -: 'str' and 'datetime.datetime'
解决TypeError: unsupported operand type(s) for -: 'str' and 'datetime.datetime'
嘿,这个错误其实很好排查——你踩了一个新手常犯的小坑:把日期时间对象转成了字符串,却试图和原生datetime对象做减法运算!
问题根源分析
看你代码里的这行:
now = datetime.date.today().strftime('%Y-%m-%d %H:%M:%S')
datetime.date.today()返回的是一个date对象,你用strftime()把它转换成了字符串类型。而后面的date变量是通过datetime.strptime()得到的datetime.datetime对象,字符串和datetime类型根本不支持减法操作,这就是报错的核心原因。
修正方案:保持日期时间对象的原生类型
我们需要让now和date保持同类型(都是datetime或date对象),这样才能正常计算差值。这里分两种场景给你调整代码:
场景1:需要包含时分秒的精确时间差
from datetime import datetime, timedelta def activity_breakup(): # 直接获取当前完整的datetime对象,不要转字符串 now = datetime.now() # 如果要打印,再转成字符串格式输出 print("now is equal to {}".format(now.strftime('%Y-%m-%d %H:%M:%S'))) for activity in convert_csv_to_list()[1:]: # 将CSV中的日期字符串转成datetime对象 date = datetime.strptime(activity[2], '%m/%d/%Y') print("date is equal to {}".format(date.strftime('%Y-%m-%d'))) # 计算时间差,得到timedelta对象 time_diff = now - date # 判断是否为当天(天数差为0) if time_diff.days == 0: print("This activity is today!") # 判断是否在未来7天内(注意:如果date是过去的日期,差值会是负数,可根据需求调整逻辑) elif 0 <= time_diff.days <= 7: print("This activity is within the next 7 days!")
场景2:只需要日期差值(忽略时分秒)
如果你的场景不需要精确到时分秒,只关心日期差,可以统一转成date对象,逻辑更简洁:
from datetime import datetime, timedelta def activity_breakup(): # 获取当前日期对象 now = datetime.now().date() print("now is equal to {}".format(now.strftime('%Y-%m-%d'))) for activity in convert_csv_to_list()[1:]: # 将CSV日期转成date对象 date = datetime.strptime(activity[2], '%m/%d/%Y').date() print("date is equal to {}".format(date)) # 计算日期差 day_diff = (now - date).days if day_diff == 0: print("Today's activity!") elif 0 <= day_diff <=7: print("Activity in the next 7 days!")
关键知识点提醒
datetime和date对象相减会得到timedelta对象,它包含days、seconds等属性,可以直接用来判断时间差。- 如果你只需要比较日期,用
date对象更简洁;需要精确时间就用datetime对象。 - 务必保证
strptime的格式字符串(比如'%m/%d/%Y')和你CSV中日期的实际格式完全匹配,不然会触发ValueError。
内容的提问来源于stack exchange,提问作者Neemaximo
相关产品推荐
相关产品推荐

