Как проверить, является ли переменная pd.NaT?

Я пытаюсь проверить, является ли одна из моих переменных pd.NaT. Я знаю, что это NaT, и все же он не пройдет тест. В качестве примера следующий код ничего не печатает:

a=pd.NaT

if a == pd.NaT:
    print("a not NaT")

У кого-нибудь есть ключ ? Есть ли способ эффективно проверить, является ли a NaT?

pd.isnull также работает с NaT.
cs95 22.03.2018 18:50
pandas и numpy следуют стандарту, который NaN сам себе не приравнивает. так что даже если вы наберете a == a, вы получите False
ALollz 22.03.2018 18:54

Голосование за повторное открытие, потому что pandas.NaT на самом деле не является NumPy NaT и ведет себя по-разному при проверках равенства и numpy.isnat.

user2357112 supports Monica 22.03.2018 19:01

@ALollz: NumPy на самом деле этого еще не делает; есть FutureWarning, говорящий, что они планируют это сделать, но пока numpy.datetime64('NaT') == numpy.datetime64('NaT').

user2357112 supports Monica 22.03.2018 19:21
Связанный: Numpy: проверка, является ли значение NaT
jpp 22.03.2018 19:22

@ user2357112 Спасибо за внимание! Хорошо знать.

ALollz 22.03.2018 19:48
67
6
76 196
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

Другие вопросы по теме