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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:33:04