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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:44:59