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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:54:32