how to test if a variable is pd.NaT?
Pandas NaT
behaves like a floating-point NaN
, in that it's not equal to itself. Instead, you can use pandas.isnull
:
In [21]: pandas.isnull(pandas.NaT)Out[21]: True
This also returns True
for None and NaN.
Technically, you could also check for Pandas NaT
with x != x
, following a common pattern used for floating-point NaN. However, this is likely to cause issues with NumPy NaTs, which look very similar and represent the same concept, but are actually a different type with different behavior:
In [29]: x = pandas.NaTIn [30]: y = numpy.datetime64('NaT')In [31]: x != xOut[31]: TrueIn [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-8Out[32]: False
numpy.isnat
, the function to check for NumPy NaT
, also fails with a 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
works for both Pandas and NumPy NaTs, so it's probably the way to go:
In [34]: pandas.isnull(pandas.NaT)Out[34]: TrueIn [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 pdimport numpy as npx = (pd.NaT, np.nan, None)[pd.isna(i) for i in x]Output:[True, True, True]