如何在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)
关键逻辑说明
- 日期标记:用
date.today()获取当前日期并格式化为标准字符串,添加为retirados的新列 - 历史数据保留:通过
try-except捕获文件不存在的情况,存在则合并新老数据,不存在则直接生成文件,彻底避免覆盖 - 去重处理:合并时通过
drop_duplicates过滤同一日期下的重复条目,可根据需求调整去重规则 - 格式兼容:全程沿用原数据的
latin-1编码和;分隔符,避免乱码或格式错位
内容的提问来源于stack exchange,提问作者Ana Fortes
相关产品推荐
相关产品推荐

