web-dev-qa-db-fra.com

Détecter si une variable est un objet datetime

J'ai une variable et j'ai besoin de savoir s'il s'agit d'un objet datetime.

Jusqu'à présent, j'ai utilisé le hack suivant dans la fonction pour détecter un objet datetime:

if 'datetime.datetime' in str(type(variable)):
     print('yes')

Mais il devrait vraiment y avoir un moyen de détecter quel type d'objet est quelque chose. Juste comme je peux faire:

if type(variable) is str: print 'yes'

Y a-t-il un moyen de faire cela autre que le bidouillage consistant à transformer le nom du type d'objet en une chaîne et à voir si la chaîne contient 'datetime.datetime'?

19
Ryan Saxe

Vous avez besoin de isinstance(variable, datetime.datetime):

>>> import datetime
>>> now = datetime.datetime.now()
>>> isinstance(now, datetime.datetime)
True

Mettre à jour

Comme noté par Davos, datetime.datetime est une sous-classe de datetime.date, ce qui signifie que les éléments suivants fonctionneraient également:

>>> isinstance(now, datetime.date)
True

La meilleure approche serait peut-être simplement de tester le type (comme suggéré par Davos):

>>> type(now) is datetime.date
False
>>> type(now) is datetime.datetime
True

Pandas Timestamp

Un commentaire a mentionné qu'en python3.7, la solution originale dans cette réponse renvoie False (cela fonctionne très bien en python3.4). Dans ce cas, à la suite des commentaires de Davos, vous pourriez procéder comme suit:

>>> type(now) is pandas.Timestamp

Si vous vouliez vérifier si un élément était de type datetime.datetime OR pandas.Timestamp, il suffit de vérifier les deux

>>> (type(now) is datetime.datetime) or (type(now) is pandas.Timestamp)
52
RichieHindle

Utilisez isinstance.

if isinstance(variable,datetime.datetime):
    print "Yay!"
8
korylprince

isinstance est votre ami

>>> thing = "foo"
>>> isinstance(thing, str)
True
3
TehTris

Même si utiliser isinstance fera ce que vous voulez, il n’est pas très «pythonique», en ce sens qu’il vaut mieux demander pardon que permission. 

try:
    do_something_small_with_object() #Part of the code that may raise an 
                                     #exception if its the wrong object
except StandardError:
    handle_case()

else:
    do_everything_else()
2
James

Je pense que toutes les réponses ci-dessus ne fonctionneront que si date est de type datetime.datetime. Que faire si l'objet de date est de type datetime.time ou datetime.date?

Voici comment je trouve un objet datetime. Cela a toujours fonctionné pour moi. (Python2 et Python3):

import datetime
type(date_obj) in (datetime, datetime.date, datetime.datetime, datetime.time)

Test dans un shell Python2 ou Python3:

import datetime
d = datetime.datetime.now()  # creating a datetime.datetime object.
date = d.date()  # type(date): datetime.date
time = d.time()  # type(time): datetime.time

type(d) in (datetime, datetime.date, datetime.datetime, datetime.time)
True
type(date) in (datetime, datetime.date, datetime.datetime, datetime.time)
True
type(time) in (datetime, datetime.date, datetime.datetime, datetime.time)
True
1
Saurav Kumar

Notez que les objets datetime.date ne sont pas considérés comme étant du type datetime.datetime, alors que les objets datetime.datetime sont considérés comme du type datetime.date.

import datetime                                                                                                                     

today = datetime.date.today()                                                                                                       
now = datetime.datetime.now()                                                                                                       

isinstance(today, datetime.datetime)                                                                                                
>>> False

isinstance(now, datetime.datetime)                                                                                                  
>>> True

isinstance(now, datetime.date)                                                                                                      
>>> True

isinstance(now, datetime.datetime)                                                                                                  
>>> True
1
Artur Barseghyan