Обнаруживать, является ли переменная объектом datetime
У меня есть переменная, и мне нужно знать, является ли это объектом datetime.
До сих пор я использовал следующий хак в функции для обнаружения объекта datetime:
if 'datetime.datetime' in str(type(variable)):
print('yes')
Но действительно должен быть способ определить, какой тип объекта что-то есть. Как я могу это сделать:
if type(variable) is str: print 'yes'
Есть ли способ сделать это иначе, чем взломать превращение имени типа объекта в строку и увидеть, содержит ли строка 'datetime.datetime'
?
Ответы
Ответ 1
Вам нужно isinstance(variable, datetime.datetime)
:
>>> import datetime
>>> now = datetime.datetime.now()
>>> isinstance(now, datetime.datetime)
True
Обновить
Как заметил Давос, datetime.datetime
является подклассом datetime.date
, что означает, что также будет работать следующее:
>>> isinstance(now, datetime.date)
True
Возможно, лучшим подходом было бы просто тестирование типа (как предложило Давос):
>>> type(now) is datetime.date
False
>>> type(now) is datetime.datetime
True
Временная Timestamp
Панды
В одном комментарии упоминалось, что в python3.7 исходное решение в этом ответе возвращает False
(он отлично работает в python3.4). В этом случае, после комментариев Давоса, вы можете сделать следующее:
>>> type(now) is pandas.Timestamp
Если вы хотите проверить, был ли элемент типом datetime.datetime
или pandas.Timestamp
, просто проверьте, как
>>> (type(now) is datetime.datetime) or (type(now) is pandas.Timestamp)
Ответ 2
Используйте isinstance
.
if isinstance(variable,datetime.datetime):
print "Yay!"
Ответ 3
isinstance
- ваш друг
>>> thing = "foo"
>>> isinstance(thing, str)
True
Ответ 4
При использовании isinstance будет делать то, что вы хотите, оно не очень "pythonic", в том смысле, что лучше просить прощения, чем разрешения.
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()
Ответ 5
Обратите внимание, что объекты datetime.date
aer не считаются типом datetime.datetime
, тогда как объекты datetime.datetime
считаются типами 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
Ответ 6
Я считаю, что все приведенные выше ответы будут работать только в том случае, если дата имеет тип datetime.datetime. Что делать, если объект даты имеет тип datetime.time или datetime.date?
Вот как я нахожу объект datetime. Это всегда сработало для меня. (Python2 и Python3):
import datetime
type(date_obj) in (datetime, datetime.date, datetime.datetime, datetime.time)
Тестирование в оболочке Python2 или 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
Ответ 7
Вы также можете проверить, используя утку (как предложено Джеймсом).
Вот пример:
from datetime import date, datetime
def is_datetime(dt):
"""
Returns True if is datetime
Returns False if is date
Returns None if it is neither of these things
"""
try:
dt.date()
return True
except:
if isinstance(dt, date):
return False
return None
Результаты:
In [8]: dt = date.today()
In [9]: tm = datetime.now()
In [10]: is_datetime(dt)
Out[11]: False
In [12]: is_datetime(tm)
Out[13]: True
In [14]: is_datetime("sdf")
In [15]: