删除dtype datetime的NaT

21 投票
4 回答
71586 浏览
提问于 2025-04-18 16:05

我正在准备一个 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                 

撰写回答