检测变量是否是日期时间对象

时间:2013-06-07 19:53:00

标签: python datetime

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

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

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

但确实应该有一种方法可以检测出什么类型的物体。就像我能做的那样:

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

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

7 个答案:

答案 0 :(得分:58)

您需要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

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