¿Cómo puedo comparar una fecha y una fecha y hora en Python?

Aquí hay un pequeño fragmento de código que estoy tratando de ejecutar:

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

Parece que no puedo comparar la fecha y los valores de fecha y hora. ¿Cuál sería la mejor manera de comparar estos? ¿Debo convertir el datetime a la fecha o viceversa? ¿Cómo puedo convertir entre ellos.

(Una pequeña pregunta pero parece ser un poco confuso.)

Use el método .date() para convertir una fecha y hora en una fecha:

 if item_date.date() > from_date: 

Alternativamente, puede usar datetime.today() lugar de date.today() . Usted podría usar

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

Para eliminar la parte del tiempo después.

Estoy tratando de comparar las fechas que están en formato de cadena como ‘20110930’

 benchMark = datetime.datetime.strptime('20110701', "%Y%m%d") actualDate = datetime.datetime.strptime('20110930', "%Y%m%d") if actualDate.date() < benchMark.date(): print True 

Aquí hay otra toma, “robada” de un comentario en el que no se puede comparar datetime.datetime con datetime.date … convierta la fecha en datetime utilizando esta construcción:

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

Sugerencia:

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

En mi caso, recibo dos objetos y no sé si se trata de objetos de fecha o fecha y hora. La conversión a la fecha no será buena, ya que estaría eliminando información: dos objetos cronometrados con la misma fecha deben ordenarse correctamente. Estoy de acuerdo con que las fechas se ordenen antes de la fecha y hora con la misma fecha.

Creo que usaré strftime antes de comparar:

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

No es elegante, pero debería funcionar. Creo que sería mejor que Python no generara el error, no veo ninguna razón por la que una fecha no sea comparable con una fecha. Este comportamiento es consistente en python2 y python3.