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

使用Pandas to_datetime()转换多格式日期列时,年份超过3000无法正常转换的问题

解决Pandas处理超3000年日期的问题

这个问题的根源在于Pandas默认使用的datetime64[ns]类型有时间范围限制——它基于numpy的datetime64,只能处理公元1677年到2262年之间的日期,超过这个范围的日期就会触发OutOfBoundsDatetime错误或者被转为NaT。下面给你几个实用的解决办法:

方法1:转换为Python原生datetime对象(无范围限制)

Python标准库的datetime对象没有时间范围限制,我们可以用它来替代Pandas默认的datetime类型。如果你的日期格式多样,可以借助dateutil.parser自动识别格式(需要先安装python-dateutil:pip install python-dateutil):

import pandas as pd
from dateutil import parser

# 你的原始数据
data = [['A', '2021-08-08'], ['B', '2021/08/08'], ['C', '3031-08-08']]
df = pd.DataFrame(data, columns = ['Name', 'Date'])

# 转换为Python原生datetime
df['Date'] = df['Date'].apply(parser.parse)

转换后,Date列会变成object类型,但每个元素都是合法的datetime对象,3031年的日期也能正常保留:

NameDate
A2021-08-08 00:00:00
B2021-08-08 00:00:00
C3031-08-08 00:00:00

如果不想依赖第三方库,也可以自己写一个函数尝试多种格式解析:

import datetime

def parse_custom_date(date_str):
    # 列出你需要支持的日期格式
    possible_formats = ['%Y-%m-%d', '%Y/%m/%d']
    for fmt in possible_formats:
        try:
            return datetime.datetime.strptime(date_str, fmt)
        except ValueError:
            continue
    # 如果所有格式都不匹配,可以抛出错误或返回原字符串
    raise ValueError(f"无法解析日期: {date_str}")

df['Date'] = df['Date'].apply(parse_custom_date)

方法2:使用Pandas的Period类型(支持时间运算)

如果你需要保留Pandas的时间运算能力(比如加减天数、按日期筛选),可以用Period类型,它支持的时间范围比datetime64[ns]大得多:

import pandas as pd

data = [['A', '2021-08-08'], ['B', '2021/08/08'], ['C', '3031-08-08']]
df = pd.DataFrame(data, columns = ['Name', 'Date'])

# 转换为Period类型(freq='D'表示按天精度)
df['Date'] = df['Date'].apply(lambda x: pd.Period(x, freq='D'))

转换后,你可以正常进行时间操作,比如:

# 给日期加1天
df['Date'] + pd.offsets.Day(1)
# 输出结果:0   2021-08-09, 1   2021-08-09, 2   3031-08-09

方法3:统一为字符串格式(仅适合存储/展示)

如果不需要对日期进行运算,只是想统一格式后保留,可以先将所有日期转为ISO标准格式的字符串:

import pandas as pd
from dateutil import parser

data = [['A', '2021-08-08'], ['B', '2021/08/08'], ['C', '3031-08-08']]
df = pd.DataFrame(data, columns = ['Name', 'Date'])

# 先解析为datetime再转为ISO字符串
df['Date'] = df['Date'].apply(lambda x: parser.parse(x).isoformat())

这样所有日期都会变成YYYY-MM-DDTHH:MM:SS格式的字符串,方便后续统一处理。

内容的提问来源于stack exchange,提问作者richa bharwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:12:35