J'ai un df comme ça:
a b c
1 NaT w
2 2014-02-01 g
3 NaT x
df=df[df.b=='2014-02-01']
va me donner
a b c
2 2014-02-01 g
Je veux une base de données de toutes les lignes avec NaT dans la colonne b?
df=df[df.b==None] #Doesn't work
Je veux ceci:
a b c
1 NaT w
3 NaT x
isnull
et notnull
fonctionnent avec NaT
afin que vous puissiez les manipuler de la même manière que vous manipulez NaNs
:
>>> df
a b c
0 1 NaT w
1 2 2014-02-01 g
2 3 NaT x
>>> df.dtypes
a int64
b datetime64[ns]
c object
utilisez simplement isnull
pour sélectionner:
df[df.b.isnull()]
a b c
0 1 NaT w
2 3 NaT x
Pour les personnes intéressées, dans mon cas, je voulais supprimer le NaT contenu dans le DateTimeIndex d'un cadre de données. Je ne pouvais pas utiliser directement la construction notnull proposée par Karl D. Vous devez d'abord créer une colonne temporaire à partir de l'index, puis appliquer le masque, puis supprimer à nouveau la colonne temporaire.
df["TMP"] = df.index.values # index is a DateTimeIndex
df = df[df.TMP.notnull()] # remove all NaT values
df.drop(["TMP"], axis=1, inplace=True) # delete TMP again
En utilisant votre exemple dataframe:
df = pd.DataFrame({"a":[1,2,3],
"b":[pd.NaT, pd.to_datetime("2014-02-01"), pd.NaT],
"c":["w", "g", "x"]})
Jusqu'à la v0.17, cela ne fonctionnait pas:
df.query('b != b')
et vous deviez faire:
df.query('b == "NaT"') # yes, surprisingly, this works!
Depuis la v0.17, les deux méthodes fonctionnent, bien que je ne recommande que la première.
Je pense que le commentaire de @DSM mérite une réponse en soi, car cela répond à la question fondamentale.
Le malentendu vient de l'hypothèse selon laquelle pd.NaT
agit comme None
. Cependant, alors que None == None
renvoie True
, pd.NaT == pd.NaT
renvoie False
. Les pandas NaT
se comportent comme une NaN
à virgule flottante, qui n'est pas égale à elle-même.
Comme l'explique la réponse précédente, vous devriez utiliser
df[df.b.isnull()] # or notnull(), respectively