pandas转换B.E佛历格式字符串日期报越界错误的解决方法
报错原因
pandas 内置的 datetime64[ns] 时间类型支持的公历年份范围为1677-2262,直接调用 pd.to_datetime(df['date']) 时,函数会默认按「日-月-年」规则解析字符串,把2562识别为公历年份,超出类型支持的年份上限,因此抛出越界错误。
佛历(B.E.)与公历的固定换算规则为:佛历年份 - 543 = 对应公历年份,样例中的2562年佛历实际对应2019年公历,完全在pandas日期类型的支持范围内。
可行解决方案
方案1:预处理字符串转换公历年(推荐,兼容性最好)
先拆分日期字符串把佛历年替换为公历年,再调用转换函数,显式指定日期解析规则避免歧义:
import pandas as pd # 构造样例数据 df = pd.DataFrame({ 'date': ['28-01-2562', '29-01-2562', '30-01-2562', '31-01-2562'] }) # 替换佛历年为公历年 df['date'] = df['date'].str.split('-').apply( lambda x: f"{x[0]}-{x[1]}-{int(x[2]) - 543}" ) # 按日-月-年格式转换为pandas日期类型 df['date'] = pd.to_datetime(df['date'], dayfirst=True)
执行后date列会正确转换为2019-01-28至2019-01-31的日期类型值,无报错。
方案2:自定义解析函数逐行转换
如果不想修改原始字符串格式,可以自定义解析函数直接完成佛历转公历+日期类型转换:
from datetime import datetime def convert_be_date(date_str): day, month, be_year = map(int, date_str.split('-')) return datetime(be_year - 543, month, day) df['date'] = df['date'].apply(convert_be_date)
注意事项
- 转换时必须显式指定
dayfirst=True,或通过format="%d-%m-%Y"明确日期格式,避免pandas自动识别时混淆日月位置,触发解析错误。 - 不要通过修改日期类型存储精度(比如改用
datetime64[s]扩大年份上限)的方式绕过报错,这种方式没有转换佛历到公历,后续做时间计算、筛选、可视化时都会出现年份逻辑错误。 - 若处理泰国地区历史日期数据,注意确认对应时期的佛历偏移规则,官方通用场景下固定偏移值为543年。
内容的提问来源于stack exchange,提问作者somphon rueangsri
相关产品推荐
相关产品推荐

