You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当插值Limit小于值间行数时,如何通过线性插值获取等间距值?

解决方案:按指定天数实现平滑线性插值

针对你遇到的pandas插值按行数计算而非指定天数的问题,这里提供一个自定义逻辑的实现,确保在设定的过渡天数内完成平滑渐变:

示例代码(单Series)

import pandas as pd
import numpy as np

# 你的示例数据
s = pd.Series([np.nan, 4361, np.nan, np.nan, np.nan, np.nan, 4320])

# 提取所有有效数据点(非NaN的天数和对应值)
valid_points = s.dropna().reset_index()
valid_points.columns = ['day', 'value']

# 设置过渡天数上限
limit = 2

# 初始化结果Series
result = s.copy()

# 遍历每一对相邻的有效数据点
for i in range(len(valid_points)-1):
    prev_day, prev_val = valid_points.iloc[i]
    next_day, next_val = valid_points.iloc[i+1]
    
    # 确定渐变起始天数:从后一个有效点往前推limit天,且不早于前一个有效点的下一天
    start_day = max(prev_day + 1, next_day - limit)
    # 计算渐变区间的总天数
    transition_days = next_day - start_day + 1
    
    # 生成线性渐变的数值
    interpolated_vals = np.linspace(prev_val, next_val, num=transition_days)
    
    # 将渐变值填充到对应位置
    result.loc[start_day:next_day] = interpolated_vals

# 剩余NaN用前一个有效值填充(保持之前的最佳时间)
result = result.ffill()

print(result)

输出结果

0       NaN
1    4361.0
2    4361.0
3    4361.0
4    4347.0
5    4333.5
6    4320.0

逻辑说明

  1. 提取有效点:先把Series中非NaN的记录提取出来,明确每个时间点的最佳值
  2. 计算渐变区间:对于每一对相邻有效点,只在limit天的窗口内进行渐变——如果两个有效点间隔超过limit天,就从后一个点往前数limit天开始平滑过渡;如果间隔小于等于limit天,则从前一个点的次日开始渐变
  3. 生成渐变值:用np.linspace生成均匀分布的数值,保证在指定天数内完成从旧值到新值的平滑下降
  4. 填充剩余值:未进入渐变窗口的NaN用前一个有效值填充,保持历史最佳时间不变

扩展到宽DataFrame

如果你的数据是多列的宽DataFrame,只需对每一列应用上述逻辑即可:

def interpolate_column(col, limit):
    valid_points = col.dropna().reset_index()
    valid_points.columns = ['day', 'value']
    result = col.copy()
    for i in range(len(valid_points)-1):
        prev_day, prev_val = valid_points.iloc[i]
        next_day, next_val = valid_points.iloc[i+1]
        start_day = max(prev_day + 1, next_day - limit)
        transition_days = next_day - start_day + 1
        interpolated_vals = np.linspace(prev_val, next_val, num=transition_days)
        result.loc[start_day:next_day] = interpolated_vals
    return result.ffill()

# 假设df是你的宽DataFrame,对所有列执行插值
df_interpolated = df.apply(lambda x: interpolate_column(x, limit=2))

内容的提问来源于stack exchange,提问作者rayer456

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:12:47