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

Python Pandas中验证DataFrame列日期格式的问题

问题描述

我有一个Pandas DataFrame,需要先验证DATE_DELIVERY列的所有数据是否符合MM/DD/YYYY格式,再继续执行程序。我使用了以下代码:

rowNum = 0
    
for dateValue in dataFrame['DATE_DELIVERY']:
    try:
        rowNum += 1
        dateValue = datetime.datetime.strftime(dateValue, '%m/%d/%Y')
    except:
        print(f"%%%%%% ERROR ---> INCORRECT DATE FORMAT: {dateValue}, DATE FORMAT SHOULD BE: MM/DD/YYYY")
        sys.exit()

但这段代码触发了异常分支,输出如下:

%%%%%% ERROR ---> INCORRECT DATE FORMAT: 01/01/2022 ON ROW #2, DATE FORMAT SHOULD BE: MM/DD/YYYY

注:该日期从CSV文件读取,格式为'01/01/2022'。我不知道问题出在哪里,请问还有其他验证日期格式的方法吗?

问题原因

你用错了方法:datetime.datetime.strftime()的作用是将已经是datetime类型的对象格式化为字符串,但从CSV读取的dateValue是字符串类型,不是datetime对象,所以调用这个方法会直接抛出异常,和日期格式本身无关。

解决方法

方法1:用strptime逐个验证字符串格式

strptime()是将字符串解析为datetime对象,能成功解析说明格式符合要求:

import datetime
import sys

rowNum = 0
for dateValue in dataFrame['DATE_DELIVERY']:
    rowNum += 1
    try:
        # 尝试将字符串按指定格式解析为datetime
        datetime.datetime.strptime(dateValue, '%m/%d/%Y')
    except ValueError:
        print(f"%%%%%% ERROR ---> INCORRECT DATE FORMAT: {dateValue} ON ROW #{rowNum}, DATE FORMAT SHOULD BE: MM/DD/YYYY")
        sys.exit()

方法2:用Pandas批量验证(更高效)

利用Pandas的to_datetime()方法,结合errors='coerce'将不符合格式的日期转为NaT(缺失日期值),然后检查是否存在这类值:

import pandas as pd

# 生成验证后的日期列,不符合格式的转为NaT
valid_dates = pd.to_datetime(dataFrame['DATE_DELIVERY'], format='%m/%d/%Y', errors='coerce')

# 找出所有格式错误的行
invalid_rows = dataFrame[valid_dates.isna()]

if not invalid_rows.empty:
    for idx, row in invalid_rows.iterrows():
        print(f"%%%%%% ERROR ---> INCORRECT DATE FORMAT: {row['DATE_DELIVERY']} ON ROW #{idx+1}, DATE FORMAT SHOULD BE: MM/DD/YYYY")
    sys.exit()

这种方法避免了循环遍历,处理大DataFrame时效率更高。

方法3:正则表达式匹配格式(仅验证格式,不验证日期合法性)

如果只是想快速匹配MM/DD/YYYY的字符串格式,可以用正则表达式,但注意这种方法无法验证日期的实际合法性(比如02/30/2022这种格式正确但不存在的日期会被误判为合法):

import re
import sys

date_pattern = re.compile(r'^\d{2}/\d{2}/\d{4}$')
rowNum = 0

for dateValue in dataFrame['DATE_DELIVERY']:
    rowNum += 1
    if not date_pattern.match(dateValue):
        print(f"%%%%%% ERROR ---> INCORRECT DATE FORMAT: {dateValue} ON ROW #{rowNum}, DATE FORMAT SHOULD BE: MM/DD/YYYY")
        sys.exit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:46:12