如何判断变量是否是日期时间对象?

问题描述 投票:0回答:8

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

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

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

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

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

除了将对象类型的名称转换为字符串并查看字符串是否包含

'datetime.datetime'
之外,还有其他方法可以做到这一点吗?

python datetime
8个回答
176
投票

你需要

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)

9
投票

使用

isinstance

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

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

5
投票

我相信上述所有答案仅在日期类型为 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

3
投票

isinstance
是你的朋友

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

3
投票

您还可以使用鸭子打字进行检查(按照詹姆斯的建议)。

这是一个例子:

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

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()

1
投票

这在 python 3.9.4 中对我有用

if type(timeIn) is type(datetime.now().time()):
© www.soinside.com 2019 - 2024. All rights reserved.