2010-07-19 2 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 

Я не могу сравнить даты и значения DateTime. Какой был бы лучший способ их сравнить? Должен ли я преобразовать дату и время в прошлое или наоборот? Как мне конвертировать между ними.

(Небольшой вопрос, но это, кажется, немного сбивает с толку.)

+0

Это, кажется, дубликат http://stackoverflow.com/questions/7239315/cant-compare-datetime-datetime-to-datetime-date – tobixen

ответ

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 всегда будет datetime, а from_date всегда будет свидание. Я приземлился здесь, потому что хотел отсортировать список, содержащий как дату, так и дату. В моем случае подход выше, вероятно, самый худший. – tobixen

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

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)) 
Смежные вопросы