如何仅在指定窗口内对周度时间序列数据执行插值计算?
周度数据窗口插值实现方案
核心实现思路
- 保留独立的原始数据集副本,全程不修改该数据,所有插值计算仅从该副本取数,从根源避免插值结果参与后续计算
- 每个目标日期单独执行插值逻辑,互相独立,不存在连续空值依赖问题
- 对每个目标日期单独筛选前后各2个最近的原始数据点参与计算
完整代码实现
import pandas as pd import numpy as np # ---------------------- 1. 原始数据预处理(全程不修改该部分数据) ---------------------- raw_df = pd.DataFrame({ 'date': ['1/01/2021', '7/01/2021', '14/01/2021', '28/01/2021'], 'value': [10, 10, 10, 10] }) # 日期转datetime格式并排序,转时间戳方便数值计算 raw_df['date'] = pd.to_datetime(raw_df['date'], dayfirst=True) raw_df = raw_df.sort_values('date').reset_index(drop=True) raw_dates_ts = raw_df['date'].view('int64').values raw_values = raw_df['value'].values # ---------------------- 2. 批量处理目标日期 ---------------------- list_dates = ['12/01/2021', '13/01/2021'] target_dates = pd.to_datetime(list_dates, dayfirst=True) interp_results = [] for dt in target_dates: dt_ts = dt.view('int64') # 取目标日期前最近的2个原始点 prev_mask = raw_dates_ts < dt_ts prev_dates = raw_dates_ts[prev_mask][-2:] prev_vals = raw_values[prev_mask][-2:] # 取目标日期后最近的2个原始点 next_mask = raw_dates_ts > dt_ts next_dates = raw_dates_ts[next_mask][:2] next_vals = raw_values[next_mask][:2] # 合并参与插值的参考点 used_dates = np.concatenate([prev_dates, next_dates]) used_vals = np.concatenate([prev_vals, next_vals]) # 线性插值,不需要额外依赖库,如果需要更高阶插值可以替换为scipy.interpolate.interp1d interp_val = np.interp(dt_ts, used_dates, used_vals) interp_results.append({'date': dt, 'value': interp_val}) # ---------------------- 3. 合并结果输出 ---------------------- final_df = pd.concat([raw_df, pd.DataFrame(interp_results)], ignore_index=True) final_df = final_df.sort_values('date').reset_index(drop=True) # 可选:转回日/月/年的字符串日期格式 final_df['date'] = final_df['date'].dt.strftime('%d/%m/%Y') print(final_df)
方案优势
- 完全符合约束要求:所有插值仅使用原始周度数据,不会引入插值结果作为计算依据
- 无连续空值报错问题:每个目标日期独立计算,不存在多个空值的依赖关系
- 兼容边界场景:若目标日期位于数据集首尾、前后不足2个参考点时,会自动使用可用的参考点完成计算
内容的提问来源于stack exchange,提问作者Brunna
相关产品推荐
相关产品推荐

