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

在Polars LazyFrame/DataFrame中填充时间序列数据缺失值

时间序列缺失时间戳填充方案(Polars)

需求说明

给定如下时间序列数据:

{
    "t": [1, 2, 5, 6, 7],
    "y": [1, 1, 1, 1, 1],
}

需要补全缺失的时间戳(如示例中的3、4),对应所有列填充0;实际场景存在多段不同长度的缺失间隔,且全程需保留LazyFrame格式。

原实现代码

已实现需求,但写法较为繁琐:

import polars as pl

# 测试用惰性数据
lf = pl.LazyFrame(
    {
        "t": [1, 2, 5, 6, 7],
        "y": [1, 1, 1, 1, 1],
    }
)


lf_filled = lf.join(
    pl.Series(
        name="t",
        values=pl.int_range(
            start=lf.select("t").first().collect().item(0, 0),
            end=lf.select("t").last().collect().item(0, 0) + 1,
            eager=True,
        ),
    )
    .to_frame()
    .lazy(),
    on="t",
    how="right",
).fill_null(0)

更简洁的实现方案

利用Polars的内置函数,全程保持惰性操作,无需提前收集首尾值:

import polars as pl

lf = pl.LazyFrame(
    {
        "t": [1, 2, 5, 6, 7],
        "y": [1, 1, 1, 1, 1],
    }
)

lf_filled = (
    lf
    # 生成完整时间序列的LazyFrame并执行右连接
    .join(
        lf
        .select(
            pl.int_range(
                start=pl.col("t").min(),
                end=pl.col("t").max() + 1,
                eager=False
            ).alias("t")
        )
        .explode("t"),
        on="t",
        how="right"
    )
    # 填充所有缺失值为0
    .fill_null(0)
)

方案优势

  • 全程基于LazyFrame操作,未提前收集数据,符合数据处理流程的惰性要求
  • 通过min()和max()直接获取时间戳范围,避免了原代码中单独收集首尾值的繁琐步骤
  • 用explode展开生成的连续序列,配合右连接补全缺失行,最后统一填充0,逻辑更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:37:37