如何移除pd.to_datetime转换失败的行并生成无效日期行独立DataFrame
处理日期解析时捕获格式无效的行(忽略空值/空字符串)
我在解析DataFrame的日期列时,需要捕获所有格式无效导致转换失败的行并记录其ID,但要忽略原本就是空值或空字符串的行,只保留像|199/142/4这类格式错误的行。现有代码如下:
# Create a dataframe with float values data = { 'ID': [1, 2, 3, 4, 5], 'Date': ['09/02/1999', '11/12/2001', '', '', '|199/142/4'] } df = pd.DataFrame(data) original_null = df[col].isnull() try: df['Date'] = pd.to_datetime(df['Date'], format='mixed', errors='coerce').dt.strftime('%m/%d/%Y') invalid_dates = df[df['Date'].isnull()] invalid_dates = invalid_dates[~invalid_dates.index.isin(original_null[original_null].index)] if not invalid_dates.empty: with open(data_path + client_alias + '_removed_ids.log', 'w') as log_file: log_file.write(f"Removed IDs for column {col}:\n") log_file.write(invalid_dates['ID'].to_string(index=False) + '\n') df = df[~df['ID'].isin(invalid_dates['ID'])] except Exception as e: None
原代码存在几个问题:col变量未定义,仅判断了isnull()而忽略空字符串,且直接覆盖原Date列会丢失原始无效日期值。以下是修正后的方案:
修正后的代码
import pandas as pd # 创建示例DataFrame data = { 'ID': [1, 2, 3, 4, 5], 'Date': ['09/02/1999', '11/12/2001', '', '', '|199/142/4'] } df = pd.DataFrame(data) col = 'Date' # 明确目标列 data_path = './' # 根据实际路径修改 client_alias = 'test' # 根据实际别名修改 # 标记原本是空值或空字符串的行(含全空格的情况) original_empty = df[col].isnull() | (df[col].str.strip() == '') try: # 新增临时列存储转换结果,错误时设为NaT,保留原Date列 df['Parsed_Date'] = pd.to_datetime(df[col], format='mixed', errors='coerce') # 筛选出:转换失败 且 原本不是空值/空字符串的行 invalid_dates = df[(df['Parsed_Date'].isnull()) & (~original_empty)].copy() # 仅保留需要的ID和原Date列 invalid_dates = invalid_dates[['ID', 'Date']] if not invalid_dates.empty: # 写入日志文件 with open(f"{data_path}{client_alias}_removed_ids.log", 'w') as log_file: log_file.write(f"Removed IDs for column {col}:\n") log_file.write(invalid_dates['ID'].to_string(index=False) + '\n') # 从原DataFrame中移除这些无效行 df = df[~df['ID'].isin(invalid_dates['ID'])] # 把成功转换的日期格式化为指定字符串,空值/空字符串保留原样 df['Date'] = df['Parsed_Date'].dt.strftime('%m/%d/%Y').where(df['Parsed_Date'].notnull(), df['Date']) # 清理临时列 df = df.drop('Parsed_Date', axis=1) except Exception as e: print(f"处理出错: {e}") # 输出捕获到的无效日期行 print("捕获到的无效日期行:") print(invalid_dates)
运行结果
执行后会得到符合预期的无效行DataFrame:
ID Date 4 5 |199/142/4
内容的提问来源于stack exchange,提问作者KL_
相关产品推荐
相关产品推荐

