web-dev-qa-db-fra.com

comment tester si une variable est pd.NaT?

J'essaie de tester si l'une de mes variables est pd.NaT. Je sais que c'est NaT, et il ne passera toujours pas le test. Par exemple, le code suivant n'imprime rien:

a=pd.NaT

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

Est-ce que quelqu'un a un indice? Existe-t-il un moyen de tester efficacement si a est NaT?

20
Clément F

Les pandas NaT se comportent comme un NaN à virgule flottante, en ce sens qu’ils ne sont pas égaux à eux-mêmes. Au lieu de cela, vous pouvez utiliser pandas.isnull:

In [21]: pandas.isnull(pandas.NaT)
Out[21]: True

Ceci retourne également True pour None et NaN.

Techniquement, vous pouvez aussi vérifier Pandas NaT avec x != x, suivant un modèle commun utilisé pour NaN à virgule flottante. Toutefois, cela est susceptible de poser des problèmes avec les NaP NumPy, qui se ressemblent beaucoup et représentent le même concept, mais qui sont en réalité d'un type différent avec un comportement différent:

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, la fonction pour vérifier NumPy NaT, échoue également avec un 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 fonctionne pour les deux Pandas et NumPy NaTs, donc c'est probablement la voie à suivre:

In [34]: pandas.isnull(pandas.NaT)
Out[34]: True

In [35]: pandas.isnull(numpy.datetime64('NaT'))
Out[35]: True
36
user2357112