2010-07-19 23 views
40

aquí hay un pequeño fragmento que estoy tratando de ejecutar:¿Cómo puedo comparar una fecha y una fecha y hora en 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 

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 la fecha y hora a la fecha o viceversa? ¿Cómo convierto entre ellos?

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

+0

Esto parece ser una duplicado de http://stackoverflow.com/questions/7239315/cant-compare-datetime-datetime-to-datetime-date – tobixen

Respuesta

73

Uso the .date() method para convertir una fecha y hora a una fecha:

if item_date.date() > from_date: 

Alternativamente, se puede utilizar en lugar de datetime.today()date.today(). Puede usar

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

para eliminar la parte de tiempo después.

+0

Creo que esta es la mejor respuesta si se da que item_date siempre será un datetime y from_date siempre será una cita. Aterricé aquí porque quería ordenar una lista que incluyera tanto la fecha como la fecha y hora. En mi caso, el enfoque anterior es probablemente el peor. – tobixen

5

Estoy tratando de comparar la fecha, que son 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 
+4

Si tiene el formato de cadena YYYYMMDD, la comparación de cadenas equivale a convertir fechas y comparar fechas y es más eficiente. – omikron

1

En mi caso, me sale dos objetos dentro y no sé si se trata de la fecha u objetos TimeDate. La conversión hasta la fecha no será buena ya que estaría eliminando información: dos objetos de fecha y hora con la misma fecha deberían estar ordenados correctamente. Estoy de acuerdo con las fechas que se ordenan antes de la fecha y la misma fecha.

Creo que voy a 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 si Python no levantara el error, no veo razones por las cuales una fecha no debería ser comparable con una fecha. Este comportamiento es consistente en python2 y python3.

2

Aquí es otra toma, "robado" de un comentario en can't compare datetime.datetime to datetime.date ... convertir la fecha a una fecha y hora utilizando este constructo:

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