【问题标题】:Replacing NaT with Epoch in Pandas在 Pandas 中用 Epoch 替换 NaT
【发布时间】:2015-08-30 02:22:45
【问题描述】:

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

文件“/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: 月份必须在 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 会处理这个,所以我写了这个函数来应用到data[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

【问题讨论】:

  • 你使用的是什么版本的 pandas 和 numpy? dropnafillna 不是已经在做你想做的事了吗?
  • Numpy 是 1.8.0rc1。熊猫是 0.16.1

标签: python python-2.7 datetime pandas


【解决方案1】:

试试:

data[col_name] = a_col.apply(lambda x: x if isinstance(x, datetime.datetime) 
                                       and not isinstance(x, pd.tslib.NaTType) else epoch)

【讨论】:

  • 不能喜欢这个。
【解决方案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]

【讨论】:

  • 这是一种更有效的方法,应该是公认的答案
猜你喜欢
  • 2017-08-06
  • 2018-08-20
  • 1970-01-01
  • 2018-05-19
  • 2020-04-07
  • 1970-01-01
  • 2017-06-20
  • 2020-05-24
  • 1970-01-01
相关资源
最近更新 更多