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

Snowflake timestamp_ntz(9)转pandas datetime64[ns]未来日期转换错误求助

问题:Snowflake远期时间戳读取到pandas时出现溢出错误

从Snowflake读取TIMESTAMP_NTZ类型的远期时间(如2286-08-27 00:00:00.000)到pandas DataFrame时,该时间被错误转换为1702-02-06 00:25:26.290448384。原因是pandas的datetime64[ns]类型有范围限制(约1677-09-21至2262-04-11),超出上限的时间会触发整数溢出导致时间回绕;而Snowflake的TIMESTAMP类型支持更大的时间范围,pyarrow在转换过程中未处理该溢出场景。

解决方案

1. 禁用pyarrow转换

修改Snowflake连接配置,禁用pyarrow作为pandas数据转换的后端,改用纯Python解析时间戳,可避免溢出问题:

import pandas as pd
import snowflake.connector

snowflake_db_conn = snowflake.connector.connect(
    user="你的用户名",
    password="你的密码",
    account="你的账号",
    # 补充其他必要连接参数(仓库、数据库、 schema等)
    pandas_use_pyarrow=False  # 关键:禁用pyarrow转换
)

cs = snowflake_db_conn.cursor()
cur = cs.execute('SELECT * FROM TARGET.TESTTABLE;')
df = cur.fetch_pandas_all()

print(df)
print(df.dtypes)

该方式能正确保留远期时间戳,唯一缺点是大数据集下性能略低于pyarrow。

2. 先读取为字符串再手动转换

通过SQL将时间戳转为字符串读取,再用pandas手动转换,超出datetime64[ns]范围的时间会自动转为Python原生datetime.datetime对象,保留正确值:

import pandas as pd
import snowflake.connector

snowflake_db_conn = snowflake.connector.connect(user="...")
cs = snowflake_db_conn.cursor()
# 将时间戳转为字符串查询
cur = cs.execute('SELECT ID, TO_VARCHAR(StartDateTime) AS StartDateTime FROM TARGET.TESTTABLE;')
df = cur.fetch_pandas_all()

# 转换为datetime类型
df['StartDateTime'] = pd.to_datetime(df['StartDateTime'])

print(df)
print(df.dtypes)

3. 升级依赖版本

相关问题在snowflake-connector-python和pyarrow的后续版本中已被修复,可尝试升级依赖:

pip install --upgrade snowflake-connector-python pyarrow

升级后重新测试读取逻辑,验证远期时间戳是否能正确转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:06:27