如何在Polars中将Date类型转换为时区感知的Datetime类型
解决方案:将Polars Date类型本地化到指定时区并转为Datetime
直接使用cast(pl.Datetime(time_zone='America/New_York'))转换Date类型时,Polars会先将Date转为UTC时区的当日0点,再转换到目标时区(纽约时区比UTC晚5小时,因此出现前一天19点的结果)。要实现将Date视为目标时区的当日0点并转为带时区的Datetime,需按以下步骤操作:
正确代码示例
import polars as pl df = pl.DataFrame({ "date": pl.Series(["2022-01-01", "2022-01-02"]).cast(pl.Date) }) # 先转为无时区的Datetime(对应当日00:00:00),再本地化为目标时区 result = df.select( pl.col('date') .cast(pl.Datetime()) .dt.replace_time_zone('America/New_York') ) print(result)
输出结果
shape: (2, 1) ┌────────────────────────────────┐ │ date │ │ --- │ │ datetime[μs, America/New_York] │ ╞════════════════════════════════╡ │ 2022-01-01 00:00:00 EST │ │ 2022-01-02 00:00:00 EST │ └────────────────────────────────┘
补充说明
- Polars的时区转换逻辑不依赖系统环境变量
TZ,因此修改os.environ['TZ']不会改变转换结果,必须通过显式的方法参数指定时区。 - 使用
dt.replace_time_zone时,Polars会将无时区的Datetime直接视为目标时区的时间,而非先当作UTC转换,这正是我们需要的本地化逻辑。
内容的提问来源于stack exchange,提问作者Dean MacGregor
相关产品推荐
相关产品推荐

