在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
相关产品推荐
相关产品推荐

