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

如何移除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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:06:09