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

如何验证DataFrame日期格式并捕获不匹配值?

问题描述

需要完成以下工作流程:

  • 验证column_1和column_2列中所有日期的格式。
  • 识别不符合mm/dd/yy hh:mm或mm/dd/yyyy hh:mm格式的日期。
  • 打印这些不匹配的值。

注意:部分值可能不是日期,无法确定所有日期的具体格式。

示例输入CSV数据

column_1    column_2
8/22/22 15:27   8/24/22 15:27
8/23/22 15:27   Tuesday, August 23, 2022
8/24/22 15:27   abc123
8/25/22 15:27   8/25/2022 15:27
8/26/22 15:27   8/26/2022 18:27
8/26/22 15:27   8/22/22

现有问题

使用pd.to_datetime()时所有值均触发异常,无法筛选出真正不匹配指定格式的值,期望仅输出Tuesday, August 23, 2022、abc123、8/22/22这些不匹配值。

现有代码

df = pd.read_csv('input.csv', encoding='ISO-8859-1', dtype=str)

date_columns = ['column_1', 'column_2']

format_one = '%m/%d/%y %H:%M'
format_two = '%m/%d/%Y %H:%M'

for column in date_columns:
    for item in df[column]:
        try:
            if pd.to_datetime(df[item], format=format_one):
                print('format 1: ' + item)
            elif pd.to_datetime(df[item], format=format_two):
                print('format 2: ' + item)   
            else:
                print('unknown format: ' + item)
        except Exception as e:
            print('Exception:' )
            print(e)  
解决方案

代码修改说明

现有代码核心问题:

  1. 错误使用df[item]代替item,df[item]会尝试用当前值作为列名查找,导致KeyError。
  2. pd.to_datetime指定格式时,不符合格式直接抛出异常,不会返回False,因此不能用if/elif判断。

修改后的代码会逐个验证每个值是否匹配两种目标格式,收集不匹配值后统一输出:

import pandas as pd

df = pd.read_csv('input.csv', encoding='ISO-8859-1', dtype=str)
date_columns = ['column_1', 'column_2']
format_one = '%m/%d/%y %H:%M'
format_two = '%m/%d/%Y %H:%M'

# 收集所有不匹配的值
invalid_dates = []

for column in date_columns:
    for item in df[column].dropna():  # 跳过空值
        is_valid = False
        try:
            pd.to_datetime(item, format=format_one)
            is_valid = True
        except ValueError:
            try:
                pd.to_datetime(item, format=format_two)
                is_valid = True
            except ValueError:
                # 两种格式都不匹配,加入列表
                invalid_dates.append(item)

# 打印所有不匹配的值
print("不匹配指定格式的值:")
for val in invalid_dates:
    print(val)

逻辑说明

  1. 遍历目标列的每个非空值,依次尝试用两种格式解析。
  2. 如果两种格式解析都抛出ValueError,则判定为不匹配值,加入收集列表。
  3. 最后统一输出结果,会得到预期的Tuesday, August 23, 2022、abc123、8/22/22。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:30:12