【问题标题】:can't compare datetime.datetime to datetime.date无法将 datetime.datetime 与 datetime.date 进行比较
【发布时间】:2011-08-30 06:08:14
【问题描述】:

我有以下代码并且收到上述错误。由于我是 python 新手,因此无法理解此处的语法以及如何修复错误:

if not start or date < start: start = date

【问题讨论】:

  • 请提供更多代码,以便我们查看所涉及的数据类型。在比较之前,您很可能需要将 datetime.date 转换为 datetime.datetime。
  • Comparing dates in Python 的可能重复项
  • 这里的语法是什么?以及如何将 datetime.datetime 转换为 datetime.date 或反之亦然?
  • 我认为python抛出这样一个异常是愚蠢的——为什么不允许将日期时间与日期进行比较?

标签: python


【解决方案1】:

有一个datetime.date() 方法可以将日期时间转换为日期。

做相反的转换,你可以使用这个函数datetime.datetime(d.year, d.month, d.day)

【讨论】:

    【解决方案2】:

    您可以使用datetime.datetime.combine 方法将日期对象与日期时间对象进行比较,然后将转换后的对象与另一个日期时间对象进行比较。

    import datetime
    
    dt1 = datetime.datetime(2011, 03, 03, 11, 12)
    day = datetime.date(2011, 03, 02)
    dt2 = datetime.datetime.combine(day, datetime.time(0, 0))
    
    print dt1 > dt2
    

    【讨论】:

    • 显然,在较新版本的 Python 中,由于此错误,您无法使用零:SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers
    【解决方案3】:

    假设开始是一个日期时间,像这样使用它:

    if not start or date < start.date(): start = date
    

    认为没有必要在 python 中将日期转换为日期时间,因为您可以做相反的事情并进行比较。

    否则,您还有其他方法可以通过使用要转换的日期和 00:00 的时间来创建新的日期时间。

    【讨论】:

    • 我在比较DateFielddatetime.now() 时遇到了同样的错误,我通过简单地在末尾添加.date() 来修复它,如下所示:datetime.now().date() 这是一个非常好的,而不是过度-复杂的解决方案
    【解决方案4】:

    哇,问题和答案太旧了,需要更新。将 datetime.datetime 对象转换为 datetime.date 对象非常简单:

    somestringtext = '7.04.2021'
    datetime_datetime_object = datetime.strptime(somestringtext, '%d.%m.%Y')
    ### returns datetime.datetime(2021, 4, 7, 0, 0)
    datetime_date_object = datetime.date(datetime_datetime_object)
    

    而且日期时间对象和日期对象不一样,不能比较

    datetime_datetime_object == datetime_date_object
    ### returns False
    

    除非您将它们转换为相同的格式:

    datetime.date(datetime_datetime_object) == datetime_date_object
    ### returns True
    

    【讨论】:

      【解决方案5】:

      我在使用 pandas 时收到了上述错误,但是,因为 date_column 是我浪费了很多时间却没有意识到我格式化错误的字符串:

      # didnt work
      df[(df.date_column > parse_datestr('2018-01-01'))]
      
      # works
      df['date_column'] = pd.to_datetime(df['date_column'])
      df[(df.date_column > '2018-01-01') & (df.date_column < '2018-02-28')]
      

      【讨论】:

        【解决方案6】:

        我猜你的变量 start 和 date 是不同的类型。一个是日期时间,一个是日期。您可能需要显示更多代码才能获得体面的帮助。

        但是看看这个:http://docs.python.org/library/datetime.html#available-types

        它告诉你 datetime.datetime 和 datetime.date 一样具有日、月、年等属性。

        【讨论】:

          【解决方案7】:

          当您尝试比较日期字段 (DateField) 和日期时间字段 (DateTimeField) 时,会出现此问题。

          解决方案是检查您在模型中定义字段的位置并确保类型一致。

          我建议您将所有DateField 替换为DateTimeField

          【讨论】:

          • 我有一个与此相关的问题,我更改为 DateTimeField,但仍然出现该错误。我发现当我创建对象时,我使用的是日期,而不是日期时间
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-05
          • 2021-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多