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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:03:36