Polars中填充时间差空值时如何保留日粒度整数表示?
更简洁的日期差计算与空值填充方法
方法1:先提取天数再填充空值
直接用dt.days()把日期差转换为天数整数,再填充0,全程保持整数类型,无需处理毫秒转换:
import polars as pl from datetime import date df = pl.DataFrame({"a": pl.date_range(date(2023, 1, 1), date(2023, 1, 3))}) result = df.with_columns( (pl.col("a") - pl.col("a").shift(1)).dt.days().fill_null(0) ) print(result)
输出:
shape: (3, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 0 │ │ 1 │ │ 1 │ └─────┘
方法2:填充日粒度Duration再转整数
如果需要先保留Duration类型再处理,可填充pl.duration(days=0)而非0,维持Duration类型后再提取天数:
result = df.with_columns( (pl.col("a") - pl.col("a").shift(1)).fill_null(pl.duration(days=0)).dt.days() ) print(result)
输出与方法1完全一致。
多列批量处理优化
针对多列日期数据,用列类型或列名列表批量操作,避免重复代码:
# 构造含多列日期的DataFrame df = pl.DataFrame({ "a": pl.date_range(date(2023, 1, 1), date(2023, 1, 3)), "b": pl.date_range(date(2023, 2, 1), date(2023, 2, 3)), "c": pl.date_range(date(2023, 3, 1), date(2023, 3, 3)) }) # 批量处理所有日期/日期时间列 result = df.with_columns( (pl.col([pl.Date, pl.Datetime]) - pl.col([pl.Date, pl.Datetime]).shift(1)) .dt.days().fill_null(0) ) print(result)
输出:
shape: (3, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ 0 ┆ 0 ┆ 0 │ │ 1 ┆ 1 ┆ 1 │ │ 1 ┆ 1 ┆ 1 │ └─────┴─────┴─────┘
原理说明
dt.days()可直接从Duration类型中提取天数作为整数,跳过毫秒单位转换步骤。- 用
fill_null(0)会触发Polars自动将Duration转为毫秒数整数,但先转天数再填充能直接保留正确的整数单位。 - 填充
pl.duration(days=0)可维持Duration类型,后续提取天数仍能得到正确结果。
内容的提问来源于stack exchange,提问作者anddt
相关产品推荐
相关产品推荐

