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

如何用Python比较两个CSV的日期列并输出差异至第三个CSV

基于日期格式对比两个CSV文件差异并输出结果

问题分析

你需要实现基于特定日期格式对比两个CSV文件的差异并输出到新文件,但提供的原代码存在多处错误,且未实现核心的日期对比逻辑:

  • 以只读模式(r)打开文件却执行write操作,直接触发IO错误
  • with上下文管理器会自动关闭文件,无需手动调用close()
  • 在with块外执行readlines(),此时文件已关闭,无法读取内容
  • 仅简单对比整行内容,完全未涉及日期格式匹配的差异判断

修正后的完整实现方案

以下是符合需求的可运行脚本,包含日期格式统一、基于ID+日期的精准对比:

import csv
from datetime import datetime

# 自定义日期格式,根据你的实际CSV日期格式调整,如"%Y/%m/%d" "%d-%b-%Y"
TARGET_DATE_FORMAT = "%Y-%m-%d"
ID_COLUMN = "ID"
DATE_COLUMN = "Date"

def parse_csv(file_path):
    """读取CSV,返回以(ID, 标准化日期)为键的字典,存储整行数据"""
    csv_data = {}
    with open(file_path, 'r', newline='', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row_num, row in enumerate(reader, start=2):  # row_num从2开始对应CSV实际行号(跳过表头)
            # 解析并标准化日期格式,确保对比一致性
            try:
                date_raw = row[DATE_COLUMN]
                date_obj = datetime.strptime(date_raw, TARGET_DATE_FORMAT)
                std_date = date_obj.strftime(TARGET_DATE_FORMAT)
            except ValueError:
                print(f"跳过第{row_num}行:日期格式不符合要求 -> {date_raw}")
                continue
            
            # 用ID+标准化日期作为唯一标识键
            unique_key = (row[ID_COLUMN], std_date)
            csv_data[unique_key] = row
    return csv_data

# 读取两个源CSV的数据
source1_data = parse_csv("example.csv")
source2_data = parse_csv("example2.csv")

# 筛选出source2有但source1没有的条目
diff_entries = [row for key, row in source2_data.items() if key not in source1_data]

# 写入差异文件
if diff_entries:
    with open("DIFF.csv", 'w', newline='', encoding='utf-8') as out_file:
        writer = csv.DictWriter(out_file, fieldnames=diff_entries[0].keys())
        writer.writeheader()
        writer.writerows(diff_entries)
    print("差异文件DIFF.csv已生成")
else:
    print("两个文件基于ID和日期格式无差异")

核心功能说明

  • 日期标准化:通过datetime模块将日期统一转换为指定格式,避免因格式差异(如2024/05/20和2024-05-20)导致的误判
  • 精准对比逻辑:采用(ID, 标准化日期)作为唯一标识,确保是同一ID下的日期条目对比,比整行对比更贴合业务需求
  • CSV规范处理:使用官方csv模块读写,自动处理含逗号、引号的特殊字段,避免手动拼接字符串引发的格式错误
  • 错误容错:对格式无效的日期行进行提示并跳过,提升脚本健壮性

原代码错误修正点

  1. 移除只读模式下的write操作,改用csv模块规范读取
  2. 删除with块内的手动close()调用,依赖上下文管理器自动管理文件生命周期
  3. 将文件读取逻辑移至with块内,确保文件处于打开状态时读取内容
  4. 新增日期格式解析与标准化逻辑,实现需求要求的基于日期格式的差异对比

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:27:37