I'm trying to test if one of my variables is pd.NaT. I know it is NaT, and still it won't pass the test. As an example, the following code prints nothing :
a=pd.NaT if a == pd.NaT: print("a not NaT") Does anyone have a clue ? Is there a way to effectively test if a is NaT?
5 Answers
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.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, 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]: True In [35]: pandas.isnull(numpy.datetime64('NaT')) Out[35]: True pd.NaT is pd.NaT True
this works for me.
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] If it's in a Series (e.g. DataFrame column) you can also use .isna():
pd.Series(pd.NaT).isna() # 0 True # dtype: bool This is what works for me
>>> a = pandas.NaT >>> type(a) == pandas._libs.tslibs.nattype.NaTType >>> True