我试图测试一个变量是否为 pd.NaT。我知道它是 NaT,但它仍然无法通过测试。例如,以下代码不会打印任何内容:
a=pd.NaT
if a == pd.NaT:
print("a not NaT")
有人知道吗?有什么方法可以有效地测试 a
是否为 NaT 吗?
我试图测试一个变量是否为 pd.NaT。我知道它是 NaT,但它仍然无法通过测试。例如,以下代码不会打印任何内容:
a=pd.NaT
if a == pd.NaT:
print("a not NaT")
有人知道吗?有什么方法可以有效地测试 a
是否为 NaT 吗?
NaT
类似于浮点数的NaN
,因为它不等于自身。相反,您可以使用pandas.isnull
:In [21]: pandas.isnull(pandas.NaT)
Out[21]: True
这也会对None和NaN返回True
。
从技术上讲,你也可以使用x != x
来检查Pandas NaT
,这是一种用于浮点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
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.
pandas.isnull
适用于 Pandas 和 NumPy 中的 NaT,所以这可能是一个比较好的选择:
In [34]: pandas.isnull(pandas.NaT)
Out[34]: True
In [35]: pandas.isnull(numpy.datetime64('NaT'))
Out[35]: True
pandas.isnull()
是 pandas.isna()
的别名。 - Dima Chubarovdf.apply(lambda x: ... if x.time.isna() else ..., axis=1)
。在这种情况下,会抛出以下错误:AttributeError: 'NaTType' object has no attribute 'isna'
。但如果我使用pd.isnull(x.time)
,它的行为就像预期的那样。 - MikeB2019xpd.isna(x.time)
。 - Dima Chubarovpd.NaT is pd.NaT
真的
这对我有效。
你也可以使用 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]
Series
中(例如 DataFrame
的列),您也可以使用 .isna()
:pd.Series(pd.NaT).isna()
# 0 True
# dtype: bool
>>> a = pandas.NaT
>>> type(a) == pandas._libs.tslibs.nattype.NaTType
>>> True
pd.isnull
也适用于 NaT(Not a Time)。 - cs95pandas
andnumpy
follow the standard thatNaN
does not equate to itself. so even if you typeda == a
you would getFalse
- ALollzpandas.NaT
实际上不是NumPy的NaT
,并且在相等性和numpy.isnat
检查中表现不同。 - user2357112numpy.datetime64('NaT') == numpy.datetime64('NaT')
。 - user2357112