我的数据是每15秒一次.但是,有一些价值观缺失了.这些没有用NaN标记,但根本不存在.我该如何填写这些值?
我试图重新采样,但这也改变了原始数据.那么,为什么这不起作用:
a=pd.Series([1.,3.,4.,3.,5.],['2016-05-25 00:00:35','2016-05-25 00:00:50','2016-05-25 00:01:05','2016-05-25 00:01:35','2016-05-25 00:02:05'])
a.index=pd.to_datetime(a.index)
a.resample('15S').mean()
In [368]: a
Out[368]:
2016-05-25 00:00:35 1.0
2016-05-25 00:00:50 3.0
2016-05-25 00:01:05 4.0
2016-05-25 00:01:35 3.0
2016-05-25 00:02:05 5.0
dtype: float64
它告诉我这个:
2016-05-25 00:00:30 1.0
2016-05-25 00:00:45 3.0
2016-05-25 00:01:00 4.0
2016-05-25 00:01:15 NaN
2016-05-25 00:01:30 3.0
2016-05-25 00:01:45 NaN
2016-05-25 00:02:00 5.0
Freq: 15S, dtype: float64
所以,我在00:35或00:50不再有价值.
对于我原来的较大数据集,我最终在重采样数据的末尾看到大组中的许多NaN值.
我想做的事情是将我的15s数据重新采样到15s,所以每当特定时间内没有数据存在时,它应该使用它周围的值的平均值来填充它.有没有办法做到这一点?
另外,为什么重新采样时间基数会发生变化?我的原始数据从00:00:35开始,重新采样后从00:30开始?好像它被移动了5秒.
在我的示例数据中,它应该完成的所有内容在00:01:50创建了一个额外的数据条目.
编辑
我意识到我的数据比我想象的要复杂一些. “基础”实际上是通过它改变的.如果我使用下面的解决方案,那么它适用于部分数据,但随后值会停止更改.例如:
a = pd.Series([1.,3.,4.,3.,5.,6.,7.,8.], ['2016-05-25 00:00:35','2016-05-25 00:00:50','2016-05-25 00:01:05','2016-05-25 00:01:35','2016-05-25 00:02:05','2016-05-25 00:03:00','2016-05-25 00:04:00','2016-05-25 00:06:00'])
In [79]: a
Out[79]:
2016-05-25 00:00:35 1.0
2016-05-25 00:00:50 3.0
2016-05-25 00:01:05 4.0
2016-05-25 00:01:35 3.0
2016-05-25 00:02:05 5.0
2016-05-25 00:03:00 6.0
2016-05-25 00:04:00 7.0
2016-05-25 00:06:00 8.0
dtype: float64
In [80]: a.index = pd.to_datetime(a.index)
In [81]: a.resample('15S', base=5).interpolate()
Out[81]:
2016-05-25 00:00:35 1.0
2016-05-25 00:00:50 3.0
2016-05-25 00:01:05 4.0
2016-05-25 00:01:20 3.5
2016-05-25 00:01:35 3.0
2016-05-25 00:01:50 4.0
2016-05-25 00:02:05 5.0
2016-05-25 00:02:20 5.0
2016-05-25 00:02:35 5.0
2016-05-25 00:02:50 5.0
2016-05-25 00:03:05 5.0
2016-05-25 00:03:20 5.0
2016-05-25 00:03:35 5.0
2016-05-25 00:03:50 5.0
2016-05-25 00:04:05 5.0
2016-05-25 00:04:20 5.0
2016-05-25 00:04:35 5.0
2016-05-25 00:04:50 5.0
2016-05-25 00:05:05 5.0
2016-05-25 00:05:20 5.0
2016-05-25 00:05:35 5.0
2016-05-25 00:05:50 5.0
Freq: 15S, dtype: float64
正如您所看到的,它会在2:05之后停止插值,并且似乎在3:00,4:00和5:00忽略数据.
解决方法:
@IanS和@pirsquared都解决了基数的变化问题.至于填充NaNs:pandas有前向填充(.ffill()/ .pad())和后向填充(.bfill()/ .backfill())的方法,但不是用于取平均值.一种快速的方法是手动取平均值:
b = a.resample('15S', base=5)
(b.ffill() + b.bfill()) / 2
输出:
2016-05-25 00:00:35 1.0
2016-05-25 00:00:50 3.0
2016-05-25 00:01:05 4.0
2016-05-25 00:01:20 3.5
2016-05-25 00:01:35 3.0
2016-05-25 00:01:50 4.0
2016-05-25 00:02:05 5.0
Freq: 15S, dtype: float64
编辑:我纠正了:有一个内置的方法:.interpolate().
a.resample('15S', base=5).interpolate()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。