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

问题描述:

这里,我试图执行一个小片段:如何比较Python中的日期和日期时间?

>>> 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 

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

(一个小问题,但它似乎有点混乱。)

+0

这似乎是一个重复的http://*.com/questions/7239315/cant-compare-datetime-datetime-to-datetime-date – tobixen 2015-04-24 06:03:34

使用the .date() method为datetime转换为日期:

if item_date.date() > from_date: 

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

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

消除时间部分之后。

+0

我认为这是最好的答案,如果它给出item_date将始终是一个日期时间和from_date将永远是一个约会。我在这里登陆是因为我想对包含日期和日期时间的列表进行排序。就我而言,上面的方法可能是最糟糕的。 – tobixen 2015-04-24 10:17:40

我想比较日期这是在字符串格式像“20110930”

benchMark = datetime.datetime.strptime('20110701', "%Y%m%d") 

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

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

如果你有字符串格式YYYYMMDD字符串比较相当于转换为日期和比较日期,并且效率更高。 – omikron 2014-03-10 09:59:02

在我的情况,我得到了两个对象,我不知道这是否是日期或时间日期对象。转换为日期不会很好,因为我会丢弃信息 - 具有相同日期的两个timedate对象应该正确排序。对于在相同日期的日期时间之前对日期进行排序,我很确定。

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

>>> 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不会提高错误会更好,我没有看到为什么日期时间不应该与日期相比的原因。这种行为在python2和python3中是一致的。

这里是另一个拿在can't compare datetime.datetime to datetime.date“偷”从评论...使用此构造日期转换为datetime:

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

建议:

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))