Filtrado de todas las filas con NaT en una columna en Dataframe python

Tengo un df como este:

abc 1 NaT w 2 2014-02-01 g 3 NaT x df=df[df.b=='2014-02-01'] 

me dará

  abc 2 2014-02-01 g 

Quiero una base de datos de todas las filas con NaT en la columna b?

  df=df[df.b==None] #Doesn't work 

Quiero esto:

  abc 1 NaT w 3 NaT x 

isnull y notnull funciona con NaT para que pueda manejarlos de la misma manera que maneja NaNs :

 >>> df abc 0 1 NaT w 1 2 2014-02-01 g 2 3 NaT x >>> df.dtypes a int64 b datetime64[ns] c object 

solo usa isnull para seleccionar:

 df[df.b.isnull()] abc 0 1 NaT w 2 3 NaT x 

Para aquellos interesados, en mi caso, quise descartar el NaT contenido en el DateTimeIndex de un dataframe. No pude usar directamente la construcción notnull como sugirió Karl D. Primero debe crear una columna temporal a partir del índice, luego aplicar la máscara y luego eliminar la columna temporal nuevamente.

 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 

Usando su dataframe de ejemplo:

 df = pd.DataFrame({"a":[1,2,3], "b":[pd.NaT, pd.to_datetime("2014-02-01"), pd.NaT], "c":["w", "g", "x"]}) 

Hasta v0.17 esto no solía funcionar:

 df.query('b != b') 

y tenias que hacer

 df.query('b == "NaT"') # yes, surprisingly, this works! 

Sin embargo, desde v0.17, ambos métodos funcionan, aunque solo recomendaría el primero.

Creo que el comentario de @DSM vale una respuesta por sí solo, porque esto responde a la pregunta fundamental.

El malentendido proviene del supuesto de que pd.NaT actúa como None . Sin embargo, mientras None == None devuelve True , pd.NaT == pd.NaT devuelve False . Pandas NaT comporta como un NaN punto flotante, que no es igual a sí mismo.

Como la respuesta anterior explica, debes usar

 df[df.b.isnull()] # or notnull(), respectively