如何将分钟级OHLC数据按日分组并获取唯一日期记录?
问题描述
拥有包含timestamp、symbol等字段的分钟级OHLC数据DataFrame(共429005行12列),尝试通过以下代码按日期分组:
df['timestamp'] = pd.to_datetime(df['timestamp']) days = df.groupby(df['timestamp'].dt.normalize().unique()) list_of_df = [] for index, name in days: list_of_df.append(name) final = pd.concat(list_of_df) print(final[['symbol', 'timestamp']])
执行后仍返回当日内的分钟级记录,需要修改代码以获取**按symbol和唯一日期(timestamp归一化为当日00:00:00+00:00)**的聚合记录。
原代码问题分析
原代码的分组逻辑存在错误:
df['timestamp'].dt.normalize().unique()返回的是所有唯一日期的数组,分组时仅按日期将所有行批量分组,但没有结合symbol做拆分- 循环拼接分组后的DataFrame本质上只是将原数据重新组合,没有做任何聚合操作,因此结果仍为分钟级记录
解决方案
根据需求选择以下两种实现方式:
方式1:每个Symbol每天保留一条记录(如取当日第一条)
如果仅需每个symbol每天保留一条样本(比如当日第一分钟的记录),可以按symbol和归一化后的日期分组,取每组第一条:
import pandas as pd # 转换timestamp为datetime类型 df['timestamp'] = pd.to_datetime(df['timestamp']) # 生成归一化到当日00:00的日期列 df['date'] = df['timestamp'].dt.normalize() # 按symbol和date分组,保留每组第一条记录 result = df.groupby(['symbol', 'date'], as_index=False).first() # 查看目标字段 print(result[['symbol', 'date']])
方式2:聚合OHLC字段(生成日线级数据)
如果需要将分钟级数据聚合为标准日线OHLC数据,可自定义聚合规则:
import pandas as pd df['timestamp'] = pd.to_datetime(df['timestamp']) df['date'] = df['timestamp'].dt.normalize() # 定义OHLC字段的聚合规则 aggregation_rules = { 'open': 'first', # 当日开盘价取第一分钟数据 'high': 'max', # 当日最高价取分钟级最大值 'low': 'min', # 当日最低价取分钟级最小值 'close': 'last', # 当日收盘价取最后一分钟数据 'volume': 'sum' # 当日成交量求和 } # 按symbol和date分组聚合 daily_data = df.groupby(['symbol', 'date'], as_index=False).agg(aggregation_rules) # 查看日线级结果 print(daily_data[['symbol', 'date', 'open', 'high', 'low', 'close', 'volume']])
内容的提问来源于stack exchange,提问作者a7dc
相关产品推荐
相关产品推荐

