You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polars中非UTC时区datetime序列按日截断异常问题问询

问题解答

这不是操作错误,也不是Polars的bug,而是Polars针对时区感知型datetime的设计逻辑:大部分时间相关操作(包括dt.truncate、dt.strftime)默认以UTC时间为基准进行计算,而非datetime自身关联的本地时区。

具体现象解释

比如你的示例中,当dt列被本地化到America/New_York时区后:

  • 执行dt.truncate('1d')时,Polars会先将纽约时区的datetime转换为UTC,截断到UTC的当日起始点,再转回纽约时区显示——这就导致结果和你预期的「本地时区当日截断」不符。
  • dt.strftime同理,会先转UTC再生成格式化字符串,而非直接基于本地时区的时间进行格式化。

正确实现本地时区操作的方法

要基于datetime自身的本地时区完成截断或格式化,需要显式提取本地时区的时间组件,再重新构建目标值,就像你已经尝试的那样:

# 本地时区截断到当日起始
test = test.with_columns(
    local_truncated=pl.datetime(
        pl.col('dt').dt.year(),
        pl.col('dt').dt.month(),
        pl.col('dt').dt.day(),
        tz='America/New_York'
    )
)

# 基于本地时区格式化字符串
test = test.with_columns(
    local_strftime=pl.col('dt').dt.year().cast(str) + '-' + 
                   pl.col('dt').dt.month().cast(str).str.zfill(2) + '-' + 
                   pl.col('dt').dt.day().cast(str).str.zfill(2) + ' ' +
                   pl.col('dt').dt.hour().cast(str).str.zfill(2) + ':' +
                   pl.col('dt').dt.minute().cast(str).str.zfill(2)
)

这种方式直接提取datetime在本地时区的年、月、日等组件,完全基于本地时区逻辑生成结果,符合你的预期。

内容的提问来源于stack exchange,提问作者Dean MacGregor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:55:18