我正在try 使用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],对应于根据tzone时区的time列的小时.即使这样,也很难从正确的专栏中收集信息.

遗憾的是,以下将时区从tzone列直接动态传递到convert_time_zone函数的简单try 不起作用:

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      │
└─────────────────────────┴─────────────────┴────────┘

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

如果您不需要延迟执行,那么正如其他答案所建议的那样,您可以迭代'time_zone'列的唯一值

Python相关问答推荐

Django mysql图标不适用于小 case

运行Python脚本时,用作命令行参数的SON文本

按顺序合并2个词典列表

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

django禁止直接分配到多对多集合的前端.使用user.set()

Python,Fitting into a System of Equations

将tdqm与cx.Oracle查询集成

在Python中动态计算范围

移动条情节旁边的半小提琴情节在海运

如何在Python中使用另一个数据框更改列值(列表)

如何在两列上groupBy,并使用pyspark计算每个分组列的平均总价值

为什么我的sundaram筛这么低效

GPT python SDK引入了大量开销/错误超时

根据Pandas中带条件的两个列的值创建新列

在极点中读取、扫描和接收有什么不同?

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

为什么后跟inplace方法的`.rename(Columns={';b';:';b';},Copy=False)`没有更新原始数据帧?

Regex用于匹配Python中逗号分隔的AWS区域

在不降低分辨率的情况下绘制一组数据点的最外轮廓

如何将参数名作为参数传入到函数中?