2010-07-19 3 views
40

Voici un petit extrait que je suis en train d'exécuter:Comment puis-je comparer une date et un datetime 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 

Je ne peux pas sembler comparer la date et les valeurs datetime. Quelle serait la meilleure façon de les comparer? Devrais-je convertir le datetime à ce jour ou vice-versa? Comment puis-je convertir entre eux.

(Une petite question, mais il semble être un peu déroutant.)

+0

Cela semble être un duplicata de http://stackoverflow.com/questions/7239315/cant-compare-datetime-datetime-to-datetime-date – tobixen

Répondre

73

Utilisez the .date() method pour convertir un datetime à une date:

if item_date.date() > from_date: 

Sinon, vous pouvez utiliser datetime.today() au lieu de date.today(). Vous pouvez utiliser

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

pour éliminer la partie temps après.

+0

Je pense que c'est la meilleure réponse s'il est donné que item_date sera toujours datetime et from_date sera toujours Un rendez-vous. J'ai atterri ici parce que je voulais trier une liste contenant à la fois date et datetime. Dans mon cas, l'approche ci-dessus est probablement la pire. – tobixen

5

Je suis en train de comparer la date qui sont au format de chaîne comme « 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 vous avez un format de chaîne, la comparaison de chaînes YYYYMMDD est équivalente à la conversion à date et à la comparaison de dates et est plus efficace. – omikron

1

Dans mon cas, je reçois deux objets et je ne sais pas si c'est la date ou les objets timedate. Convertir à ce jour ne sera pas bon car je laisserais tomber des informations - deux objets de date et d'heure ayant la même date devraient être triés correctement. Je suis d'accord avec les dates triées avant le datetime avec la même date.

Je pense que je vais utiliser strftime avant de comparer:

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

Pas élégant, mais devrait fonctionner. Je pense qu'il serait préférable que Python ne soulève pas l'erreur, je ne vois pas pourquoi un datetime ne devrait pas être comparable à une date. Ce comportement est cohérent dans python2 et python3.

2

Voici une autre prise, "volée" d'un commentaire à can't compare datetime.datetime to datetime.date ... convertir la date à un datetime en utilisant cette construction:

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

Suggestion:

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