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

Pandas合并DataFrame时日期格式不一致导致去重失败问题

问题

合并两个Pandas DataFrame时,合并前列名与日期格式均一致,但合并后其中一个DataFrame的日期字段带上了00:00:00时间戳,导致drop_duplicates()无法识别并去除重复数据。

尝试过在合并前转换new_df的日期格式:

new_df["Data"] = pd.to_datetime(new_df["Data"].dt.strftime('%Y-%m-%d'))

但问题依旧存在。

相关代码如下:

def save_csv_backup(self, new_df, unit):
    backup_file = f'{self.archives_file_path}/mutoh_{unit}.csv'
    current_data = self.get_CSV(backup_file)
    if current_data is None or current_data.empty:
        new_df.to_csv(backup_file, header='true',
                           index=False, date_format='%Y-%m-%d')
    else:
        new_df["Data"] = pd.to_datetime(
        new_df["Data"].dt.strftime('%Y-%m-%d'))
        print('CURRENT_DATA')
        print(current_data)
        print('NEW_DATA')
        print(new_df)
        print('łączę')
        merged_df = pd.concat([current_data, new_df]).drop_duplicates().reset_index(drop=True)
        print(merged_df)
        self.remove_CSV(backup_file)
        merged_df.to_csv(backup_file, header='true',
                                index=False, date_format='%Y-%m-%d')

执行后发现:合并后的DataFrame里,current_data的日期为YYYY-MM-DD格式,new_df的日期变为YYYY-MM-DD 00:00:00,重复数据无法被去重。

解决方法

问题核心是两个DataFrame的日期列数据类型/精度不统一:current_data的日期可能是字符串类型,而new_df处理后是带时间的datetime类型,导致去重时无法匹配。

1. 统一日期列的类型与精度

合并前同时对两个DataFrame的Data列做标准化处理,二选一即可:

方法一:转为datetime后提取纯日期对象

将日期转为datetime.date类型,彻底去除时间部分:

# 处理current_data的日期列
current_data["Data"] = pd.to_datetime(current_data["Data"]).dt.date
# 处理new_df的日期列
new_df["Data"] = pd.to_datetime(new_df["Data"]).dt.date

方法二:截断datetime到日(保留datetime类型)

用floor('D')把时间部分统一为00:00:00,确保两个DataFrame的datetime精度一致:

# 处理current_data
current_data["Data"] = pd.to_datetime(current_data["Data"]).dt.floor('D')
# 处理new_df
new_df["Data"] = pd.to_datetime(new_df["Data"]).dt.floor('D')

2. 修改后的完整代码

把统一格式的逻辑加入原函数:

def save_csv_backup(self, new_df, unit):
    backup_file = f'{self.archives_file_path}/mutoh_{unit}.csv'
    current_data = self.get_CSV(backup_file)
    if current_data is None or current_data.empty:
        new_df.to_csv(backup_file, header='true',
                           index=False, date_format='%Y-%m-%d')
    else:
        # 统一两个DataFrame的日期格式
        current_data["Data"] = pd.to_datetime(current_data["Data"]).dt.floor('D')
        new_df["Data"] = pd.to_datetime(new_df["Data"]).dt.floor('D')
        
        print('CURRENT_DATA')
        print(current_data)
        print('NEW_DATA')
        print(new_df)
        print('łączę')
        merged_df = pd.concat([current_data, new_df]).drop_duplicates().reset_index(drop=True)
        print(merged_df)
        self.remove_CSV(backup_file)
        merged_df.to_csv(backup_file, header='true',
                                index=False, date_format='%Y-%m-%d')

3. 额外注意事项

  • 读取CSV时,确保get_CSV方法用pd.read_csv(..., parse_dates=['Data'])直接将日期列解析为datetime类型,避免后续类型混乱。
  • 写入CSV时始终指定date_format='%Y-%m-%d',保证存储的日期格式统一,避免下次读取时出现差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:43:09