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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:21:27