
本文详解如何在 Pandas 中正确解析不含年份的巴西葡萄牙语日期(如“28 JUL”“04 AGO”),解决因 locale 不匹配导致的 NaT 和默认年份(1900)问题,并提供强制指定年份的可靠方案。
本文详解如何在 pandas 中正确解析不含年份的巴西葡萄牙语日期(如“28 jul”“04 ago”),解决因 locale 不匹配导致的 `nat` 和默认年份(1900)问题,并提供强制指定年份的可靠方案。
在使用 Pandas 处理金融或账单类数据时,常遇到仅含日+月份缩写的日期列(如 "28 JUL"、"04 AGO"),且月份为葡萄牙语(JUL = julho, AGO = agosto)。直接调用 pd.to_datetime(df["Data"], format="%d %b", errors="coerce") 会失败——不仅大量转为 NaT,剩余成功解析的日期还会被默认赋予 1900 年。根本原因在于:Python 的 strptime 依赖系统 locale 来识别非英语月份缩写,而默认环境通常不支持 PT_BR。
✅ 正确做法:配置 locale 并解析
首先确保系统已安装 pt_BR.UTF-8 locale(Linux/macOS 可通过 locale -a | grep pt_BR 检查;Windows 需启用语言包或改用替代方案)。然后在代码中显式设置:
import locale
import pandas as pd
# 设置巴西葡萄牙语 locale(关键步骤!)
try:
locale.setlocale(locale.LC_ALL, 'pt_BR.UTF-8')
except locale.Error:
# 若 locale 不可用,可降级使用临时映射(见下方备选方案)
print("警告:pt_BR.UTF-8 locale 不可用,将使用手动映射方案")
# 解析无年份日期(自动补 1900 年)
df["Data_converted"] = pd.to_datetime(df["Data"], format="%d %b", errors="coerce")
此时 "28 JUL" → 1900-07-28,"04 AGO" → 1900-08-04,不再出现 NaT(前提是 locale 设置成功)。
? 强制指定年份(推荐用于实际业务)
因原始数据缺失年份,但业务上通常属于同一自然年(如 2025 年账单),应主动注入年份避免歧义:
# 方案一:拼接字符串后解析(最简洁可靠)
df["Data_converted"] = pd.to_datetime("2025 " + df["Data"],
format="%Y %d %b",
errors="coerce")
# 方案二:若需动态年份(如取当前年),使用 apply + lambda
from datetime import datetime
current_year = datetime.now().year
df["Data_converted"] = df["Data"].apply(
lambda x: pd.to_datetime(f"{current_year} {x}", format="%Y %d %b", errors="coerce")
)
✅ 输出示例:
Data Data_converted 0 28 JUL 2025-07-28 1 04 AGO 2025-08-04 2 31 JUL 2025-07-31 3 07 AGO 2025-08-07
⚠️ 注意事项与备选方案
-
Windows 用户注意:
locale.setlocale(locale.LC_ALL, 'pt_BR.UTF-8')可能报错。此时推荐绕过 locale,采用字典映射方式:month_map = {"JAN": "Jan", "FEV": "Feb", "MAR": "Mar", "ABR": "Apr", "MAI": "May", "JUN": "Jun", "JUL": "Jul", "AGO": "Aug", "SET": "Sep", "OUT": "Oct", "NOV": "Nov", "DEZ": "Dec"} df["Data_fixed"] = df["Data"].str.upper().replace(month_map, regex=True) df["Data_converted"] = pd.to_datetime("2025 " + df["Data_fixed"], format="%Y %d %b", errors="coerce") 数据清洗前置:确保日期列无空格/特殊字符干扰,建议先执行
df["Data"] = df["Data"].str.strip()。验证结果:务必检查
df["Data_converted"].isna().sum()是否为 0,并抽样确认格式正确性。
掌握 locale 配置与年份注入技巧,即可稳健处理多语言无年份日期列——这是金融、会计类数据清洗的关键一环。










