Обнаруживать, является ли переменная объектом 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]: