如何在Python中比较日期和日期时间?

How can I compare a date and a datetime in Python?

下面是我尝试执行的一个小片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> from datetime import *
>>> item_date = datetime.strptime('7/16/10',"%m/%d/%y")
>>> from_date = date.today()-timedelta(days=3)
>>> print type(item_date)
<type 'datetime.datetime'>
>>> print type(from_date)
<type 'datetime.date'>
>>> if item_date > from_date:
...     print 'item is newer'
...
Traceback (most recent call last):
  File"<stdin>", line 1, in <module>
TypeError: can't compare datetime.datetime to datetime.date

我似乎无法比较日期和日期时间值。最好的比较方法是什么?我应该将日期时间转换为日期,还是反之亦然?我如何在它们之间转换呢?

(一个小问题,但似乎有点困惑。)


使用.date()方法将日期时间转换为日期:

1
if item_date.date() > from_date:

或者,您可以使用datetime.today()而不是date.today()。你可以用

1
from_date = from_date.replace(hour=0, minute=0, second=0, microsecond=0)

取消时间部分。


我正在尝试比较字符串格式的日期,如"20110930"

1
2
3
4
5
6
benchMark = datetime.datetime.strptime('20110701',"%Y%m%d")

actualDate = datetime.datetime.strptime('20110930',"%Y%m%d")

if actualDate.date() < benchMark.date():
    print True


这是另一个"失窃"的观点,来自"can't compare datetime.datetime to datetime.date…"使用此构造将日期转换为日期时间:

1
datetime.datetime(d.year, d.month, d.day)

建议:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from datetime import datetime

def ensure_datetime(d):
   """
    Takes a date or a datetime as input, outputs a datetime
   """

    if isinstance(d, datetime):
        return d
    return datetime.datetime(d.year, d.month, d.day)

def datetime_cmp(d1, d2):
   """
    Compares two timestamps.  Tolerates dates.
   """

    return cmp(ensure_datetime(d1), ensure_datetime(d2))


在我的例子中,我有两个对象,我不知道它是日期对象还是时间对象。转换为日期不会像我删除信息那样好-两个日期相同的TimeDate对象应该正确排序。我同意在日期时间之前排序的日期与相同的日期。

我想在比较之前我会使用strftime:

1
2
3
4
5
6
>>> foo=datetime.date(2015,1,10)
>>> bar=datetime.datetime(2015,2,11,15,00)
>>> foo.strftime('%F%H%M%S') > bar.strftime('%F%H%M%S')
False
>>> foo.strftime('%F%H%M%S') < bar.strftime('%F%H%M%S')
True

不优雅,但应该锻炼。我认为如果python不提出错误的话会更好,我看不出任何理由为什么datetime不能与日期进行比较。这种行为在python2和python3中是一致的。