我有带时间戳的传感器数据。由于技术细节的原因,我从传感器获取数据大约间隔一分钟。数据可能如下所示:
tstamp val
0 2016-09-01 00:00:00 57
1 2016-09-01 00:01:00 57
2 2016-09-01 00:02:23 57
3 2016-09-01 00:03:04 57
4 2016-09-01 00:03:58 58
5 2016-09-01 00:05:00 60
现在,本质上,如果我在准确的时刻获得所有数据,我会非常高兴,但我没有。保存分布并获取每分钟数据的唯一方法是插值。例如,行索引 1 和 2 之间有 83 秒,获取精确分钟值的自然方法是在两行数据之间进行插值(在本例中为 57,但事实并非如此)到处)。
现在,我的方法是执行以下操作:
date = pd.to_datetime(df['measurement_tstamp'].iloc[0].date())
ts_d = df['measurement_tstamp'].dt.hour * 60 * 60 +\
df['measurement_tstamp'].dt.minute * 60 +\
df['measurement_tstamp'].dt.second
ts_r = np.arange(0, 24*60*60, 60)
data = scipy.interpolate.interp1d(x=ts_d, y=df['speed'].values)(ts_r)
req = pd.Series(data, index=pd.to_timedelta(ts_r, unit='s'))
req.index = date + req.index
但这对我来说感觉相当漫长和漫长。有一些出色的 pandas 方法可以进行重采样、舍入等。我一整天都在阅读它们,但事实证明没有什么可以按照我想要的方式进行插值。resample
工作原理就像groupby
并对落在一起的时间点进行平均。fillna
进行插值,但不在之后resample
已经通过平均改变了数据。
我是否遗漏了什么,或者我的方法是最好的吗?
为简单起见,假设我按天和传感器对数据进行分组,因此一次仅对一个传感器的 24 小时周期进行插值。
d = df.set_index('tstamp')
t = d.index
r = pd.date_range(t.min().date(), periods=24*60, freq='T')
d.reindex(t.union(r)).interpolate('index').ix[r]
Note, periods=24*60
适用于日常数据,而不适用于问题中提供的样本。对于该样本,periods=6
将工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)