这是我提出的类似问题的变体: filling last known data with pandas
简而言之,我想知道如何转发填充时间序列数据,同时注意每个数据点的ID。
麦角, 此
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
,然后从该vaild时间段df[start:end]
切片数据帧,然后对我之前的问题进行修复。
答案 0 :(得分:1)
答案 1 :(得分:0)
Pandas有一个TimeGrouper object可以帮助您对具有。的数据框进行分组
DatetimeIndex按时间间隔。
Groupby operations can then be
nested进一步按'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