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

如何在Pandas中保存执行日期且不覆盖历史记录?

解决CSV移除条目历史记录与日期标记问题

需求说明

现有每月更新的CSV数据库,通过Pandas对比新旧数据生成inserted.csv(新增条目)和removed.csv(移除条目),需实现:

  • 给removed.csv添加执行日期列,记录每次代码运行的日期
  • 多次执行代码时不覆盖原有数据,追加新的移除条目及对应日期

修改后的完整代码

import pandas as pd
from datetime import date

# 读取新旧数据
base = pd.read_csv('cadastro_de_empregadores.csv', sep=';', encoding="latin-1", skiprows=5)
copia_base = pd.read_csv('copia_base.csv', sep=';', encoding="latin-1")

# 清理空列
base.dropna(axis=1, how='all', inplace=True)

# 计算新增和移除条目
inseridos = copia_base[~copia_base['CNPJ/CPF'].isin(base['CNPJ/CPF'])]
retirados = base[~base['CNPJ/CPF'].isin(copia_base['CNPJ/CPF'])]

# 生成新增条目文件(直接覆盖,若需保留历史可参考移除条目逻辑)
inseridos.to_csv('inserted.csv', sep=';', encoding='latin-1', index=False)

# 处理移除条目:添加日期并保留历史数据
current_date = date.today().strftime('%Y-%m-%d')  # 统一格式为YYYY-MM-DD
retirados['执行日期'] = current_date

# 检查历史文件是否存在,实现追加逻辑
try:
    # 读取已有移除记录
    existing_removed = pd.read_csv('removed.csv', sep=';', encoding='latin-1')
    # 合并新数据与历史数据,避免同一日期下重复记录同一条目
    combined_removed = pd.concat([existing_removed, retirados]).drop_duplicates(subset=['CNPJ/CPF', '执行日期'], keep='first')
    combined_removed.to_csv('removed.csv', sep=';', encoding='latin-1', index=False)
except FileNotFoundError:
    # 文件不存在时直接写入初始数据
    retirados.to_csv('removed.csv', sep=';', encoding='latin-1', index=False)

关键逻辑说明

  1. 日期标记:用date.today()获取当前日期并格式化为标准字符串,添加为retirados的新列
  2. 历史数据保留:通过try-except捕获文件不存在的情况,存在则合并新老数据,不存在则直接生成文件,彻底避免覆盖
  3. 去重处理:合并时通过drop_duplicates过滤同一日期下的重复条目,可根据需求调整去重规则
  4. 格式兼容:全程沿用原数据的latin-1编码和;分隔符,避免乱码或格式错位

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:10:12