Python pandas秒级数据重采样为毫秒级并线性插值方法
报错根因
resample 方法仅支持DatetimeIndex、TimedeltaIndex或PeriodIndex类型的索引作为时间基准,当前DataFrame使用的是默认生成的RangeIndex(行号索引),timestamp仅作为普通列存在,未被设为索引,因此触发类型错误。
修复实现代码
前置索引修复
首先将已经转好时区的timestamp列设置为DataFrame的时间索引:
# 将timestamp列设为索引 df = df.set_index('timestamp')
毫秒级重采样+线性插值
设置好索引后即可执行重采样操作,注意需要先通过聚合/频率转换将Resampler对象转为实际DataFrame,再执行插值:
# 1毫秒分辨率实现 # asfreq()会直接保留原始秒级点位的数值,其余新增毫秒点位填充为NaN df_interp = df.resample('1ms').asfreq().interpolate(method='linear')
如果同时间戳存在多条重复记录,可以把asfreq()替换为mean(),对同时间点的value取均值后再插值,逻辑更严谨。
低负载亚秒级方案
如果毫秒级数据量过大,可以调整重采样频率,只要频率小于1秒即可满足亚秒级精度要求,常用可选参数:
- 100毫秒(0.1秒)分辨率:采样规则传
'100ms',数据量仅为毫秒级的1/1000 - 10毫秒(0.01秒)分辨率:采样规则传
'10ms',数据量仅为毫秒级的1/100
以100毫秒分辨率为例,代码如下:
# 100毫秒低负载版本 df_interp = df.resample('100ms').asfreq().interpolate(method='linear')
注意事项
原始代码直接对Resampler对象调用
interpolate是错误写法,必须先通过asfreq()/mean()/sum()等聚合/频率转换方法生成结构化的时间序列DataFrame,才能执行插值操作。
内容的提问来源于stack exchange,提问作者LostinSpatialAnalysis
相关产品推荐
相关产品推荐

