如何验证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)
解决方案
代码修改说明
现有代码核心问题:
- 错误使用
df[item]代替item,df[item]会尝试用当前值作为列名查找,导致KeyError。 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)
逻辑说明
- 遍历目标列的每个非空值,依次尝试用两种格式解析。
- 如果两种格式解析都抛出
ValueError,则判定为不匹配值,加入收集列表。 - 最后统一输出结果,会得到预期的
Tuesday, August 23, 2022、abc123、8/22/22。
内容的提问来源于stack exchange,提问作者Captain Caveman
相关产品推荐
相关产品推荐

