pandas转换混合英/意月份的%d-%b-%y日期列及Colab locale报错解决
解决方案
报错原因说明
Colab环境下抛出unsupported locale setting报错,是因为Colab默认的Linux系统环境未预装对应的语言locale包,切换locale的方案强依赖系统配置,通用性较差。我们可以采用无系统依赖的月份映射替换方案解决意大利语月份、小写月份的识别问题。
核心思路
先建立意大利语月份缩写到英语月份缩写的映射表,将日期字符串中的意大利语月份统一替换为pandas可识别的英语缩写,同时兼容小写格式的月份,再执行datetime转换即可。
意大利语-英语月份缩写映射表
| 意大利语缩写 | 对应英语缩写 | 月份 |
|---|---|---|
| gen | jan | 1月 |
| feb | feb | 2月 |
| mar | mar | 3月 |
| apr | apr | 4月 |
| mag | may | 5月 |
| giu | jun | 6月 |
| lug | jul | 7月 |
| ago | aug | 8月 |
| set | sep | 9月 |
| ott | oct | 10月 |
| nov | nov | 11月 |
| dic | dec | 12月 |
完整可运行代码
import pandas as pd # 读取原始数据 url = "http://www.dt.mef.gov.it/modules/documenti_en/debito_pubblico/scadenze_titoli_suddivise_per_anno/Maturities_broken_down_by_year_xupdate_July_31x_2021x.csv" df = pd.read_csv(url, skiprows=4) # 定义意大利语月份转英语月份映射,加单词边界避免误替换 it_month_map = { r'\bgen\b': 'jan', r'\bfeb\b': 'feb', r'\bmar\b': 'mar', r'\bapr\b': 'apr', r'\bmag\b': 'may', r'\bgiu\b': 'jun', r'\blug\b': 'jul', r'\bago\b': 'aug', r'\bset\b': 'sep', r'\bott\b': 'oct', r'\bnov\b': 'nov', r'\bdic\b': 'dec' } def date_convert(col: pd.Series) -> pd.Series: # 统一转小写 date_str = col.str.lower() # 批量替换意大利语月份为英语月份 for it_pattern, en_month in it_month_map.items(): date_str = date_str.str.replace(it_pattern, en_month, regex=True) # 转换为datetime类型 return pd.to_datetime(date_str, format='%d-%b-%y', errors='coerce') # 转换两个日期列 df['Issue date'] = date_convert(df['Issue date']) df['Redemption date'] = date_convert(df['Redemption date']) # 验证转换结果 print("Issue date空值数量:", df['Issue date'].isnull().sum()) print("Redemption date空值数量:", df['Redemption date'].isnull().sum()) print("转换后列类型:\n", df[['Issue date', 'Redemption date']].dtypes)
效果说明
- 除原数据本身存在的2条空日期记录外,其余所有日期均可正常转换,无解析报错
- 转换后两列均为
datetime64[ns]标准日期类型,可直接用于后续日期计算 - 方案不依赖系统locale配置,在Colab、Windows、MacOS等所有环境均可直接运行
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

