2010-07-19 81 views
40

這裏,我試圖執行一個小片段:如何比較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://stackoverflow.com/questions/7239315/cant-compare-datetime-datetime-to-datetime-date – tobixen 2015-04-24 06:03:34

回答

73

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

5

我想比較日期這是在字符串格式像「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

1

在我的情況,我得到了兩個對象,我不知道這是否是日期或時間日期對象。轉換爲日期不會很好,因爲我會丟棄信息 - 具有相同日期的兩個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中是一致的。

2

這裏是另一個拿在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))