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

如何在多交易标的分钟级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:35:19