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'
?
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)
Utilisez isinstance
.
if isinstance(variable,datetime.datetime):
print "Yay!"
isinstance
est votre ami
>>> thing = "foo"
>>> isinstance(thing, str)
True
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()
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
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