删除dtype datetime的NaT
我正在准备一个 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
大部分值的类型是对象(object),而时间戳这一列的类型是 datetime64[ns]。为了处理这个问题,我尝试使用 pandas 的 mydataframesample.fillna(' ')
方法,想在这些位置留一个空格。但是,这个方法对时间类型不管用。为了绕过这个问题,我想把时间戳这一列转换回对象或字符串类型。
有没有办法在不进行类型转换的情况下去掉 NaN/NaT?如果不行的话,我该怎么进行类型转换呢?我试过 str() 和 astype(str),但在处理原本是时间格式的情况下遇到了困难。
4 个回答
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'
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})
22
我也遇到过同样的问题:这个方法使用了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 '')
14
这个方法可能不会很快,但如果你的数据表(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