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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:21:32