我正在尝试使用Pandas 0.24的经过改进的resampler()对象。我有一个准随机采样车速的数据框。记录器在移动时的采样周期约为1s +/- 100ms,在停止时的采样周期约为30s。
数据可能看起来像这样:
0 1 2 0 2 5 7 3 0 3 3 3 1 0
我想将数据调整为1s间隔,但又不丢失零速间隔。这比我原本想的要难得多,主要是因为我想填充零个周期,然后将非零个周期内插到正则索引上。
问题:
通常来说,您将如何处理这一由两部分组成的填充/内插过程?
是否有一个类似于旧resample(how=None)
逻辑的现代模拟,可以让我向索引添加规则化的时间戳,而无需添加虚假数据?
我是不是坚持循环填充零周期,还是有某种apply()魔术可以让我做一个有条件的ffill()?
示例数据:
orig = [0.0, 0.0, 1.5, 2.0, 1.5, 2.0, 1.0, 0.0, 0.0, 3.5]
idx = pd.DatetimeIndex(['2018-12-19 16:50:51+00:00',
'2018-12-19 16:50:51.400000+00:00',
'2018-12-19 16:50:57.500000+00:00',
'2018-12-19 16:50:57.600000+00:00',
'2018-12-19 16:51:12.500000+00:00',
'2018-12-19 16:51:16.400000+00:00',
'2018-12-19 16:51:18.400000+00:00',
'2018-12-19 16:51:20.400000+00:00',
'2018-12-19 16:51:22.500000+00:00',
'2018-12-19 16:51:24.500000+00:00'])
df = pd.DataFrame(orig,index=idx)
df.plot(figsize=(18,4))
请注意,该图显示的是错误的速度提升,该速度以57.5秒结束。速度应该一直为零直到57秒,然后在58秒升至1.5。
答案 0 :(得分:0)
自然,经过三天的研究,我在发布大约十分钟后就得出了一个合理的答案。
# First create a dummy with the correct index, but containing only the zero periods.
ff = df.asfreq('1s',method='ffill')
dummy1 = ff[ff==0.0]
# Then use 'time' interpolation
dummy2 = dummy1.combine_first(df).interpolate('time')
# Combine_first adds missing rows from the 2nd dataframe, so resample again
solution = dummy2.asfreq('1s')
最后删除的样本很不雅观,但对我而言不是问题;我的日志总是以零结尾。我很好奇。如果您有一种使初始的ffill()包含最终样本的优雅方法,请发布。