変数の 1 つが pd.NaT かどうかをテストしようとしています。NaT であることはわかっていますが、それでもテストに合格しません。たとえば、次のコードは何も出力しません。
a=pd.NaT
if a == pd.NaT:
print("a not NaT")
a
誰か手がかりを持っていますか? NaT かどうかを効果的にテストする方法はありますか?
ベストアンサー1
Pandas はNaT
浮動小数点 のように動作しNaN
、それ自体と等しくありません。代わりに、 を使用できますpandas.isnull
。
In [21]: pandas.isnull(pandas.NaT)
Out[21]: True
True
これはNone と NaN の場合にも返されます。
NaT
技術的には、浮動小数点 NaN に使用される一般的なパターンに従って、でPandas をチェックすることもできますx != x
。ただし、これは NumPy NaT で問題を引き起こす可能性があります。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 NaTs の両方で機能するので、おそらくこれが最適な方法です。
In [34]: pandas.isnull(pandas.NaT)
Out[34]: True
In [35]: pandas.isnull(numpy.datetime64('NaT'))
Out[35]: True