删除dtype datetime NaT

时间:2014-08-05 14:48:16

标签: python pandas

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

mydataframesample 

col1    col2     timestamp
a       b        2014-08-14
c       NaN      NaT

会变成

col1    col2     timestamp
a       b        2014-08-14
c       

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

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

4 个答案:

答案 0 :(得分:11)

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

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

如果您的时间戳字段尚未采用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 '')

答案 1 :(得分:10)

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

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)

产量

  col1 col2        date
0    a    b  2014-08-14
1    c                 

答案 2 :(得分:3)

@ unutbu的答案可以正常使用,但是如果你不想修改DataFrame,你可以这样做。 to_html获取了NaN表示方式的参数,以处理您需要传递自定义格式设置功能的NaT

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})

答案 3 :(得分:0)

如果您要做的只是转换为字符串:

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

用字符串

替换缺失值
In [36]: df1.to_csv(None,sep=' ',na_rep='missing_value')
Out[36]: ' col1 col2 date\n0 a b "2014-08-14 00:00:00"\n1 c missing_value missing_value\n'
相关问题