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

如何解决Pandas to_datetime将两位年份71识别为2071的问题?

解决Pandas识别两位年份为20xx而非19xx的问题

针对你遇到的01-19-71被识别为2071而非1971的问题,可以通过自定义日期解析函数兼容多种日期格式,同时正确处理两位年份的世纪推断。以下是修改后的方案:

核心思路

  1. 区分提取到的日期字符串格式,重点处理两位年份的场景(如MM-DD-YY)
  2. 利用Python标准库datetime的strptime方法,通过%y格式符自动将70-99区间的两位年份映射到1970-1999年
  3. 兼容其他已有格式(英文月份、四位年份等),不破坏原有逻辑

修改后的代码

import re
import pandas as pd
from datetime import datetime

re_1 = r"\d{1,2}[/-]\d{1,2}[/-]\d{2,4}"
re_2 = r"(?:\d{1,2} )?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*[ \-\.,]+(?:\d{1,2}[\w]*[ \-,]+)?[1|2]\d{3}"
re_3 = r"(?:\d{1,2}/)?[1|2]\d{3}"

# 修正拼写错误
df = df.str.replace("Janaury", "January")
df = df.str.replace("Decemeber", "December")

# 提取日期
regex = "((%s)|(%s)|(%s))"%(re_1, re_2, re_3)
dates = df.str.extract(regex)

# 自定义日期解析函数
def parse_custom_date(date_str):
    if pd.isna(date_str):
        return pd.NaT
    # 匹配两位年份的日期格式(如MM-DD-YY或DD-MM-YY)
    if re.match(r'\d{1,2}[/-]\d{1,2}[/-]\d{2}$', date_str):
        # 先尝试MM-DD-YY格式(你的场景是这种)
        try:
            return datetime.strptime(date_str, '%m-%d-%y')
        except ValueError:
            # 如果失败,尝试DD-MM-YY格式
            try:
                return datetime.strptime(date_str, '%d-%m-%y')
            except ValueError:
                # 仍失败则交给Pandas自动解析
                return pd.to_datetime(date_str, errors='coerce')
    else:
        # 其他格式直接交给Pandas处理
        return pd.to_datetime(date_str, errors='coerce')

# 应用自定义解析函数并排序
dates = dates.iloc[:,0].apply(parse_custom_date)
dates.sort_values(ascending=True, inplace=True)

关键说明

  • datetime.strptime的%y格式符遵循规则:00-69对应2000-2069年,70-99对应1970-1999年,正好匹配你需要的71→1971的需求
  • 自定义函数加入双重格式尝试,避免因日期格式不统一(如部分是DD-MM-YY)导致的解析失败
  • errors='coerce'会将解析失败的日期转为NaT,避免程序崩溃

内容的提问来源于stack exchange,提问作者Markus RoI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:06:29