我尝试使用
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'
完成这项任务最优雅的方法是什么?
您可以使用
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 │
└─────────────────────────┴─────────────────┴────────┘