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

