从CSV切换至SQL数据源后,Pandas转换超2261日期报错求助
解决Pandas转换SQL日期时的OutOfBoundsDatetime错误
这个报错的核心原因很明确:Pandas默认的datetime64[ns]数据类型有严格的时间范围限制——它只能处理1677-09-21 00:12:43.145225到2262-04-11 23:47:16.854775807之间的日期,而你的数据里存在9999-12-31这种远超上限的极端日期,自然会触发OutOfBoundsDatetime错误。
针对从SQL Server读取数据的场景,你可以尝试以下几种解决方案:
方案1:在SQL查询阶段提前处理超范围日期
最省心的方式是直接在SQL语句里把超出Pandas支持范围的日期替换掉,比如把9999-12-31改成Pandas能识别的最大合法日期,或者转换成字符串标记:
SELECT CASE WHEN maturity_date > '2262-04-11' THEN '2262-04-11' ELSE CONVERT(VARCHAR, maturity_date, 23) END AS maturity_date FROM your_table
这样读取到Pandas里的日期都是合法范围,后续转换不会报错。
方案2:先处理DataFrame中的超范围日期再转换
如果你想在Python端处理,可以先筛选出超范围的日期字符串,替换后再转datetime:
import pandas as pd # 读取SQL数据(保持maturity_date为object类型) df_With_NaN = pd.read_sql(strSql, pyodbc.connect(connstr)) # 保留你之前处理大于2261年日期的逻辑 m = df_With_NaN['maturity_date'].str[:4].astype(float) > 2261 df_With_NaN['maturity_date'] = df_With_NaN['maturity_date'].mask(m, '2261' + df_With_NaN['maturity_date'].str[4:]) # 单独处理9999-12-31这类极端日期 df_With_NaN['maturity_date'] = df_With_NaN['maturity_date'].replace('9999-12-31', '2262-04-11') # 现在可以安全转换为datetime类型 df_With_NaN['maturity_date'] = pd.to_datetime(df_With_NaN['maturity_date'])
方案3:保留object类型存储日期(不转换为datetime)
如果你的业务不需要对日期做时间运算,只是展示或简单筛选,可以直接保留object类型(字符串形式),跳过转换步骤:
df_With_NaN = pd.read_sql(strSql, pyodbc.connect(connstr)) # 只处理大于2261年的日期,不转datetime m = df_With_NaN['maturity_date'].str[:4].astype(float) > 2261 df_With_NaN['maturity_date'] = df_With_NaN['maturity_date'].mask(m, '2261' + df_With_NaN['maturity_date'].str[4:])
方案4:使用errors='coerce'参数强制转换(超范围日期转为NaT)
如果可以接受超范围日期变成缺失值(NaT),可以直接用这个参数:
df_With_NaN['maturity_date'] = pd.to_datetime(df_With_NaN['maturity_date'], errors='coerce')
之后你可以再用fillna()把NaT替换成你需要的默认值。
内容的提问来源于stack exchange,提问作者Peter Lucas
相关产品推荐
相关产品推荐

