Pandas中嵌套groupby应用:按日+20分钟时间仓聚合多索引数据
搞定双索引数据的日期分组+20分钟时间仓聚合
嘿,我来帮你解决这个问题!从你给出的数据格式来看,核心需求是先按日期把数据拆分成每日组,再对每组的时间序列做20分钟的分仓聚合。下面分两种常见的数据结构场景来给你具体代码:
场景1:Date和Time是普通列(未设为索引)
如果导入后Date、Time、Volume都是普通列,第一步得把日期和时间合并成完整的时间戳,这样才能方便做时间重采样:
import pandas as pd # 导入数据(替换成你的csv路径) df = pd.read_csv('your_data.csv') # 合并Date和Time为完整datetime列,确保pandas识别为时间类型 df['full_datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time']) # 将合并后的时间列设为索引 df = df.set_index('full_datetime') # 按日期分组,每组内做20分钟时间仓的成交量聚合(这里用sum,你可以换成mean/max等) aggregated = df.groupby(pd.Grouper(freq='D'))['Volume'].resample('20T').sum().reset_index() # 拆分回Date和Time列,匹配你要的输出格式 aggregated['Date'] = aggregated['full_datetime'].dt.date.astype(str) aggregated['Time'] = aggregated['full_datetime'].dt.strftime('%H:%M:%S') # 整理最终列顺序 final_result = aggregated[['Date', 'Time', 'Volume']] print(final_result)
场景2:Date和Time已经是多重索引
如果你导入数据时用了index_col=[0,1]把Date和Time设成了双重索引,那可以这样处理:
import pandas as pd # 导入数据并指定双重索引 df = pd.read_csv('your_data.csv', index_col=[0, 1]) # 把双重索引转换成完整的datetime索引 df.index = pd.to_datetime(df.index.get_level_values(0) + ' ' + df.index.get_level_values(1)) # 同样的分组+重采样逻辑 aggregated = df.groupby(pd.Grouper(freq='D'))['Volume'].resample('20T').sum().reset_index() # 拆分日期和时间 aggregated['Date'] = aggregated['full_datetime'].dt.date.astype(str) aggregated['Time'] = aggregated['full_datetime'].dt.strftime('%H:%M:%S') final_result = aggregated[['Date', 'Time', 'Volume']] print(final_result)
几个关键点说明
resample('20T'):这里的T是pandas的时间频率代码,代表分钟,20T就是每20分钟一个时间仓。pandas会自动把每个时间点对齐到最近的20分钟整点(比如09:01:29会被归入09:00:00的仓,09:21:00归入09:20:00)。- 聚合函数:我用的是
sum()来统计每个时间仓的总成交量,如果你需要其他统计方式,直接替换成mean()(平均)、max()(最大值)或者自定义聚合函数都可以。 - 时间格式:
dt.strftime('%H:%M:%S')可以确保输出的Time列是标准的HH:MM:SS格式,比如09:00:00,完全匹配你要的最终格式。
内容的提问来源于stack exchange,提问作者Krasnars
相关产品推荐
相关产品推荐

