如何解决Pandas to_datetime将两位年份71识别为2071的问题?
解决Pandas识别两位年份为20xx而非19xx的问题
针对你遇到的01-19-71被识别为2071而非1971的问题,可以通过自定义日期解析函数兼容多种日期格式,同时正确处理两位年份的世纪推断。以下是修改后的方案:
核心思路
- 区分提取到的日期字符串格式,重点处理两位年份的场景(如
MM-DD-YY) - 利用Python标准库
datetime的strptime方法,通过%y格式符自动将70-99区间的两位年份映射到1970-1999年 - 兼容其他已有格式(英文月份、四位年份等),不破坏原有逻辑
修改后的代码
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
相关产品推荐
相关产品推荐

