我有一个变量,我需要知道它是否是一个日期时间对象。
到目前为止,我一直在函数中使用以下hack来检测datetime对象:
if 'datetime.datetime' in str(type(variable)):
print('yes')
但确实应该有一种方法可以检测出什么类型的物体。就像我能做的那样:
if type(variable) is str: print 'yes'
除了将对象类型的名称转换为字符串并查看字符串是否包含'datetime.datetime'
之外,还有其他方法吗?
答案 0 :(得分:58)
您需要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
Pandas 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)
答案 1 :(得分:8)
使用isinstance
。
if isinstance(variable,datetime.datetime):
print "Yay!"
答案 2 :(得分:3)
isinstance
是你的朋友
>>> thing = "foo"
>>> isinstance(thing, str)
True
答案 3 :(得分:2)
虽然使用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()
答案 4 :(得分:2)
请注意,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
答案 5 :(得分:1)
我相信所有上述答案只有在日期类型为datetime.datetime时才有效。 如果日期对象的类型为datetime.time或datetime.date?
,该怎么办?这就是我找到datetime对象的方法。它总是对我有用。 (Python2&amp; Python3):
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
答案 6 :(得分:0)
您也可以使用duck typing(由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]: