如何用未来一周数据替换时间序列价格列的缺失值(Python)
解决时间序列缺失值替换问题
先点明你代码里的核心问题:
- 用
replace把指定日期范围的值换成字符串'NaN'是错误的,pandas识别的缺失值是np.nan,字符串'NaN'不会被当作缺失值处理,后续操作会出问题。 - 后续用
replace批量替换的逻辑不对,replace是按值匹配替换,不是按位置批量赋值,达不到你想要的效果。
下面是正确的实现步骤:
1. 正确创建带缺失值的时间序列DataFrame
不用绕弯子用replace,直接通过索引定位赋值np.nan更直接:
import pandas as pd import numpy as np # 创建日期索引和随机数据 time = pd.date_range(start='2015-01-01', end='2015-01-20', freq='D') sampl = np.random.uniform(low=-4.5, high=34.0, size=(20,)) df = pd.DataFrame({"prices": sampl}, index=time) # 将指定日期范围设为缺失值(pandas标准缺失值) df.loc['2015-01-01':'2015-01-07', 'prices'] = np.nan
2. 筛选缺失值所在行
如果要查看指定日期范围的缺失值行,直接索引定位即可:
# 筛选2015-01-01至2015-01-07的缺失值行 missing_rows = df.loc['2015-01-01':'2015-01-07'] print(missing_rows) # 如果要筛选整个DataFrame中所有prices列有缺失值的行 all_missing_rows = df[df['prices'].isna()]
3. 用未来一周的值替换缺失值
因为索引是连续的时间序列,直接把未来一周的值赋值到缺失范围即可,注意加.values避免索引对齐问题:
# 用2015-01-08至2015-01-14的值替换2015-01-01至2015-01-07的缺失值 df.loc['2015-01-01':'2015-01-07', 'prices'] = df.loc['2015-01-08':'2015-01-14', 'prices'].values
针对你的原始小时数据的适配
你的原始数据是小时级(2015-01-01 00:00到2015-12-31 23:00),缺失范围是2015-01-01至2015-01-04,处理逻辑完全一致:
# 假设你的原始DataFrame名为raw_df # 1. 确保索引是datetime类型(如果不是先转换) raw_df.index = pd.to_datetime(raw_df.index) # 2. 若原始数据未自动标记缺失值,手动设置缺失范围 raw_df.loc['2015-01-01':'2015-01-04', 'prices'] = np.nan # 3. 用之后4天的小时数据替换缺失值 raw_df.loc['2015-01-01':'2015-01-04', 'prices'] = raw_df.loc['2015-01-05':'2015-01-08', 'prices'].values
内容的提问来源于stack exchange,提问作者pdata
相关产品推荐
相关产品推荐

