微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 在pandas中填写时间数据

我的数据是每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] 举报,一经查实,本站将立刻删除。

相关推荐