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
相关产品推荐
相关产品推荐

