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
相关产品推荐
相关产品推荐

