81 votes

comment tester si une variable est pd.NaT ?

J'essaie de tester si une de mes variables est pd.NaT. Je sais qu'elle est NaT, mais elle ne passe toujours pas le test. À titre d'exemple, le code suivant n'imprime rien :

a=pd.NaT

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

Quelqu'un a-t-il une idée ? Existe-t-il un moyen de tester efficacement si a est NaT ?

2 votes

pd.isnull fonctionne également pour les NaT.

1 votes

pandas y numpy suivre la norme qui NaN n'est pas égal à lui-même. donc même si vous avez tapé a == a vous obtiendriez False

4 votes

Voter la réouverture parce que pandas.NaT n'est pas réellement un NumPy NaT et il se comporte différemment en cas d'égalité et de numpy.isnat des contrôles.

130voto

user2357112 Points 37737

Pandas NaT se comporte comme une virgule flottante NaN dans la mesure où il n'est pas égal à lui-même. À la place, vous pouvez utiliser pandas.isnull :

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

Cela renvoie également True pour None et NaN.

Techniquement, vous pourriez également vérifier les Pandas NaT con x != x en suivant un modèle commun utilisé pour les NaN en virgule flottante. Cependant, cela risque de poser des problèmes avec les NaT de NumPy, qui sont très similaires et représentent le même concept, mais sont en fait 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 à vérifier pour 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 à la fois pour les NaT de Pandas et de NumPy, et c'est donc probablement la meilleure solution :

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

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

11voto

Long Bu Points 321
pd.NaT is pd.NaT

Véritable

cela fonctionne pour moi.

9voto

Lukas Points 11

Vous pouvez également utiliser pandas.isna() pour pandas.NaT, numpy.nan ou 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]

2voto

Max Ghenis Points 400

Si c'est dans un Series (par exemple DataFrame ), vous pouvez également utiliser .isna() :

pd.Series(pd.NaT).isna()
# 0    True
# dtype: bool

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X