如何利用日线DataFrame筛选匹配标的与日期的分钟OHLC数据?
解决方案
首先明确核心问题:你当前的操作无效,是因为分钟级DataFrame和日线DataFrame的匹配条件不兼容,具体包括两个关键点:
- 分钟DF的时间是带时分秒的
timestamp,而日线DF是纯日期的date,格式不统一; - 你尝试merge时,可能分钟DF缺少
symbol列(或者列名/值格式和日线DF不匹配),导致匹配逻辑失效。
步骤1:统一日期格式并确认标的列
先处理两个DataFrame的日期匹配,同时确保标的列存在且格式一致:
import pandas as pd # 1. 把日线DF的date转为日期类型(如果原先是字符串) df_daily['date'] = pd.to_datetime(df_daily['date']).dt.date # 2. 从分钟DF的timestamp中提取纯日期,生成date列(注意时区,如果timestamp带时区,先做时区转换) df['date'] = df['timestamp'].dt.date # 3. 确认分钟DF存在symbol列,且值和日线DF匹配(比如检查大小写、无多余空格) # 打印两个DF的标的列表,确认是否有交集 print("日线标的:", df_daily['symbol'].unique()) print("分钟标的:", df['symbol'].unique())
步骤2:过滤分钟级DataFrame
有两种可靠的过滤方式:
方式一:内连接Merge(推荐)
先从日线DF提取需要匹配的(symbol, date)唯一对,再和分钟DF做内连接,自动过滤不匹配的行:
# 提取日线中需要匹配的标的-日期对(去重避免重复匹配) valid_pairs = df_daily[['symbol', 'date']].drop_duplicates() # 内连接过滤分钟DF filtered_df = df.merge(valid_pairs, on=['symbol', 'date'], how='inner') # 如果不需要临时生成的date列,可以删除 filtered_df = filtered_df.drop('date', axis=1)
方式二:元组匹配+isin
生成标的-日期的元组列表,直接用isin过滤分钟DF:
# 生成有效的标的-日期元组 valid_tuples = list(df_daily[['symbol', 'date']].itertuples(index=False, name=None)) # 过滤分钟DF filtered_df = df[df[['symbol', 'date']].apply(tuple, axis=1).isin(valid_tuples)] # 删除临时date列 filtered_df = filtered_df.drop('date', axis=1)
为什么你之前的操作失败?
- Merge无效:因为分钟DF没有
date列,且可能symbol列存在格式不匹配(比如大小写、值不一致),导致merge时没有找到匹配项,或者错误地保留了所有行(如果变量名搞反或列名不匹配); - 索引匹配报错:你错误地用了日线DF的所有列作为匹配键,但分钟DF根本没有这些列(比如
level_0、change_1_day),自然会触发KeyError,正确的匹配键应该只有symbol和date。
内容的提问来源于stack exchange,提问作者a7dc
相关产品推荐
相关产品推荐

