如何使用Pandas添加当前日期且不覆盖历史日期?
解决方案
核心问题分析
你之前用mode='a'写入CSV导致数据重复,根源是每次运行都把源CSV的全量数据重新写入了一次。正确思路是:给当前处理的数据添加当日日期后,只追加新增条目到目标文件,或者合并数据后去重再保存,避免重复。
具体实现步骤
1. 导入依赖库
import pandas as pd from datetime import date import os
2. 读取源CSV的有效数据
跳过前5行无用内容,读取核心业务数据:
# 读取外部系统生成的源CSV df_fonte = pd.read_csv('cadastro_de_empregadores.csv', sep=';', encoding="latin-1", skiprows=5)
3. 给当前批次数据添加当日日期
按需求将日期列插入到第10列位置(索引从0开始,对应表格的第11列):
# 生成当日日期,格式为 dd/mm/yyyy data_atual = date.today().strftime('%d/%m/%Y') # 插入Data列到指定位置 df_fonte.insert(loc=10, column='Data', value=data_atual)
4. 写入目标文件(避免重复)
分两种场景处理,匹配不同的数据源更新逻辑:
场景一:源CSV为全量数据
如果每次获取的源CSV包含所有历史数据,合并已有数据与当前数据,去重后覆盖保存:
arquivo_destino = 'dados_com_data.csv' if os.path.exists(arquivo_destino): # 读取已保存的历史数据 df_existente = pd.read_csv(arquivo_destino, sep=';', encoding="latin-1") # 合并数据,排除日期列后去重,保留最早的记录 df_final = pd.concat([df_existente, df_fonte]).drop_duplicates( subset=[col for col in df_fonte.columns if col != 'Data'], keep='first' ) # 写入合并后的数据 df_final.to_csv(arquivo_destino, sep=';', encoding="latin-1", index=False) else: # 首次写入,包含表头 df_fonte.to_csv(arquivo_destino, sep=';', encoding="latin-1", index=False)
场景二:源CSV为增量数据
如果每次获取的源CSV仅包含新增数据,筛选出未在目标文件中出现过的条目,再追加写入:
arquivo_destino = 'dados_com_data.csv' if os.path.exists(arquivo_destino): df_existente = pd.read_csv(arquivo_destino, sep=';', encoding="latin-1") # 替换为你数据中的唯一标识列(比如员工ID、企业编号等) df_novos = df_fonte[~df_fonte['ID_Empregador'].isin(df_existente['ID_Empregador'])] if not df_novos.empty: # 给新增条目添加日期(若前面已添加可省略) df_novos.insert(loc=10, column='Data', value=data_atual) # 追加写入,不重复输出表头 df_novos.to_csv(arquivo_destino, sep=';', encoding="latin-1", index=False, mode='a', header=False) else: # 首次写入 df_fonte.to_csv(arquivo_destino, sep=';', encoding="latin-1", index=False)
关键注意点
- 若没有明确的唯一标识列,场景一中的去重逻辑会对比除日期外的所有列,确保完全重复的条目只保留一次。
- 写入CSV时务必设置
index=False,避免生成多余的索引列。 - 保持分隔符、编码与源CSV一致(
sep=';'、encoding="latin-1"),防止乱码或格式错位。
内容的提问来源于stack exchange,提问作者Ana Fortes
相关产品推荐
相关产品推荐

