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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:42:08