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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:21:07