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?

6

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 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy