检测变量是否为 datetime 对象

我有一个变量,我需要知道它是否是一个日期时间对象。

到目前为止,我已经在函数中使用了以下代码来检测 datetime 对象:

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

但是真的应该有一种方法可以检测出物体的类型,就像我可以做的:

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

除了将对象类型的名称转换为字符串并查看该字符串是否包含 'datetime.datetime'之外,还有其他方法可以做到这一点吗?

122431 次浏览

你需要 isinstance(variable, datetime.datetime):

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

更新

正如达沃斯论坛所注意到的那样,datetime.datetimedatetime.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.datetimepandas.Timestamp类型,只需同时检查两者

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

使用 isinstance

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

isinstance是你的朋友

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

虽然使用 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()

我相信只有当 date 的类型为 datetime.datetime.如果 date 对象的类型是 datetime.time 或 datetime.date,该怎么办?时,上述所有答案才会有效

这就是我找到一个 datetime 对象的方法,它总是对我有用。(Python 2 & Python 3) :

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

在 Python2或 Python3 shell 中进行测试:

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

注意,datetime.date对象不被认为是 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

您还可以使用 鸭子打字进行检查(正如 James 所建议的那样)。

这里有一个例子:

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

这在 python 3.9.4中对我很有用

if type(timeIn) is type(datetime.now().time()):