基于列值为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
相关产品推荐
相关产品推荐

