pandas.core.resample.Resampler.interpolate #

最终 重采样器。interpolate ( method = '线性' , * , axis = 0 , limit = None , inplace = False , limit_direction = 'forward' , limit_area = None , downcast = _NoDefault.no_default , ** kwargs ) [来源] #

根据不同的方法在目标时间戳之间插入值。

首先将原始索引重新索引为目标时间戳(请参阅 参考资料),然后进行值core.resample.Resampler.asfreq()插值 。NaNDataFrame.interpolate()

参数
方法str,默认“线性”

要使用的插值技术。之一:

  • '线性':忽略索引并将值视为等距。这是多索引支持的唯一方法。

  • “时间”:适用于每日数据和更高分辨率的数据,以插入给定的间隔长度。

  • 'index', 'values':使用索引的实际数值。

  • 'pad':使用现有值填充 NaN。

  • 'nearest'、'zero'、'slinear'、'quadratic'、'cubic'、'barycentric'、'polynomial':传递给 scipy.interpolate.interp1d,而 'spline' 传递给 scipy.interpolate.UnivariateSpline。这些方法使用指数的数值。 “多项式”和“样条曲线”都要求您还指定一个阶数(int),例如 。请注意, Pandas 中的线性方法是指 Scipy 一阶样 而不是 Pandas 一阶样df.interpolate(method='polynomial', order=5)

  • 'krogh'、'piecewise_polynomial'、'spline'、'pchip'、'akima'、'cubicspline':类似名称的 SciPy 插值方法的包装。参见注释

  • 'from_derivatives':指 scipy.interpolate.BPoly.from_derivatives

axis {{0 或 'index', 1 或 'columns', None}}, 默认 None

沿其插补的轴。对于系列,此参数未使用,默认为 0。

限制int,可选

要填充的连续 NaN 的最大数量。必须大于 0。

inplace布尔值,默认 False

如果可能的话更新数据。

limit_direction {{'向前', '向后', '两者'}}, 可选

连续的 NaN 将按此方向填充。

如果指定限制:
  • 如果“method”为“pad”或“ffill”,则“limit_direction”必须为“forward”。

  • 如果“method”为“backfill”或“bfill”,则“limit_direction”必须为“backwards”。

如果未指定“限制”:
  • 如果“method”为“backfill”或“bfill”,则默认为“backward”

  • 否则默认为“前进”

如果limit_direction为“forward”或“both”,则引发 ValueError

方法是“backfill”或“bfill”。

如果limit_direction为“向后”或“两者”,则引发 ValueError

方法是“pad”或“fill”。

limit_area {{ None , 'inside', 'outside'}}, 默认 None

如果指定了 limit,则连续的 NaN 将用此限制填充。

  • None:无填充限制。

  • 'inside':仅填充由有效值包围的 NaN(插值)。

  • 'outside':仅填充有效值之外的 NaN(推断)。

downcast可选,'infer' 或 None,默认为 None

如果可能的话,向下转换数据类型。

自 2.1.0 版本起已弃用。

``**kwargs``可选

要传递给插值函数的关键字参数。

返回
数据框或系列

指定频率处的插值。

也可以看看

core.resample.Resampler.asfreq

返回新频率的值,本质上是重新索引。

DataFrame.interpolate

使用插值方法填充 NaN 值。

笔记

对于带有时间戳的高频或非等距时间序列,重新索引后进行插值可能会导致信息丢失,如上一个示例所示。

例子

>>> start = "2023-03-01T07:00:00"
>>> timesteps = pd.date_range(start, periods=5, freq="s")
>>> series = pd.Series(data=[1, -1, 2, 1, 3], index=timesteps)
>>> series
2023-03-01 07:00:00    1
2023-03-01 07:00:01   -1
2023-03-01 07:00:02    2
2023-03-01 07:00:03    1
2023-03-01 07:00:04    3
Freq: s, dtype: int64

通过提供 2 秒的周期时间,将数据帧上采样到 0.5Hz。

>>> series.resample("2s").interpolate("linear")
2023-03-01 07:00:00    1
2023-03-01 07:00:02    2
2023-03-01 07:00:04    3
Freq: 2s, dtype: int64

通过提供 500ms 的周期时间,将数据帧下采样至 2Hz。

>>> series.resample("500ms").interpolate("linear")
2023-03-01 07:00:00.000    1.0
2023-03-01 07:00:00.500    0.0
2023-03-01 07:00:01.000   -1.0
2023-03-01 07:00:01.500    0.5
2023-03-01 07:00:02.000    2.0
2023-03-01 07:00:02.500    1.5
2023-03-01 07:00:03.000    1.0
2023-03-01 07:00:03.500    2.0
2023-03-01 07:00:04.000    3.0
Freq: 500ms, dtype: float64

插值之前的内部重新索引asfreq()会导致基于重新索引时间戳(锚点)的插值时间序列。由于并非原始系列中的所有数据点都会成为锚点,因此可能会导致误导性的插值结果,如下例所示:

>>> series.resample("400ms").interpolate("linear")
2023-03-01 07:00:00.000    1.0
2023-03-01 07:00:00.400    1.2
2023-03-01 07:00:00.800    1.4
2023-03-01 07:00:01.200    1.6
2023-03-01 07:00:01.600    1.8
2023-03-01 07:00:02.000    2.0
2023-03-01 07:00:02.400    2.2
2023-03-01 07:00:02.800    2.4
2023-03-01 07:00:03.200    2.6
2023-03-01 07:00:03.600    2.8
2023-03-01 07:00:04.000    3.0
Freq: 400ms, dtype: float64

请注意,序列在两个锚点 07:00:00和之间错误地增加07:00:02