解决Pandas中古老年份字符串转datetime的OutOfBoundsDatetime问题
解决pandas转换1500年代日期的OutOfBoundsDatetime错误
问题原因
pandas默认使用nanosecond精度的datetime64[ns]类型,其可表示的日期范围是1677-09-21至2262-04-11,1500年代的日期超出这个范围,因此触发OutOfBoundsDatetime错误。
整列转换的解决方法
方法1:使用Python引擎解析日期
直接在pd.to_datetime中指定engine='python',利用Python标准库的datetime模块处理更早的日期(支持公元1年及以后的日期),语法简单且能保留日期计算能力:
import pandas as pd # 单值测试 datestring = '01-04-1595' datenew = pd.to_datetime(datestring, format='%d-%m-%Y', engine='python') # 整列转换 df['date_column'] = pd.to_datetime(df['date_column'], format='%d-%m-%Y', engine='python')
- 优点:无需额外依赖,代码简洁,支持日期加减计算。
- 缺点:处理超大数据集时,速度比默认的numpy引擎慢。
方法2:转换为天精度的datetime类型
将日期转换为天精度的datetime64[D]类型,其可表示的范围远大于nanosecond精度(覆盖公元前至公元后极远年份),完全满足1500-1900年的需求:
from datetime import datetime import pandas as pd # 整列转换:先转为Python datetime对象,再转成天精度类型 df['date_column'] = df['date_column'].apply( lambda x: datetime.strptime(x, '%d-%m-%Y') ).astype('datetime64[D]')
- 优点:计算效率高,日期范围无限制,足够支持天数差计算。
- 缺点:需要手动调用Python的
datetime.strptime,代码稍长。
方法3:使用第三方库dateutil(可选)
如果日期格式不固定,可使用dateutil.parser自动解析,但需先安装python-dateutil:
from dateutil.parser import parse import pandas as pd df['date_column'] = df['date_column'].apply(parse)
- 优点:自动识别多种日期格式,无需指定
format参数。 - 缺点:安装额外依赖,解析速度较慢,且可能出现格式识别错误。
验证天数差计算
转换完成后,直接对日期列做减法即可得到天数差:
df['days_diff'] = df['end_date'] - df['start_date'] # 提取具体天数数值 df['days_diff_num'] = df['days_diff'].dt.days
内容的提问来源于stack exchange,提问作者Dicky
相关产品推荐
相关产品推荐

