how to test if a variable is pd.NaT?
Asked Answered
S

5

155

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?

Subsidiary answered 22/3, 2018 at 17:49 Comment(6)
pd.isnull also works for NaTs.Forum
pandas and numpy follow the standard that NaN does not equate to itself. so even if you typed a == a you would get FalseContiguity
Voting to reopen because pandas.NaT isn't actually a NumPy NaT, and it behaves differently in equality and numpy.isnat checks.Alberich
@ALollz: NumPy doesn't actually do that yet; there's a FutureWarning saying they plan to, but for now, numpy.datetime64('NaT') == numpy.datetime64('NaT').Alberich
Related: Numpy: Checking if a value is NaTEulogist
@Alberich Thanks for the heads up! Good to know.Contiguity
A
226

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
Alberich answered 22/3, 2018 at 18:29 Comment(3)
Note that pandas.isnull() is an alias to pandas.isna()Greenebaum
@DmitriChubarov there must be something different. I used this pattern: df.apply(lambda x: ... if x.time.isna() else ..., axis=1). In that case the following error is thrown: AttributeError: 'NaTType' object has no attribute 'isna'. But if I use pd. isnull(x.time), it behaves as expectedTriatomic
@Triatomic you should be able to use pd.isna(x.time)Greenebaum
R
31
pd.NaT is pd.NaT

True

this works for me.

Recompense answered 22/5, 2020 at 3:32 Comment(1)
good when you specifically want to check for NaT without including other null typesTatouay
W
22

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]
Waterline answered 18/11, 2019 at 11:52 Comment(1)
isnull is an alias for isna. From pandas source code: "isnull = isna"Tatouay
P
10

If it's in a Series (e.g. DataFrame column) you can also use .isna():

pd.Series(pd.NaT).isna()
# 0    True
# dtype: bool
Pointblank answered 27/5, 2020 at 0:5 Comment(2)
Not sure this is true. I had a df and was using "df.apply(lambda x: ... if x.time.isna() else ..., axis=1)". In that case the following error was thrown: "AttributeError: 'NaTType' object has no attribute 'isna'".Triatomic
@Triatomic because .isna() is an attribute of the column (i.e. pd.Series), not of the element,.Aggie
E
0

This is what works for me

>>> a = pandas.NaT
>>> type(a) == pandas._libs.tslibs.nattype.NaTType
>>> True
Eulogia answered 25/1, 2022 at 9:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.