`convert_time_zone` 函数根据为 Polars 中每行指定的时区检索值

问题描述 投票:0回答:1

我尝试使用

Polars
根据每行中指定的时区确定时间。考虑以下代码片段:

df = pl.DataFrame({
    "time": [datetime(2023, 4, 3, 2), datetime(2023, 4, 4, 3), datetime(2023, 4, 5, 4)],
    "tzone": ["Asia/Tokyo", "America/Chicago", "Europe/Paris"]
}).with_columns(c.time.dt.replace_time_zone("UTC"))

df.with_columns(
    tokyo=c.time.dt.convert_time_zone("Asia/Tokyo").dt.hour(),
    chicago=c.time.dt.convert_time_zone("America/Chicago").dt.hour(),
    paris=c.time.dt.convert_time_zone("Europe/Paris").dt.hour()
)

在这个例子中,我分别计算了每个时区的时间以达到预期的结果,即 [11, 22, 6],对应于

time
时区的
tzone
列的小时。即使如此,也很难从正确的列中收集信息。

不幸的是,以下将时区从

tzone
列直接动态传递到
convert_time_zone
函数的简单尝试不起作用:

df.with_columns(c.time.dt.convert_time_zone(c.tzone).dt.hour())
#TypeError: argument 'time_zone': 'Expr' object cannot be converted to 'PyString'

完成这项任务最优雅的方法是什么?

python timezone python-polars
1个回答
0
投票

您可以使用

polars-xdt
插件来完成此操作:

df = pl.DataFrame({
    "time": [datetime(2023, 4, 3, 2), datetime(2023, 4, 4, 3), datetime(2023, 4, 5, 4)],
    "tzone": ["Asia/Tokyo", "America/Chicago", "Europe/Paris"]
}).with_columns(pl.col('time').dt.replace_time_zone("UTC"))

df.with_columns(
    result=xdt.to_local_datetime("time", pl.col('tzone')).dt.hour(),
)

Out[6]:
shape: (3, 3)
┌─────────────────────────┬─────────────────┬────────┐
│ time                    ┆ tzone           ┆ result │
│ ---                     ┆ ---             ┆ ---    │
│ datetime[μs, UTC]       ┆ str             ┆ i8     │
╞═════════════════════════╪═════════════════╪════════╡
│ 2023-04-03 02:00:00 UTC ┆ Asia/Tokyo      ┆ 11     │
│ 2023-04-04 03:00:00 UTC ┆ America/Chicago ┆ 22     │
│ 2023-04-05 04:00:00 UTC ┆ Europe/Paris    ┆ 6      │
└─────────────────────────┴─────────────────┴────────┘

https://github.com/pola-rs/polars-xdt

© www.soinside.com 2019 - 2024. All rights reserved.