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

如何对Pandas DataFrame按日期去重保留每日最新条目?

问题:保留每日最新的DataFrame条目

我每日从网站多次爬取数据,生成如下Pandas DataFrame:

import pandas as pd
from pandas import Timestamp

df=pd.DataFrame({
'Tech en Innovation Fonds': {0: '63.57', 1: '63.57', 2: '63.57', 3: '63.57', 4: '61.03', 5: '61.03', 6: 61.03}, 
'Aandelen Index Fonds': {0: '80.22', 1: '80.22', 2: '80.22', 3: '80.22', 4: '79.85', 5: '79.85', 6: 79.85}, 
'Behoudend Mix Fonds': {0: '44.80', 1: '44.8', 2: '44.8', 3: '44.8', 4: '44.8', 5: '44.8', 6: 44.8}, 
'Neutraal Mix Fonds': {0: '50.43', 1: '50.43', 2: '50.43', 3: '50.43', 4: '50.37', 5: '50.37', 6: 50.37}, 
'Dynamisch Mix Fonds': {0: '70.20', 1: '70.2', 2: '70.2', 3: '70.2', 4: '70.04', 5: '70.04', 6: 70.04}, 
'Risicomijdende Strategie': {0: '46.03', 1: '46.03', 2: '46.03', 3: '46.03', 4: '46.08', 5: '46.08', 6: 46.08}, 
'Tactische Strategie': {0: '48.69', 1: '48.69', 2: '48.69', 3: '48.69', 4: '48.62', 5: '48.62', 6: 48.62}, 
'Aandelen Groei Strategie': {0: '52.91', 1: '52.91', 2: '52.91', 3: '52.91', 4: '52.77', 5: '52.77', 6: 52.77}, 
'Datum': {0: Timestamp('2022-07-08 18:00:00'), 1: Timestamp('2022-07-11 19:42:55'), 2: Timestamp('2022-07-12 09:12:09'), 3: Timestamp('2022-07-12 09:29:53'), 4: Timestamp('2022-07-12 15:24:46'), 5: Timestamp('2022-07-12 15:30:02'), 6: Timestamp('2022-07-12 15:59:31')}})

需求是清理DataFrame,仅保留每个日期的最新条目。比如示例中2022-07-12有5条数据,需保留最后一条(2022-07-12 15:59:31)。每月处理一次,每日会有多条数据。

尝试过以下代码,但因为时间不同,返回了所有记录,未能实现需求:

dfclean=df.sort_values('Datum').drop_duplicates('Datum', keep='last')

解决方案

原代码无效的核心原因是:Datum列包含完整时间戳(日期+时分秒),每个条目值唯一,drop_duplicates无法按日期维度去重。以下两种方法可以实现需求:

方法一:按日期分组筛选最新记录

先提取Datum的日期部分作为分组键,再保留每组内时间最晚的行:

# 先按时间戳排序,确保每组内顺序正确
df_sorted = df.sort_values('Datum')
# 按日期分组,保留每组中时间最晚的条目
df_clean = df_sorted.groupby(df_sorted['Datum'].dt.date).last().reset_index(drop=True)

方法二:转换日期后去重

将Datum转换为日期格式作为去重依据,同时保留原时间戳的最新记录:

# 先按时间戳排序
df_sorted = df.sort_values('Datum')
# 基于日期部分去重,保留每组最后一条
df_clean = df_sorted.drop_duplicates(subset=df_sorted['Datum'].dt.date, keep='last')

额外优化:统一数值列格式

注意到DataFrame中部分数值列存在字符串与数字混合的情况(如Tech en Innovation Fonds列),可以统一转换为数值类型:

# 遍历所有非Datum列,转换为float类型
for col in df.columns.drop('Datum'):
    df[col] = pd.to_numeric(df[col])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:06:23