how to test if a variable is pd.NaT?

我在测试我的变量之一是不是 pd.NaT。我知道它是 NaT,但它还是不能通过测试。例如,下面的代码不打印任何内容:

a=pd.NaT


if a == pd.NaT:
print("a not NaT")

有人知道吗? 有没有办法有效地测试 a是否是 NaT?

148626 次浏览

熊猫 NaT的行为就像一个浮点 NaN,因为它不等于它自己。相反,你可以使用 pandas.isnull:

In [21]: pandas.isnull(pandas.NaT)
Out[21]: True

对于 Nothing 和 NaN,也返回 True

从技术上讲,您还可以使用 x != x检查熊猫 NaT,遵循用于浮点 NaN 的常见模式。然而,这可能会导致 NumPy NaTs 的问题,它们看起来非常相似,代表相同的概念,但实际上是一种不同的类型,具有不同的行为:

In [29]: x = pandas.NaT


In [30]: y = numpy.datetime64('NaT')


In [31]: x != x
Out[31]: True


In [32]: y != y
/home/i850228/.local/lib/python3.6/site-packages/IPython/__main__.py:1: FutureWarning: In the future, NAT != NAT will be True rather than False.
# encoding: utf-8
Out[32]: False

检查 NumPy NaT的函数 numpy.isnat也出现故障,熊猫 NaT:

In [33]: numpy.isnat(pandas.NaT)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-33-39a66bbf6513> in <module>()
----> 1 numpy.isnat(pandas.NaT)


TypeError: ufunc 'isnat' is only defined for datetime and timedelta.

pandas.isnull既适用于熊猫,也适用于 NumPy NAT,所以这可能是应该走的路:

In [34]: pandas.isnull(pandas.NaT)
Out[34]: True


In [35]: pandas.isnull(numpy.datetime64('NaT'))
Out[35]: True

You can also use pandas.isna() for pandas.NaT, numpy.nan or None:

import pandas as pd
import numpy as np


x = (pd.NaT, np.nan, None)
[pd.isna(i) for i in x]


Output:
[True, True, True]
pd.NaT is pd.NaT

没错

this works for me.

如果它在 Series(例如 DataFrame列)中,你也可以使用 .isna():

pd.Series(pd.NaT).isna()
# 0    True
# dtype: bool

我就喜欢这样

>>> a = pandas.NaT
>>> type(a) == pandas._libs.tslibs.nattype.NaTType
>>> True