如何利用日线数据的日期与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
相关产品推荐
相关产品推荐

