我有这个数据框。我的数据框包含ID,时间和值以及缺口(小时)。我正在独立于每个ID进行重新采样。间隔列给出两个不同时间之间的连续时间间隔。我每10分钟进行一次重新采样,并且如果连续的间隙大于0.86 Hr,我想停止重新采样,并返回下一行作为原始行,并在发现相同条件时再次继续重新采样。我的差距情况像这样
a (abs(a-b))
b 0
样本数据
ID,Time,Value,Gaps
1,1523147332607,2,0.3347541666666667
1,1523148537722,5,0.17346666666666666
1,1523149162202,6,1.6252830555555555
1,1523155013221,4,0.33290027777777775
1,1523156211662,7,0.3722580555555556
1,1523157551791,10,0.0
2,1523156211662,5,0.5115911111111111
2,1523158053390,2,0.3405525
2,1523159279379,9,1.3295477777777778
2,1523164065751,3,0.0
如您所见,ID 1的间隙超过0.86 Hr,所以我的想法是在该点停止重新采样。像这样
ID,Time,Value,Gaps
1,1523147332607,2,0.3347541666666667
...................................
1,1523148537722,5,0.17346666666666666
...................................
...................................
1,1523149162202,6,1.6252830555555555
因此,我要继续对此进行重新采样,Time period 1523149162202并且在没有更多采样要做时,我希望将此最后一行返回为原始行,即
1,1523149162202,6,1.6252830555555555
然后,我要继续从下一行重新采样
1,1523155013221,4,0.33290027777777775
1,1523156211662,7,0.3722580555555556
1,1523157551791,10,0.0
这继续
对于每个ID的正常重采样,
df = df.set_index(['Time'])
df.index = pd.to_datetime(df.index, unit='ms')
df = (df.groupby('ID', axis=0)['Value']
.resample('10min')
.mean()
.groupby(level=0)
.apply(lambda x: x.interpolate()).reset_index())
但是,如何跟踪每个重新采样,以便在遇到某些条件时可以停止重新采样,并在最后的采样部分返回原始行。然后,它从下一行再次继续相同的条件。我当时想使用,np.where但我离实现这一目标还遥遥无期。有什么建议 ?
解决方案
一种方法是在中创建一个临时列'ID_res'df,在更改ID时或在间隙超过0.86之后的行中递增数字,例如:
df.loc[(df['ID'] != df['ID'].shift())| (df['Gaps'].shift() > 0.86),'ID_res'] = 1
df['ID_res'] = df['ID_res'].cumsum().ffill()
所以您的df看起来像:
ID Value Gaps ID_res
Time
2018-04-08 00:28:52.607 1 2 0.334754 1.0
2018-04-08 00:48:57.722 1 5 0.173467 1.0
2018-04-08 00:59:22.202 1 6 1.625283 1.0
2018-04-08 02:36:53.221 1 4 0.332900 2.0
2018-04-08 02:56:51.662 1 7 0.372258 2.0
2018-04-08 03:19:11.791 1 10 0.000000 2.0
2018-04-08 02:56:51.662 2 5 0.511591 3.0
2018-04-08 03:27:33.390 2 2 0.340553 3.0
2018-04-08 03:47:59.379 2 9 1.329548 3.0
2018-04-08 05:07:45.751 2 3 0.000000 4.0
现在,您可以使用在“ ID_res”上进行第一个分组依据时使用的方法,同时保留“ ID”和“ Value”列,并在结尾处删除“ ID_res”列,因为不再需要它:
df = (df.groupby('ID_res', axis=0)['ID','Value'].resample('10min').mean()
.groupby(level=0).apply(lambda x: x.interpolate())
.reset_index().drop('ID_res',1))
结果看起来像:
Time ID Value
0 2018-04-08 00:20:00 1.0 2.0
1 2018-04-08 00:30:00 1.0 3.5
2 2018-04-08 00:40:00 1.0 5.0
3 2018-04-08 00:50:00 1.0 6.0
4 2018-04-08 02:30:00 1.0 4.0
5 2018-04-08 02:40:00 1.0 5.5
6 2018-04-08 02:50:00 1.0 7.0
...
在第3行和第4行之间没有重新采样的情况下,原始值与这些值之间的“间隙”超过0.86df