用熊猫中的大纪元取代NaT

时间:2015-06-14 14:53:13

标签: python python-2.7 datetime pandas

NaT缺失值出现在我的数据帧的末尾,如下所示。这可以理解地引发了ValueError:

  

File" /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pytz/tzinfo.py" ;,第314行,本地化       loc_dt = tzinfo.no​​rmalize(dt.replace(tzinfo = tzinfo))   ValueError:month必须在1..12

我试图同时使用dropna:

data[col_name].dropna(0, inplace=True)

和fillna,受到Working with Missing Data section

的鼓励
data[col_name].fillna(0, inplace=True)

在其中任何一行之前,我试图通过用纪元时间替换非日期时间来清理数据:

data[col_name] = a_col.apply(lambda x: x if isinstance(x, datetime.datetime)  else epoch)

因为NaT在技术上是一个日期时间,所以这个条件没有被该功能覆盖。由于isnull将处理此问题,因此我编写了此函数以应用于数据[col_name]:

def replace_time(x):
if pd.isnull(x):
    return epoch
elif isinstance(x, datetime.datetime):
    return x
else:
    return epoch

尽管它进入了pd.isnull部分,但值并未改变。但是,当我在这个系列上尝试该功能时(其中第二个值是NaT),它可以工作:

s = pd.Series([pd.Timestamp('20130101'),np.nan,pd.Timestamp('20130102 9:30')],dtype='M8[ns]')

数据:

  

2003-04-29 00:00:00

     

的NaT

     

的NaT

     

的NaT

2 个答案:

答案 0 :(得分:2)

尝试:

john_sam01 [TIF 15355474840].jpg

答案 1 :(得分:2)

这里的主要问题是你是通过这个表达式链式索引

data[col_name].dropna(0, inplace=True)

这可能会修改副本,因此实际上不会发生任何变化。实际上它显示SettingWithCopy警告是非常棘手的。请参阅文档here

.fillna/.dropna是填充datetime64[ns] dtypes的合适方法。使用.apply是非常低效的。

In [16]: df = DataFrame({ 'date' : pd.Series([pd.Timestamp('20130101'),np.nan,pd.Timestamp('20130102 9:30')]) })

In [17]: df
Out[17]: 
                 date
0 2013-01-01 00:00:00
1                 NaT
2 2013-01-02 09:30:00

In [18]: df.date.fillna(0)
Out[18]: 
0   2013-01-01 00:00:00
1   1970-01-01 00:00:00
2   2013-01-02 09:30:00
Name: date, dtype: datetime64[ns]