如何测试变量是否为pd.NaT?

Clé*_*t F 27 datetime unit-testing nan pandas

我正在尝试测试我的一个变量是否为pd.NaT.我知道它是NaT,但它仍然不会通过测试.例如,以下代码不打印任何内容:

a=pd.NaT

if a == pd.NaT:
    print("a not NaT")
Run Code Online (Sandbox Code Playgroud)

有人有线索吗 ?有没有办法有效地测试是否a是NaT?

use*_*ica 48

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

In [21]: pandas.isnull(pandas.NaT)
Out[21]: True
Run Code Online (Sandbox Code Playgroud)

这也返回TrueNone和NaN.

从技术上讲,你也可以检查大熊猫NaTx != x,以下用于浮点NaN的一种常用模式.但是,这可能会导致NumPy NaT出现问题,这看起来非常相似并且代表相同的概念,但实际上是具有不同行为的不同类型:

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
Run Code Online (Sandbox Code Playgroud)

numpy.isnat,检查NumPy的功能NaT,也失败了Pandas 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.
Run Code Online (Sandbox Code Playgroud)

pandas.isnull 适用于Pandas和NumPy NaTs,所以它可能是要走的路:

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

In [35]: pandas.isnull(numpy.datetime64('NaT'))
Out[35]: True
Run Code Online (Sandbox Code Playgroud)


Lon*_* Bu 11

pd.NaT is pd.NaT
Run Code Online (Sandbox Code Playgroud)

真的

这对我有用。


Max*_*nis 10

如果它在Series(例如DataFrame列)中,您还可以使用.isna()

pd.Series(pd.NaT).isna()
# 0    True
# dtype: bool
Run Code Online (Sandbox Code Playgroud)


Luk*_*kas 9

您还可以将 pandas.isna() 用于 pandas.NaT、numpy.nan 或 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]
Run Code Online (Sandbox Code Playgroud)