Я пытаюсь проверить, является ли одна из моих переменных pd.NaT. Я знаю, что это NaT, и все же он не пройдет тест. В качестве примера следующий код ничего не печатает:
a=pd.NaT
if a == pd.NaT:
print("a not NaT")
У кого-нибудь есть ключ ? Есть ли способ эффективно проверить, является ли a NaT?
pandas и numpy следуют стандарту, который NaN сам себе не приравнивает. так что даже если вы наберете a == a, вы получите FalseГолосование за повторное открытие, потому что pandas.NaT на самом деле не является NumPy NaT и ведет себя по-разному при проверках равенства и numpy.isnat.
@ALollz: NumPy на самом деле этого еще не делает; есть FutureWarning, говорящий, что они планируют это сделать, но пока numpy.datetime64('NaT') == numpy.datetime64('NaT').
@ user2357112 Спасибо за внимание! Хорошо знать.

Pandas NaT ведет себя как NaN с плавающей запятой в том смысле, что он не равен самому себе. Вместо этого вы можете использовать pandas.isnull:
In [21]: pandas.isnull(pandas.NaT)
Out[21]: True
Это также возвращает True для None и NaN.
Технически вы также можете проверить Pandas NaT с x != x, следуя общему шаблону, используемому для NaN с плавающей запятой. Однако это может вызвать проблемы с 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 NaT, поэтому, вероятно, это правильный путь:
In [34]: pandas.isnull(pandas.NaT)
Out[34]: True
In [35]: pandas.isnull(numpy.datetime64('NaT'))
Out[35]: True
Вы также можете использовать pandas.isna () для pandas.NaT, numpy.nan или 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]
pd.NaT is pd.NaT
Правда
это работает для меня.
Если он находится в Series (например, столбец DataFrame), вы также можете использовать .isna():
pd.Series(pd.NaT).isna()
# 0 True
# dtype: bool
pd.isnullтакже работает с NaT.