Python:如何检查对象是否为datetime.date类型?

49 python datetime

我尝试了一些明显的选项,但没有一个可行:

In [150]: x
Out[150]: datetime.date(2012, 9, 1)

In [151]: type(x)
Out[151]: datetime.date

In [152]: isinstance(x, datetime.date)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-152-9a298ea6fce5> in <module>()
----> 1 isinstance(x, datetime.date)

TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

In [153]: x is datetime.date
Out[153]: False

In [154]: type(x) is datetime.date
Out[154]: False
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

oll*_*_uk 92

我相信它在你的例子中不起作用的原因是你是这样导入的datetime:

from datetime import datetime
Run Code Online (Sandbox Code Playgroud)

这会导致你看到的错误

In [30]: isinstance(x, datetime.date)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/<ipython-input-30-9a298ea6fce5> in <module>()
----> 1 isinstance(x, datetime.date)

TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
Run Code Online (Sandbox Code Playgroud)

如果您只是这样导入:

import datetime
Run Code Online (Sandbox Code Playgroud)

代码将按所有其他答案中所示运行

In [31]: import datetime

In [32]: isinstance(x, datetime.date)
Out[32]: True

In [33]: 
Run Code Online (Sandbox Code Playgroud)

  • 好吧,如果你想区分datetime.date和datetime.datetime,这个方法将失败:`>>> import datetime`` >>> foo = datetime.datetime.now()``>>> isinstance(foo, datetime.date)``True` .__ class__应该帮助`>>> foo .__ class__ == datetime.date``False`` >>> foo .__ class__ == datetime.datetime``True` (4认同)
  • 如果你有一个日期时间(而不仅仅是一个日期),通过扩展你可以这样做:`x = datetime.datetime.now()`然后`isinstance(x, datetime.datetime)` (2认同)
  • 为了区分“datetime.date”和“datetime.date”类,您应该在导入“datetime”库后使用“type(x) is datetime.date”,如此处所述。 (2认同)

And*_*nez 24

在Python 3.8.4中,可以检查方法 withisinstance在检查 a 是否datetime是 adate或 a时会失败datetime,因为这两个检查都会给出True

    >>> from datetime import datetime, date
    >>> mydatetime = datetime.now()
    >>> mydate = mydatetime.date()
    >>> isinstance(mydatetime, datetime)
    True
    >>> isinstance(mydatetime, date)
    True
Run Code Online (Sandbox Code Playgroud)

这是因为它datetime是 的子类,正如date另一个答案中所解释的那样:

派生类的实例也是基类的实例

因此,在区分datetime和时datetype应该改用:

    >>> type(mydatetime) is date
    False
    >>> type(mydate) is date
    True
    >>> type(mydate) is datetime
    False
    >>> type(mydatetime) is datetime
    True
Run Code Online (Sandbox Code Playgroud)

您也可以使用==而不是来is比较类型(感谢Tim Tisdall的提醒),但是之间存在差异==is,并且可能存在性能差异。

  • 我想知道这里使用“is”而不是“==”是否更好...... (2认同)

Sim*_*ger 12

import datetime
d = datetime.date(2012, 9, 1)
print type(d) is datetime.date

> True
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,type() 对于 datetime.date 和 datetime.datetime 都按预期工作。如果 x 是 datetime.date 或 datetime.datetime,isinstance(x, datetime.date) 返回 True。 (3认同)
  • 使用“is”而不是“==”是一种过早的优化,可能会破坏。这里没有理由测试对象身份(它可能在许多情况下有效,直到它不起作用)。您应该提到的是,使用“type()”而不是“isinstance()”来拒绝诸如“datetime.datetime”之类的子类。 (2认同)

Rom*_*kov 11

根据文档classdate是class的父级datetime。在所有情况下,isinstance()方法都会给你True。如果您需要区分datetimedate,你应该检查类的名称

import datetime

datetime.datetime.now().__class__.__name__ == 'date' #False
datetime.datetime.now().__class__.__name__ == 'datetime' #True
datetime.date.today().__class__.__name__ == 'date' #True
datetime.date.today().__class__.__name__ == 'datetime' #False
Run Code Online (Sandbox Code Playgroud)

当我对日期和日期随时间有不同的格式规则时,我遇到了这个问题


cmd*_*cmd 9

正确的方法是

import datetime
isinstance(x, datetime.date)
Run Code Online (Sandbox Code Playgroud)

当我在我的机器上尝试这个时它工作正常.你需要调查为什么datetime.date不是一个班级.你是否可能用其他东西掩盖它?或者没有正确引用它进行导入?

  • 如果 x 是 datetime.datetime,cmd 的解决方案也会返回 True。这可能不是您想要或期望的。Simon Steinberger 的回答正确区分了 datetime.date 和 datetime.datetime。 (4认同)
  • @cmd 在 python 2.7 中,语句“isinstance(datetime.datetime.now(), datetime.date)”返回 True。 (2认同)

Dmi*_* B. 5

如果您现有的代码已经依赖from datetime import datetime,您也可以简单地导入date

from datetime import datetime, timedelta, date
print isinstance(datetime.today().date(), date)
Run Code Online (Sandbox Code Playgroud)