在Pandas数据框中用NaT替换日期

时间:2014-07-17 12:38:07

标签: pandas dataframe

我有一个带有datetime64类型列的数据框。在这一列中有几行日期为1999-09-09 23:59:59,因为它们应该实际上表示为缺少日期NaT。有人刚决定使用这个特定日期来表示缺失的数据。现在我希望将这些日期替换为NaT(Pandas的缺失日期类型)。

此外,如果我使用NaT执行此列的操作,例如

df['date'] - df['column with missing date']

Pandas是否忽略了缺少的日期并为这些行维护NaT,或者它会在Java中抛出一些错误,例如Null指针异常。

2 个答案:

答案 0 :(得分:6)

In [6]:
import pandas as pd
df = pd.DataFrame({'date':[pd.datetime(1999,9,9,23,59,59), pd.datetime(2014,1,1)]* 10})
df
Out[6]:
                  date
0  1999-09-09 23:59:59
1  2014-01-01 00:00:00
2  1999-09-09 23:59:59
3  2014-01-01 00:00:00
4  1999-09-09 23:59:59
5  2014-01-01 00:00:00
6  1999-09-09 23:59:59
7  2014-01-01 00:00:00
8  1999-09-09 23:59:59
9  2014-01-01 00:00:00
10 1999-09-09 23:59:59
11 2014-01-01 00:00:00
12 1999-09-09 23:59:59
13 2014-01-01 00:00:00
14 1999-09-09 23:59:59
15 2014-01-01 00:00:00
16 1999-09-09 23:59:59
17 2014-01-01 00:00:00
18 1999-09-09 23:59:59
19 2014-01-01 00:00:00
In [9]:

import numpy as np
df.loc[df['date'] == '1999-09-09 23:59:59 ', 'date'] = pd.NaT
df
Out[9]:
         date
0         NaT
1  2014-01-01
2         NaT
3  2014-01-01
4         NaT
5  2014-01-01
6         NaT
7  2014-01-01
8         NaT
9  2014-01-01
10        NaT
11 2014-01-01
12        NaT
13 2014-01-01
14        NaT
15 2014-01-01
16        NaT
17 2014-01-01
18        NaT
19 2014-01-01

为了回答你的第二个问题,大多数熊猫功能都能正确处理NaN,你可以随时删除它们:

In [10]:

df.dropna()
Out[10]:
         date
1  2014-01-01
3  2014-01-01
5  2014-01-01
7  2014-01-01
9  2014-01-01
11 2014-01-01
13 2014-01-01
15 2014-01-01
17 2014-01-01
19 2014-01-01

并在这些行上执行操作

答案 1 :(得分:1)

有些操作(尤其是在列之间)不会忽略NaN或NaT。这就是为什么您获得NaT的原因。 如果您不希望1999-09-09 23:59:59并且也有一个可减去的列,请尝试转换为NaT,然后将NaT交换为零(.fillna(0)),以便在减去时将其替换为NaT。将从另一列保留该值。