时间序列数据:使用resample.mean()出现缺失值的原因咨询
重采样后出现大量缺失值的原因及解决办法
你遇到的这个情况其实很典型,先给你拆解下核心原因:那些显示NaN的5分钟时间区间,原始数据里根本没有任何对应的数据记录。
resample()方法的默认行为是生成一个连续的时间索引,覆盖你原始数据集的整个时间范围——不管某个5分钟区间里有没有数据,它都会把这个时间戳保留下来。当区间内没有数据时,均值聚合自然没有可计算的样本,结果就会是NaN。从你给出的缺失值区间(2021-07-26 17:00到2021-08-09 07:55)来看,这段时间你的原始数据应该是完全断档的,所以重采样后全是缺失值。
针对这个问题的几种解决办法:
- 过滤空区间(最常用)
如果这些没有数据的区间对你的分析没用,直接用dropna()剔除即可:
PrimaryBookF = PrimaryBookD.resample('5T', on='Time').mean().dropna() PrimaryBookG = PrimaryBookF.reset_index()
处理后结果里只会保留有原始数据支撑的5分钟区间,不会再有NaN。
填充缺失值(需保留连续时间轴时用)
要是你需要维持完整的时间序列,根据业务场景选择合适的填充方式:# 用前一个有效值填充(适合连续型数据,比如金融行情) PrimaryBookF = PrimaryBookD.resample('5T', on='Time').mean().ffill() # 用0填充(适合计数类数据,无数据时视为0) PrimaryBookF = PrimaryBookD.resample('5T', on='Time').mean().fillna(0) # 线性插值填充(适合数据平滑变化的场景) PrimaryBookF = PrimaryBookD.resample('5T', on='Time').mean().interpolate(method='linear')先确认原始数据的时间分布
你可以先排查下原始数据的时间断档情况,明确哪些区间真的没有数据:
# 查看原始数据的时间起止范围 print(PrimaryBookD['Time'].min(), PrimaryBookD['Time'].max()) # 统计每个5分钟区间的数据量,找出空区间 empty_intervals = PrimaryBookD.resample('5T', on='Time').count() print(empty_intervals[empty_intervals['A'] == 0])
这样能帮你更清晰地判断是数据本身的断档问题,还是其他异常。
内容的提问来源于stack exchange,提问作者Emmanuelle
相关产品推荐
相关产品推荐

