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

Pandas取最近值对齐秒级时间并线性插值的技术问题

解决Pandas数据对齐与条件插值问题

我明白你遇到的问题了——直接用resample('3s').nearest()要么索引不符合预期,要么没法满足“间隔超2秒不插值”的条件。咱们一步步来解决这个需求:先把数据对齐到3秒节点取最近值,再对符合条件的区间做线性插值。

第一步:构造可复现的示例数据

首先咱们先把你给出的DataFrame用代码构造出来,方便后续测试:

import pandas as pd
import numpy as np

# 构造原始时间序列和值
times = pd.to_datetime([
    '2019-08-10 12:03:05', '2019-08-10 12:03:06', '2019-08-10 12:03:07',
    '2019-08-10 12:03:08', '2019-08-10 12:03:09', '2019-08-10 12:03:10',
    '2019-08-10 12:03:11', '2019-08-10 12:03:12', '2019-08-10 12:03:13',
    '2019-08-10 12:03:14', '2019-08-10 12:03:15', '2019-08-10 12:03:16',
    '2019-08-10 12:03:17'
])
vals = [1.0, np.nan, np.nan, 3.0, 4.0, np.nan, np.nan, 5.0, np.nan, 1.0, np.nan, np.nan, 6.0]
df = pd.DataFrame({'vals': vals}, index=times)

第二步:对齐到3秒节点并取最近值

默认的resample('3s')会从整点开始生成间隔,这可能和你想要的“从数据起始点开始的3秒节点”不符。咱们用date_range生成自定义的3秒索引,再结合reindex的nearest方法,同时设置tolerance避免取太远的点:

# 生成从数据起始到结束的3秒间隔索引
target_index = pd.date_range(start=df.index[0], end=df.index[-1], freq='3s')

# 对齐数据:取最近1.5秒内的原始值,超出范围则保留NaN
aligned_df = df.reindex(target_index, method='nearest', tolerance=pd.Timedelta('1.5s'))

这一步得到的aligned_df索引是:12:03:05、12:03:08、12:03:11、12:03:14、12:03:17,对应的值分别是1.0、3.0、5.0、1.0、6.0。

第三步:条件线性插值(间隔≤2秒才插值)

接下来咱们只对相邻非NaN值时间差≤2秒的区间做线性插值。核心思路是先找出所有非NaN点,计算它们的时间差,再对符合条件的区间逐个插值:

# 获取对齐后非NaN值的索引和数据
non_nan_points = aligned_df.dropna()

# 计算相邻非NaN点的时间差(秒)
time_diffs = non_nan_points.index.to_series().diff().dt.total_seconds()

# 复制对齐后的数据作为插值结果的基础
final_df = aligned_df.copy()

# 遍历每个可插值的区间(时间差≤2秒)
for idx in time_diffs[time_diffs <= 2].index:
    # 获取当前点和前一个非NaN点的位置
    prev_idx = non_nan_points.index[non_nan_points.index.get_loc(idx) - 1]
    curr_idx = idx
    
    # 获取两个点之间的所有索引
    interval_indices = final_df.loc[prev_idx:curr_idx].index
    
    # 用np.interp做线性插值
    final_df.loc[interval_indices, 'vals'] = np.interp(
        interval_indices.astype(np.int64),  # 转换为时间戳数值
        [prev_idx.astype(np.int64), curr_idx.astype(np.int64)],
        [non_nan_points.loc[prev_idx, 'vals'], non_nan_points.loc[curr_idx, 'vals']]
    )

最终结果解释

在这个例子里,对齐后的相邻非NaN点时间差都是3秒(超过2秒),所以最终结果和aligned_df一致。如果你的数据中有间隔≤2秒的非NaN点,这部分会自动完成线性插值。

如果你的需求是先对原始数据做条件插值,再对齐到3秒节点,只需要把步骤二和步骤三调换顺序:先对原始数据做间隔≤2秒的插值,再用reindex对齐到3秒节点取最近值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:17