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

使用pandas read_sql遇年份越界错误,如何读取数据库损坏日期?

解决pandas read_sql读取Oracle异常日期的报错问题

当pandas尝试将Oracle返回的异常日期(如年份超出1-9999范围)解析为datetime类型时,就会触发ValueError: year -10100 is out of range这类错误。你可以通过以下两种方式让read_sql无视年份范围读取所有数据:

方式1:修改SQL查询,将日期转成字符串返回

直接在Oracle查询里把日期字段转换为字符串格式,绕过pandas的日期解析逻辑:

SELECT 
    TO_CHAR(your_date_column, 'YYYY-MM-DD HH24:MI:SS.FF3') AS your_date_column,
    -- 其他字段...
FROM your_table

这样read_sql读取到的日期列会是字符串类型,不会触发年份范围检查。

方式2:强制pandas将日期列按字符串读取

在read_sql调用中,通过dtype参数指定日期列的数据类型为字符串,阻止自动解析:

df = pd.read_sql(
    query,
    oracle_conn,
    dtype={'your_date_column': str}  # 替换成实际的日期列名
)

如果有多个日期列,只需在字典里添加对应的键值对即可。

后续处理建议

读取到字符串格式的日期后,你可以:

  • 直接将字符串插入PostgreSQL:PostgreSQL的TIMESTAMP类型支持更广的日期范围(公元前4713年至公元5874897年),多数异常年份都能正常存储。
  • 清洗异常格式:比如你例子里的10101-11-29 22:58:59000.,毫秒部分格式错误,可以用字符串处理修正后再转换,例如:
    df['your_date_column'] = df['your_date_column'].str.replace(r'(\d{2})(\d{3})\.$', r'\1.\2', regex=True)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:15:59