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

如何利用日线数据的日期与symbol筛选分钟OHLC数据?

问题:筛选匹配symbol和日期的分钟级OHLC数据

问题背景

我有一个分钟级OHLC的DataFrame(dfm):

timestamp    open    high     low  ...      vwap  symbol  volume_10_day        date
0      2022-09-22 08:00:00+00:00  3.8400  3.9700  3.8400  ...  3.898279     APE           None  2022-12-22
1      2022-09-22 08:05:00+00:00  3.9100  3.9600  3.9000  ...  3.913727     APE           None  2022-12-22
...                          ...     ...     ...     ...  ...       ...     ...            ...         ...
21288  2022-12-24 00:35:00+00:00  2.2400  2.2400  2.2200  ...  2.227360    XPON           None  2022-12-23
21292  2022-12-24 00:55:00+00:00  2.2395  2.2395  2.1700  ...  2.202498    XPON           None  2022-12-23

[21293 rows x 11 columns]

还有一个日线筛选后的DataFrame(dfd):

level_0  index        date symbol  ...  change_1_day  change_10_day  volume_10_day  volume_1_day
0    22177  22177  2022-12-20   ICCM  ...    177.599829           None           None       30005.0
1    30404  30404  2022-12-22    APE  ...     75.182482           None           None        2224.0
2    46210  46210  2022-12-21   SINT  ...     57.161981           None           None      857345.0
3    47737  47737  2022-12-23   XPON  ...    139.185751           None           None         284.0

需要从dfm中筛选出同时存在于dfd的symbol和date组合的分钟数据。原尝试的代码逻辑有问题,导致筛选不全(仅保留了APE和XPON的数据,遗漏了ICCM和SINT)。

原代码问题分析

原代码的核心错误:

  • 仅按date分组,同一个日期下的多个symbol只会取第一个行的symbol进行判断,导致同日期下其他符合条件的symbol被遗漏
  • 使用全局变量df循环concat,不仅效率极低,还容易引发数据拼接错误
  • 未处理日期类型不一致的问题:如果dfm的date是datetime类型,dfd的date是字符串类型,会直接导致匹配失败(比如ICCM的日期无法匹配)

正确解决方案

方法1:使用merge(推荐,高效清晰)

利用pandas的内连接功能,直接匹配symbol和date组合:

import pandas as pd

dfm = pd.read_sql_query("SELECT * from ohlc_minutes", conn)
dfd = pd.read_sql_query("SELECT * from filtered_ohlc_init", conn)

# 统一日期类型为date格式,避免datetime和字符串不匹配
dfm['date'] = pd.to_datetime(dfm['date']).dt.date
dfd['date'] = pd.to_datetime(dfd['date']).dt.date

# 提取dfd中用于匹配的关键列
match_criteria = dfd[['symbol', 'date']]

# 内连接:只保留两边都存在的symbol+date组合的行
filtered_df = pd.merge(dfm, match_criteria, on=['symbol', 'date'], how='inner')

# 验证结果
print(filtered_df.groupby('symbol').symbol.nunique())

方法2:使用isin结合元组匹配

将dfd的symbol和date组合成元组集合,再筛选dfm:

import pandas as pd

dfm = pd.read_sql_query("SELECT * from ohlc_minutes", conn)
dfd = pd.read_sql_query("SELECT * from filtered_ohlc_init", conn)

# 统一日期类型
dfm['date'] = pd.to_datetime(dfm['date']).dt.date
dfd['date'] = pd.to_datetime(dfd['date']).dt.date

# 创建有效(symbol, date)元组集合
valid_pairs = set(zip(dfd['symbol'], dfd['date']))

# 筛选符合条件的行
filtered_df = dfm[dfm.apply(lambda row: (row['symbol'], row['date']) in valid_pairs, axis=1)]

# 验证结果
print(filtered_df.groupby('symbol').symbol.nunique())

关键注意事项

  • 日期类型必须统一:这是筛选不全的核心原因之一,务必确保两个DataFrame的date列类型完全一致(比如都转为datetime.date或字符串)
  • 避免低效的循环拼接:原代码的groupby+concat方法性能极差,对于大数据量会严重拖慢运行速度,推荐使用merge或isin的矢量化操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:10:34