64

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

到目前为止,我一直在函数中使用以下 hack 来检测 datetime 对象:

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

但是确实应该有一种方法来检测某物是什么类型的对象。就像我可以做的那样:

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

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

4

8 回答 8

136

你需要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.datetimeOR类型pandas.Timestamp,只需检查两者

>>> (type(now) is datetime.datetime) or (type(now) is pandas.Timestamp)
于 2013-06-07T19:55:35.280 回答
9

使用isinstance.

if isinstance(variable,datetime.datetime):
    print "Yay!"
于 2013-06-07T19:55:48.277 回答
6

注意,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
于 2018-11-24T01:02:01.250 回答
4

我相信只有当日期是 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
于 2017-12-05T15:07:26.337 回答
3

isinstance是你的朋友

>>> thing = "foo"
>>> isinstance(thing, str)
True
于 2013-06-07T19:55:58.267 回答
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()
于 2013-06-07T20:15:34.720 回答
1

您还可以使用鸭子类型进行检查(如 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]:
于 2019-07-05T13:45:53.617 回答
0

这在 python 3.9.4 中对我有用

if type(timeIn) is type(datetime.now().time()):
于 2021-09-07T09:26:18.130 回答