我有时间戳传感器数据。由于技术细节,我以大约一分钟的间隔从传感器获取数据。数据可能如下所示:
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小时进行插值处理。
resample
在统计相同组中出现两个或更多观察值时会进行平均处理,不是吗? - Kartikgroupby().apply
释放了GIL)... - Kartik