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

