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

如何在Polars中为datetime列添加数值秒数(时长)列?

解决方案

在Polars中直接将浮点型秒数列cast为Duration类型无法正确转换,因为这种方式会把数值视为微秒单位的整数(截断小数部分后,小于1的数值直接变为0)。以下是两种可行的实现方案:

方法1:用pl.duration()直接构造时长

这是最直观的方式,直接通过seconds参数传入浮点型秒数:

import polars as pl

df = pl.DataFrame(
    {
        "dt": ["2022-12-14T00:00:00", "2022-12-14T00:00:00", "2022-12-14T00:00:00"],
        "seconds": [1.0, 2.2, 2.4],
    }
).with_columns(pl.col("dt").cast(pl.Datetime))

# 构造时长并完成日期时间加法
df = df.with_columns(
    pl.duration(seconds=pl.col("seconds")).alias("duration"),
    (pl.col("dt") + pl.duration(seconds=pl.col("seconds"))).alias("dt_plus_seconds")
)

print(df)

输出结果:

┌─────────────────────┬─────────┬──────────────┬─────────────────────┐
│ dt                  ┆ seconds ┆ duration     ┆ dt_plus_seconds     │
│ ---                 ┆ ---     ┆ ---          │ ---                 │
│ datetime[μs]        ┆ f64     ┆ duration[μs] │ datetime[μs]        │
╞═════════════════════╪═════════╪══════════════╪═════════════════════╡
│ 2022-12-14 00:00:00 ┆ 1.0     ┆ 1s           │ 2022-12-14 00:00:01 │
│ 2022-12-14 00:00:00 ┆ 2.2     ┆ 2s 200ms     │ 2022-12-14 00:00:02 │
│ 2022-12-14 00:00:00 ┆ 2.4     ┆ 2s 400ms     │ 2022-12-14 00:00:02 │
└─────────────────────┴─────────┴──────────────┴─────────────────────┘

方法2:转换为微秒后再cast为Duration

如果需要明确控制单位转换,可以将秒数乘以1e6(转换为微秒,匹配datetime的默认精度),再转为Duration类型:

df = df.with_columns(
    (pl.col("seconds") * 1_000_000).cast(pl.Duration).alias("duration"),
    (pl.col("dt") + (pl.col("seconds") * 1_000_000).cast(pl.Duration)).alias("dt_plus_seconds")
)

该方法与方法1效果一致,适合需要手动处理单位逻辑的场景。

为什么直接cast会失败?

Polars中cast(pl.Duration)默认将输入数值当作微秒单位的整数处理:

  • 传入1.0时会被截断为1微秒,因数值过小显示为0µs
  • 传入2.2时会被截断为2微秒,同样显示为0µs
    这就是你看到所有duration0列值为0的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:15:38