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

时间序列阶跃值数据的插值需求

时间序列阶跃值数据的插值需求

看起来你需要处理的是阶跃式的时间序列插值——也就是让每个数值持续生效直到下一个数据点的时间,然后按1分钟间隔补全所有时间点对吧?先提个关键小细节:你给的原始数据是按时间从晚到早排的,处理前得先把它按时间升序排好,不然阶跃逻辑会完全乱掉,这一步可不能忘!

我给你两种实用的实现方式,你可以按需选:

方法一:用Pandas快速实现(推荐)

Pandas对时间序列的处理简直是量身定做,几行代码就能搞定:

首先,把你的原始数据转换成Pandas能识别的格式,排序后生成1分钟间隔的时间轴,再用前向填充实现阶跃效果:

import pandas as pd

# 把你的原始数据整理成列表
raw_data = [
    (3.100, "12/14 05:42"),
    (3.250, "12/14 05:24"),
    (3.300, "12/14 05:23"),
    (3.600, "12/14 02:45"),
    (3.700, "12/13 10:54"),
    (3.600, "12/12 13:19"),
    (3.900, "12/12 10:43")
]

# 转成DataFrame并解析时间列
df = pd.DataFrame(raw_data, columns=["value", "time_str"])
df["time"] = pd.to_datetime(df["time_str"], format="%m/%d %H:%M")

# 按时间升序排序(核心步骤!)
df = df.sort_values("time").reset_index(drop=True)

# 生成从最早到最晚时间的1分钟间隔时间序列
min_time = df["time"].min()
max_time = df["time"].max()
minute_range = pd.date_range(start=min_time, end=max_time, freq="1T")

# 用前向填充(ffill)实现阶跃插值
step_interpolated = df.set_index("time").reindex(minute_range).ffill()

# 可以打印前10条看看效果
print(step_interpolated.head(10))

这里的ffill()就是前向填充,意思是每个没有对应值的1分钟时间点,都会用上一个最近的数值填充,完美匹配你要的阶跃图效果——数值保持不变直到下一个数据点出现。

方法二:纯Python实现(不用第三方库)

如果你不想依赖Pandas,用纯Python也能搞定,核心逻辑就是遍历每一对相邻的时间点,生成中间所有1分钟的时间点并赋值为前一个数值:

from datetime import datetime, timedelta

# 原始数据整理
raw_data = [
    (3.100, "12/14 05:42"),
    (3.250, "12/14 05:24"),
    (3.300, "12/14 05:23"),
    (3.600, "12/14 02:45"),
    (3.700, "12/13 10:54"),
    (3.600, "12/12 13:19"),
    (3.900, "12/12 10:43")
]

# 解析时间并按升序排序
parsed_data = []
for val, time_str in raw_data:
    dt = datetime.strptime(time_str, "%m/%d %H:%M")
    parsed_data.append((dt, val))
parsed_data.sort()  # 按时间从早到晚排序

# 生成阶跃插值结果
result = []
for idx in range(len(parsed_data)):
    current_dt, current_val = parsed_data[idx]
    # 先加入当前数据点
    result.append((current_dt.strftime("%m/%d %H:%M"), current_val))
    # 如果不是最后一个点,生成中间所有1分钟时间点
    if idx < len(parsed_data) - 1:
        next_dt, _ = parsed_data[idx + 1]
        current = current_dt + timedelta(minutes=1)
        # 循环生成到下一个数据点的前一分钟
        while current < next_dt:
            result.append((current.strftime("%m/%d %H:%M"), current_val))
            current += timedelta(minutes=1)

# 打印前10条验证
for time_str, val in result[:10]:
    print(f"{time_str}   {val}")

这个方法完全用Python标准库实现,逻辑更直观,适合不想装额外库的场景。

最后再提醒一句:不管用哪种方法,先给时间升序排序绝对是核心前提,你原始数据是倒序的,不排序的话生成的阶跃结果会完全错误,可别漏掉这一步哦!

备注:内容来源于stack exchange,提问作者blahahaaahahaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:45:27