Snowflake convert_timezone在pandas read_sql中不生效问题咨询
问题根因
Snowflake控制台直接返回数据库侧计算完成的原始时间戳结果,因此convert_timezone输出的洛杉矶时区时间和对应偏移量能正常展示。
pandas read_sql 查询走的是Snowflake Python连接器,该组件默认会把所有TIMESTAMP_TZ类型的返回值自动转换为UTC时区的Python datetime对象,2.7.0之前的老版本连接器还存在时区偏移重复计算的bug,最终返回的时间值和控制台结果不一致。
修复方案
按优先级推荐以下解决方式:
- 升级连接器版本
先将snowflake-connector-python和配套的sqlalchemy依赖升级到最新稳定版,修复旧版本存在的时区转换偏移bug,执行命令:pip install --upgrade snowflake-connector-python snowflake-sqlalchemy - SQL侧显式指定返回类型
在查询时将convert_timezone的结果显式转为无时区的TIMESTAMP_NTZ类型,阻断连接器的自动时区转换逻辑,修改后的SQL如下:
该写法返回的时间值和控制台显示的洛杉矶本地时间完全一致,不会被驱动自动转时区。SELECT convert_timezone('America/Los_Angeles', '2022-05-25T14:27:30Z'::TIMESTAMP_TZ)::TIMESTAMP_NTZ AS la_time - 连接时配置会话级时区参数
创建数据库连接引擎时,显式指定会话时区为目标时区,让驱动按照指定时区做时间类型解析,示例代码:from sqlalchemy import create_engine import pandas as pd engine = create_engine( "snowflake://<你的账号连接串>", connect_args={ "session_parameters": { "TIMEZONE": "America/Los_Angeles" } } ) # 执行read_sql即可得到正确时区结果 res = pd.read_sql("select convert_timezone('America/Los_Angeles', '2022-05-25T14:27:30Z'::TIMESTAMP_TZ)", engine) - 本地二次转换(不推荐)
如果不方便修改连接配置和SQL,可以在拿到pandas返回结果后,手动将UTC时间转换到目标时区,注意该方法需要先确认驱动返回的UTC时间值本身偏移计算正确,否则会出现时间误差:df = pd.read_sql("select convert_timezone('America/Los_Angeles', '2022-05-25T14:27:30Z'::TIMESTAMP_TZ)", engine) df.iloc[:,0] = df.iloc[:,0].dt.tz_convert('America/Los_Angeles')
注意:不要依赖驱动默认的自动时区转换逻辑,涉及跨时区时间计算时,优先在SQL侧明确指定返回类型,或者在连接初始化时固定会话时区,避免环境差异导致的时间错误。
内容的提问来源于stack exchange,提问作者Ezer K
相关产品推荐
相关产品推荐

