删除dtype datetime NaT

use*_*394 13 python pandas

我正在为输出准备一个pandas df,并希望删除表中的NaN和NaT,并将这些表位置留空.一个例子是

mydataframesample 

col1    col2     timestamp
a       b        2014-08-14
c       NaN      NaT
Run Code Online (Sandbox Code Playgroud)

会成为

col1    col2     timestamp
a       b        2014-08-14
c       
Run Code Online (Sandbox Code Playgroud)

大多数值都是dtypes对象,timestamp列是datetime64 [ns].为了解决这个问题,我尝试使用熊猫mydataframesample.fillna(' ')来有效地在该位置留出空间.但是,这不适用于日期时间类型.为了解决这个问题,我试图将timestamp列转换回对象或字符串类型.

是否可以在不进行类型转换的情况下移除NaN/NaT?如果没有,我如何进行类型转换(尝试str()和astype(str)但是datetime是原始格式的困难)?

Ale*_*ane 14

我有同样的问题:这使用pandas apply函数完成所有操作.应该是最快的方法.

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

如果您的时间戳字段尚未datetime格式化,则:

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 '')
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 11

这不会赢得任何速度奖励,但如果DataFrame不太长,使用列表理解进行重新分配将完成工作:

df1['date'] = [d.strftime('%Y-%m-%d') if not pd.isnull(d) else '' for d in df1['date']]
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)

产量

  col1 col2        date
0    a    b  2014-08-14
1    c                 
Run Code Online (Sandbox Code Playgroud)