Python中pd.to_datetime无法转换DDMMMYYYY格式日期求助
解决pd.to_datetime处理混合日期格式(DDMMMYYYY/DD/MM/YYYY)的问题
我之前处理多格式日期数据时也踩过这个坑,尤其是DDMMMYYYY这种带英文月份缩写的格式,直接用默认的pd.to_datetime很容易报错。结合你的需求(要转换的列存在var列表里,还要保留NaN值),这里有两个实用方案:
方案1:用format列表直接匹配(Pandas 2.0+推荐)
从Pandas 2.0版本开始,pd.to_datetime的format参数支持传入格式列表,它会自动尝试用列表里的格式去匹配每个日期字符串,非常省心。
代码示例:
import pandas as pd # 遍历需要转换的列 for col in var: # 尝试两种格式:DD/MM/YYYY 和 DDMMMYYYY(%b对应英文月份缩写,比如Feb) df[col] = pd.to_datetime(df[col], format=['%d/%m/%Y', '%d%b%Y'], errors='coerce')
小细节补充:
- 如果你的数据里月份缩写是小写(比如
feb而不是Feb),可以先把字符串转成大写再转换,避免匹配失败:df[col] = pd.to_datetime(df[col].str.upper(), format=['%d/%m/%Y', '%d%b%Y'], errors='coerce') errors='coerce'参数会把无法转换的字符串(包括原本的NaN)统一转为NaT(Pandas的缺失日期类型),完美符合你的需求。
方案2:自定义转换函数(兼容低版本Pandas)
如果你还在使用Pandas 2.0以下的版本,format不支持列表,那就写个简单的自定义函数,逐个尝试格式转换:
def parse_mixed_dates(date_str): # 先处理NaN的情况 if pd.isna(date_str): return pd.NaT # 先尝试DD/MM/YYYY格式 try: return pd.to_datetime(date_str, format='%d/%m/%Y') except ValueError: # 失败的话再尝试DDMMMYYYY格式 try: return pd.to_datetime(date_str, format='%d%b%Y') except ValueError: # 两种格式都匹配失败,返回NaT return pd.NaT # 应用到每个目标列 for col in var: df[col] = df[col].apply(parse_mixed_dates)
额外注意点
- 月份缩写的语言问题:如果你的数据里的月份缩写不是英文(比如法语的
fév),需要先设置对应的locale,否则%b无法识别:import locale # 示例:设置为英文locale(不同系统写法可能不同,Windows是'English_US',Linux/macOS是'en_US.UTF-8') locale.setlocale(locale.LC_TIME, 'en_US.UTF-8') - 验证转换结果:转换完成后,可以用下面的代码检查是否成功:
# 查看所有目标列的数据类型 print(df[var].dtypes) # 查看每列转换后缺失值的数量(确认有没有未覆盖的格式) print(df[var].isna().sum())
内容的提问来源于stack exchange,提问作者Aaraeus
相关产品推荐
相关产品推荐

