2010-07-19 15 views
40

Ecco un piccolo frammento che sto cercando di eseguire:Come posso confrontare una data e un datetime in 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 

io non riesco a confrontare la data e i valori datetime. Quale sarebbe il modo migliore per confrontare questi? Devo convertire il datetime alla data o viceversa? Come faccio a convertire tra di loro.

(una piccola domanda, ma sembra essere un po 'di confusione.)

+0

questo sembra essere un duplicato di http://stackoverflow.com/questions/7239315/cant-compare-datetime-datetime-to-datetime-date – tobixen

risposta

73

Usa the .date() method per convertire un datetime a una data:

if item_date.date() > from_date: 

In alternativa, è possibile utilizzare al posto di datetime.today()date.today(). È possibile utilizzare

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

per eliminare la parte di tempo successiva.

+0

Penso che questa sia la migliore risposta se è dato che item_date sarà sempre un datetime e from_date sarà sempre una data. Sono arrivato qui perché volevo ordinare una lista contenente sia la data che il datetime. Nel mio caso, l'approccio sopra è probabilmente il peggiore. – tobixen

5

sto cercando di confrontare data che sono in formato stringa come '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

Se si dispone di un formato stringa, il confronto delle stringhe YYYYMMDD equivale alla conversione in data e al confronto delle date ed è più efficiente. – omikron

1

Nel mio caso, ho ottenere due oggetti in e non so se è data o oggetti TimeDate. La conversione fino alla data non sarà buona, dato che dovrei rilasciare le informazioni: due oggetti temporizzati con la stessa data dovrebbero essere ordinati correttamente. Sto bene con le date che vengono ordinate prima del datetime con la stessa data.

penso userò strftime prima di confrontare:

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

Non elegante, ma dovrebbe funzionare. Penso che sarebbe meglio se Python non aumentasse l'errore, non vedo ragioni per cui un datetime non dovrebbe essere comparabile con una data. Questo comportamento è coerente in python2 e python3.

2

Ecco un altro introito, "rubato" da un commento a can't compare datetime.datetime to datetime.date ... convertire la data a un datetime utilizza questo costrutto:

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

Suggerimento:

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