如何在多交易标的分钟级DataFrame中去除重复日期并解决drop_duplicates失效问题
解决方案
核心问题分析
你现有代码的两个关键问题:
drop_duplicates默认返回新DataFrame,不会修改原数据,必须重新赋值或开启inplace=True才会生效- 选择的
subset=['symbol', 'timestamp']是去重同一标的的同一分钟重复数据,和你「每个日期仅保留一个标的所有分钟数据」的需求不匹配
正确实现步骤
步骤1:预处理时间戳
先确保时间戳为datetime类型,并提取日期列用于分组:
import pandas as pd df = pd.read_sql_query("SELECT * from ohlc_minutes", conn) df['timestamp'] = pd.to_datetime(df['timestamp']) # 提取纯日期列(去掉时分秒) df['date'] = df['timestamp'].dt.date
步骤2:筛选每个日期的首个标的数据
提供两种简洁实现方式:
方式一:标记筛选法
先获取每个日期首次出现的标的,再过滤原数据:
# 获取每个日期对应的首个标的 first_symbol_map = df.drop_duplicates(subset=['date'], keep='first')[['date', 'symbol']] # 保留原DataFrame中属于这些(date, symbol)组合的所有行 filtered_df = df.merge(first_symbol_map, on=['date', 'symbol'], how='inner') # 可选:删除临时日期列 filtered_df = filtered_df.drop('date', axis=1)
方式二:分组转换法
直接通过布尔索引筛选,代码更简洁:
# 对每个日期组,判断当前行标的是否等于组内第一个标的 keep_mask = df.groupby('date')['symbol'].transform(lambda x: x == x.iloc[0]) filtered_df = df[keep_mask].drop('date', axis=1)
修正你原有代码的示例(若需去重同一标的同一分钟数据)
如果你的需求包含去重同一标的同一分钟的重复数据,需修正代码为:
df = pd.read_sql_query("SELECT * from ohlc_minutes", conn) print(len(df)) df['timestamp'] = pd.to_datetime(df['timestamp']) # 重新赋值给原变量,或添加inplace=True df = df.drop_duplicates(subset=['symbol', 'timestamp']) print(len(df))
内容的提问来源于stack exchange,提问作者a7dc
相关产品推荐
相关产品推荐

