Подтвердить что ты не робот

Как сравнить дату и дату в 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

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

(Небольшой вопрос, но, похоже, он немного запутан.)

4b9b3361

Ответ 1

Используйте метод .date() для преобразования даты и времени в дату:

if item_date.date() > from_date:

В качестве альтернативы вы можете использовать datetime.today() вместо date.today(). Вы можете использовать

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

чтобы впоследствии удалить часть времени.

Ответ 2

Я пытаюсь сравнить дату, которая находится в строчном формате, например '20110930

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

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

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

Ответ 3

Вот еще один прием, "украденный" из комментария в не может сравнивать datetime.datetime с datetime.date... конвертировать дату в дату-время, используя эта конструкция:

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

Ответ 4

В моем случае я получаю два объекта, и я не знаю, назначают ли они дату или время. Преобразование на сегодняшний день не будет хорошим, так как я бы отказался от информации - два объекта с временной шкалой с той же датой должны быть отсортированы правильно. Я в порядке с датами, которые были отсортированы до даты и времени с той же датой.

Я думаю, что буду использовать 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.