我有一个变量,我需要知道它是否是日期时间对象。
到目前为止,我一直在函数中使用以下 hack 来检测日期时间对象:
if 'datetime.datetime' in str(type(variable)):
print('yes')
但是确实应该有一种方法来检测某物是什么类型的物体。就像我能做的那样:
if type(variable) is str: print 'yes'
除了将对象类型的名称转换为字符串并查看字符串是否包含
'datetime.datetime'
之外,还有其他方法可以做到这一点吗?
你需要
isinstance(variable, datetime.datetime)
:
>>> import datetime
>>> now = datetime.datetime.now()
>>> isinstance(now, datetime.datetime)
True
更新
Davos 注意到,
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)
使用
isinstance
。
if isinstance(variable,datetime.datetime):
print "Yay!"
请注意,
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
我相信上述所有答案仅在日期类型为 datetime.datetime 时才有效。 如果日期对象是 datetime.time 或 datetime.date 类型怎么办?
这就是我查找日期时间对象的方法。它总是对我有用。 (Python2 和 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
isinstance
是你的朋友
>>> thing = "foo"
>>> isinstance(thing, str)
True
您还可以使用鸭子打字进行检查(按照詹姆斯的建议)。
这是一个例子:
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]:
虽然使用 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()
这在 python 3.9.4 中对我有用
if type(timeIn) is type(datetime.now().time()):