首页 > 解决方案 > 如何仅在特定窗口上进行插值?

问题描述

我有一个遵循每周索引的数据集,以及我需要获取插值数据的日期列表。例如,我有以下 df 每周聚合:

data           value
1/01/2021       10
7/01/2021       10
14/01/2021      10
28/01/2021      10

以及与 df 索引日期不一致的日期列表,例如:

list_dates = [12/01/2021, 13/01/2021 ...]

我需要获取list_dates给定窗口内每个日期的插值(例如:仅使用 df 中的 4 个值来计算插值,在之前和之后之间分割 --> 所以之前的 2 个第一个日期列表日期和列表日期之后的 2 个第一个日期)。

要在列表中获取列表日期 12/01/2021 的插值,我需要使用:

1/1/2021
7/1/2021
14/1/2021
28/1/2021

输出将是:

data           value
1/01/2021       10
7/01/2021       10
12/01/2021      10
13/01/2021      10
14/01/2021      10
28/01/2021      10

我已经成功编写了一个示例,但是当连续有多个 NaN 时它会失败(例如:12/01 和 13/01)。在运行列表中的下一个之前,我也无法连接插值,因为那将使用插值日期来计算新的插值日期(例如:使用 12/01 计算 13/01)。

关于如何做到这一点的任何建议?

标签: pythonpandas

解决方案


用于interpolate获得预期结果,但在您必须准备如下数据框之前。

我稍微修改了您的输入数据,以显示您使用 datetimeindex ( method='time') 进行插值:

# Input data
df = pd.DataFrame({'data': ['1/01/2021', '7/01/2021', '14/01/2021', '28/01/2021'],
                   'value': [10, 10, 17, 10]})
list_dates = ['12/01/2021', '13/01/2021']

# Conversion of dates
df['data'] = pd.to_datetime(df['data'], format='%d/%m/%Y')
new_dates = pd.to_datetime(list_dates, format='%d/%m/%Y')

# Set datetime column as index and append new dates
df = df.set_index('data')
df = df.reindex(df.index.append(new_dates)).sort_index()

# Interpolate with method='time'
df['value'] = df['value'].interpolate(method='time')

输出:

>>> df
            value
2021-01-01   10.0
2021-01-07   10.0
2021-01-12   15.0  # <- time interpolation
2021-01-13   16.0  # <- time interpolation
2021-01-14   17.0  # <- changed from 10 to 17
2021-01-28   10.0

推荐阅读