Python非可索引时间序列重采样及多列分组聚合问询
解决毫秒级时间序列多列聚合与秒级重采样问题
我来帮你搞定这个问题,其实pandas里的groupby.agg()就是专门处理这种多列不同聚合需求的神器,而且完全不需要依赖唯一的datetime索引,咱们一步步来实现:
步骤1:确保时间列是datetime类型
首先得把你的dateTime列转换成pandas的datetime类型,这样才能进行时间相关的操作:
import pandas as pd # 读取数据(这里假设你用CSV存储,也可以直接加载你的样本数据) df = pd.read_csv('your_trade_data.csv') # 转换时间列 df['dateTime'] = pd.to_datetime(df['dateTime'])
步骤2:秒级分组+多列自定义聚合
直接通过dt.floor('S')把毫秒时间戳向下取整到秒,作为分组键,然后用agg()指定每列的运算:
# 按秒级时间分组,同时对不同列应用不同聚合函数 secondly_stats = df.groupby(df['dateTime'].dt.floor('S')).agg( # 统计交易次数:isTrade为1代表交易,sum就是总笔数 trade_count=('isTrade', 'sum'), # 计算总交易量:对tradeVolume列求和 total_trade_volume=('tradeVolume', 'sum'), # 计算ask1列的均值 avg_ask1=('ask1', 'mean') )
关键说明:
df['dateTime'].dt.floor('S')会把所有毫秒级时间戳统一到对应的整秒,比如2017-11-20 08:00:09.052240会变成2017-11-20 08:00:09,自动把同一秒的所有数据归为一组,完美解决重复时间戳的问题。agg()方法支持传入字典,键是你想要的结果列名,值是(原列名, 聚合函数)的元组,轻松实现不同列用不同运算,完全打破“groupby只能单一运算”的误解。
可选:不将秒级时间设为索引
如果你不想让秒级时间作为结果的索引,可以先创建一个普通的秒级时间列再分组:
# 新增秒级时间列 df['second'] = df['dateTime'].dt.floor('S') # 分组聚合,保留秒级时间为普通列 secondly_stats = df.groupby('second', as_index=False).agg( trade_count=('isTrade', 'sum'), total_trade_volume=('tradeVolume', 'sum'), avg_ask1=('ask1', 'mean') )
样本数据测试结果
用你提供的样本数据运行后,结果会是这样(所有数据都在同一秒):
| second | trade_count | total_trade_volume | avg_ask1 |
|---|---|---|---|
| 2017-11-20 08:00:09 | 12 | 20 | 12869.0 |
(注:trade_count是样本中isTrade=1的行数,共12次;total_trade_volume是所有tradeVolume的和,除第一行是0外其余20行都是1,总和为20;avg_ask1所有值都是12869.0,均值保持不变)
总结
- 无需纠结datetime索引的唯一性问题,用
dt.floor('S')生成秒级分组键就能实现秒级重采样。 groupby.agg()是处理多列不同聚合需求的标准方式,灵活度远高于单一运算的groupby,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Giladbi
相关产品推荐
相关产品推荐

