这是我问的一个类似问题的变体:用pandas 填充最后已知的数据
简而言之,我想知道如何转发填充时间序列数据,同时注意每个数据点的ID。
ergo,这个
2014-07-24 17:49:00 5 1046.0 -3.0 -239.0 2800.0
...
2015-05-05 15:00:00 2 NaN NaN NaN 2680
2015-05-05 15:00:00 3 0989 0020 -0011 2680
2015-05-05 15:00:00 4 1022 0060 -0076 2600
2015-05-05 15:00:00 5 NaN NaN NaN 2623
成为
2015-05-05 15:00:00 2 NaN NaN NaN 2680
2015-05-05 15:00:00 3 0989 0020 -0011 2680
2015-05-05 15:00:00 4 1022 0060 -0076 2600
2015-05-05 15:00:00 5 1046 -3.0 -239.0 2623
注意ID=5的最后已知数据来自2014-07-24 17:49:00
现在的变化是做同样的事情,只是它应该考虑数据的"有效期"。我尝试做的是分配一个datetimeIndex
,然后从该空闲时间段df[start:end]
中切片数据帧,然后修复我之前的问题。
然而,这导致了一个单独的子集,而不是我的"大"数据帧。我需要的是对我的"大数据帧"进行操作,并能够移动这个窗口和所有数据。
您可以groupby
"id"列,然后调用ffill
:
In [95]:
df.groupby(['id'], as_index=False).ffill()
Out[95]:
datetime id a b c d
0 2014-07-24 17:49:00 5 1046 -3 -239 2800
1 2015-05-05 15:00:00 2 NaN NaN NaN 2680
2 2015-05-05 15:00:00 3 989 20 -11 2680
3 2015-05-05 15:00:00 4 1022 60 -76 2600
4 2015-05-05 15:00:00 5 1046 -3 -239 2623
Pandas有一个TimeGrouper对象,它可以帮助您对具有Datetime按时间间隔索引。分组操作可以通过'id'
:嵌套到另一组
import numpy as np
import pandas as pd
df = pd.DataFrame([['2014-07-24 17:49:00', 5, 1046.0, -3, -239, 2800],
['2015-05-05 15:00:00', 2, np.nan, np.nan,np.nan, 2680],
['2015-05-05 15:00:00', 3, 989, 20, -11, 2680],
['2015-05-05 15:00:00', 4, 1022, 60, -76, 2600],
['2015-05-05 15:00:00', 5, np.nan, np.nan, np.nan, 2623]],
columns='timestamp id A B C D'.split())
df['timestamp'] = pd.DatetimeIndex(df['timestamp'])
df = df.set_index(['timestamp'])
print(df.groupby(pd.TimeGrouper('300D'), group_keys=False)
.apply(lambda grp: grp.set_index(['id'], append=True)
.groupby(level='id').ffill()))
产生
A B C D
timestamp id
2014-07-24 17:49:00 5 1046 -3 -239 2800
2015-05-05 15:00:00 2 NaN NaN NaN 2680
3 989 20 -11 2680
4 1022 60 -76 2600
5 1046 -3 -239 2623