Eliminar dtype datetime NaT

Estoy preparando un pandas df para la salida, y me gustaría eliminar el NaN y el NaT de la tabla, y dejar esas ubicaciones en blanco. Un ejemplo sería

mydataframesample col1 col2 timestamp ab 2014-08-14 c NaN NaT 

se convertiría

 col1 col2 timestamp ab 2014-08-14 c 

La mayoría de los valores son objetos dtypes, con la columna de marca de tiempo datetime64 [ns]. Para solucionar este problema, intenté usar mydataframesample.fillna(' ') panda para dejar un espacio en la ubicación. Sin embargo, esto no funciona con los tipos de fecha y hora. Para solucionar esto, estoy tratando de convertir la columna de marca de tiempo de nuevo al tipo de objeto o cadena.

¿Es posible eliminar el NaN / NaT sin hacer la conversión de tipo? Si no es así, ¿cómo hago la conversión de tipos (bash con str () y astype (str) pero dificultad para que datetime sea el formato original)?

Esto no ganará ningún premio de velocidad, pero si el DataFrame no es demasiado largo, la reasignación utilizando una lista de comprensión hará el trabajo:

 df1['date'] = [d.strftime('%Y-%m-%d') if not pd.isnull(d) else '' for d in df1['date']] 

 import numpy as np import pandas as pd Timestamp = pd.Timestamp nan = np.nan NaT = pd.NaT df1 = pd.DataFrame({ 'col1': list('ac'), 'col2': ['b', nan], 'date': (Timestamp('2014-08-14'), NaT) }) df1['col2'] = df1['col2'].fillna('') df1['date'] = [d.strftime('%Y-%m-%d') if not pd.isnull(d) else '' for d in df1['date']] print(df1) 

rendimientos

  col1 col2 date 0 ab 2014-08-14 1 c 

Tuve el mismo problema: esto lo hace todo en su lugar usando la función de aplicación de pandas. Debería ser el método más rápido.

 import pandas as pd df['timestamp'] = df['timestamp'].apply(lambda x: x.strftime('%Y-%m-%d')if not pd.isnull(x) else '') 

Si su campo de marca de tiempo aún no está en el formato de datetime y datetime , entonces:

 import pandas as pd df['timestamp'] = pd.to_datetime(df['timestamp']).apply(lambda x: x.strftime('%Y-%m-%d')if not pd.isnull(x) else '') 

La respuesta de @unutbu funcionará bien, pero si no desea modificar el dataframe, podría hacer algo como esto. to_html toma un parámetro sobre cómo se representa NaN , para manejar la NaT que necesita para pasar una función de formato personalizado.

 date_format = lambda d : pd.to_datetime(d).strftime('%Y-%m-%d') if not pd.isnull(d) else '' df1.to_html(na_rep='', formatters={'date': date_format}) 

Si todo lo que quieres hacer es convertir a una cadena:

 In [37]: df1.to_csv(None,sep=' ') Out[37]: ' col1 col2 date\n0 ab "2014-08-14 00:00:00"\n1 c \n' 

Para reemplazar los valores perdidos con una cadena

 In [36]: df1.to_csv(None,sep=' ',na_rep='missing_value') Out[36]: ' col1 col2 date\n0 ab "2014-08-14 00:00:00"\n1 c missing_value missing_value\n'