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

