Pandas转索引为DatetimeIndex后resample仍报RangeIndex错误
报错原因
报错根源是KNNImputer.fit_transform()的返回值是不带索引信息的NumPy数组。你在构建填充后的DataFrame ts_data_d时,仅传入了列名参数columns=ts_data_w.columns,没有同步传入原有的时间索引,导致ts_data_d自动生成了从0开始计数的默认RangeIndex,不满足resample要求的DatetimeIndex/TimedeltaIndex/PeriodIndex索引条件。
你之前对ts_data_w做的DatetimeIndex转换本身是有效的,但索引信息在KNN填充的转换步骤中被丢弃了,和你之前做的索引类型转换操作没有关系。
修复方案
任选以下一种方式修改即可:
- 方案1:构造填充后DataFrame时直接传入原时间索引
修改KNN填充部分的代码,在pd.DataFrame参数中补充index配置:
# KNN缺失值填充 imputer_knn = KNNImputer(n_neighbors=5, weights='uniform', metric='nan_euclidean') ts_data_d = pd.DataFrame( imputer_knn.fit_transform(ts_data_w), columns=ts_data_w.columns, index=ts_data_w.index # 保留原DatetimeIndex )
修改后ts_data_d会直接继承ts_data_w的时间索引,后续月度重采样代码可正常运行。
- 方案2:填充完成后补设时间索引
如果不想修改DataFrame构造逻辑,可在KNN填充完成后、重采样代码之前,补充一行索引赋值代码:
ts_data_d.index = ts_data_w.index
最终效果和方案1完全一致。
额外优化提示
你代码中多次重复执行ts_data.index = pd.DatetimeIndex(ts_data.index)属于冗余操作:pd.date_range()生成的对象本身就是标准DatetimeIndex类型,reindex操作后ts_data_w的索引已经是合法的时间类型索引,不需要重复做类型转换,后续做数据转换时注意保留索引即可。
内容的提问来源于stack exchange,提问作者v_head
相关产品推荐
相关产品推荐

