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

基于列值为Polars DataFrame动态实现时区转换

如何在Polars中基于另一列动态偏移日期时间到UTC(不使用map_elements/iter_rows)

可以通过Polars的矢量化列操作实现,无需逐行处理,步骤如下:

1. 构造测试数据

import polars as pl

data = pl.DataFrame({
    "Datetime": ["2022-01-01 12:52:23", "2023-03-31 04:22:59"],
    "Timezone": [-4, -5]
})

2. 矢量化转换逻辑

核心思路是先将字符串转成无时区感知的datetime,再基于偏移列计算时间间隔,最后将两者相加得到UTC时间:

result = data.with_columns(
    # 把字符串日期转成无时区的datetime类型
    pl.col("Datetime").str.to_datetime().alias("naive_dt"),
    # 将时区偏移量转为小时间隔(取绝对值,因为本地时间+偏移绝对值=UTC)
    pl.duration(hours=pl.col("Timezone").abs()).alias("offset")
).with_columns(
    # 计算UTC时间并替换原列
    (pl.col("naive_dt") + pl.col("offset")).alias("Datetime")
).drop("naive_dt", "offset")

3. 输出结果

执行后得到的结果符合需求:

print(result)
# shape: (2, 2)
# ┌─────────────────────┬──────────┐
# │ Datetime            ┆ Timezone │
# │ ---                 ┆ ---      │
# │ datetime            ┆ i64      │
# ╞═════════════════════╪══════════╡
# │ 2022-01-01 16:52:23 ┆ -4       │
# │ 2023-03-31 09:22:59 ┆ -5       │
# └─────────────────────┴──────────┘

扩展:转为带时区感知的datetime

如果需要得到带UTC时区标记的datetime类型,只需在计算时添加dt.replace_time_zone("UTC"):

result = data.with_columns(
    pl.col("Datetime").str.to_datetime().alias("naive_dt"),
    pl.duration(hours=pl.col("Timezone").abs()).alias("offset")
).with_columns(
    (pl.col("naive_dt") + pl.col("offset")).dt.replace_time_zone("UTC").alias("Datetime")
).drop("naive_dt", "offset")

此时Datetime列的类型会变为datetime[μs, UTC],既包含UTC时间值,又明确标记时区信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:25:23