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

pd.to_datetime处理多格式日期列失败,请求排查代码错误

多格式日期列转换失败的原因及修复方案

问题描述

编写了一段遍历DataFrame的程序,目标是识别名为'Date'、'date'、'Dates'、'dates'的列,并用pd.to_datetime将列转换为datetime对象,指定格式为'%d-%m-%Y',但运行出错。数据集日期列包含多种格式及分隔符,例如:26/04/2007、01-15-1998、2020-12-2,调试时非指定格式的日期触发错误:

time data '26-2016-09' does not match format '%d-%m-%Y' (match)

原以为pd.to_datetime可以自动识别任意格式并转换为datetime对象,想知道代码存在什么错误。

原代码

from dateutil.parser import parse
import re
from datetime import datetime
import calendar

import pandas as pd

def date_fun(filepath):
     
   date_list=['Date', 'date', 'Dates', 'dates']
   
   for i in filepath.columns:
 
      for j in date_list:     
          if i==j:
            filepath[i]=pd.to_datetime(filepath[i], format='%d-%m-%Y')
           
                                                                         

main_path = pd.read_csv('C:/Data_Cleansing/lockdown_us.csv')
fpath=main_path.copy()


date_fun(fpath)

核心错误原因

  • 显式指定format参数限制了格式识别:当设置format='%d-%m-%Y'时,pd.to_datetime会强制要求所有日期字符串严格匹配该格式,一旦遇到用/分隔、月日年顺序不同、位数不足的日期,就会直接报错,不会自动尝试识别其他格式,这和你预期的“自动识别任意格式”完全相悖。
  • 嵌套循环冗余低效:用两层循环遍历列名和目标日期列表,逻辑冗余,完全可以用更简洁的方式筛选目标列。

修复方案

方案1:移除format参数,让pandas自动解析

pd.to_datetime默认会尝试识别多种常见日期格式,移除format参数即可处理多格式数据,同时优化列名判断逻辑:

import pandas as pd

def date_fun(filepath):
    date_cols = ['Date', 'date', 'Dates', 'dates']
    # 直接筛选符合条件的列
    target_cols = [col for col in filepath.columns if col in date_cols]
    for col in target_cols:
        # 移除format参数,添加errors='coerce'处理无效日期
        filepath[col] = pd.to_datetime(filepath[col], errors='coerce')

main_path = pd.read_csv('C:/Data_Cleansing/lockdown_us.csv')
fpath = main_path.copy()
date_fun(fpath)

方案2:用dateutil.parser.parse增强兼容性

如果pandas默认解析仍有问题,可使用dateutil.parser.parse处理更复杂的日期格式:

from dateutil.parser import parse
import pandas as pd

def date_fun(filepath):
    date_cols = ['Date', 'date', 'Dates', 'dates']
    target_cols = [col for col in filepath.columns if col in date_cols]
    for col in target_cols:
        # 用dateutil解析,处理空值和无效日期
        filepath[col] = filepath[col].apply(lambda x: parse(x) if pd.notna(x) else pd.NaT)

main_path = pd.read_csv('C:/Data_Cleansing/lockdown_us.csv')
fpath = main_path.copy()
date_fun(fpath)

关键注意点

  • errors='coerce'参数:将无法解析的日期转为NaT(pandas缺失日期值),避免程序崩溃,方便后续清理无效数据。
  • 简化列筛选逻辑:用列表推导式替代嵌套循环,代码更简洁高效。

内容的提问来源于stack exchange,提问作者Apoorva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:25:39