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

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')
)

样本数据测试结果

用你提供的样本数据运行后,结果会是这样(所有数据都在同一秒):

secondtrade_counttotal_trade_volumeavg_ask1
2017-11-20 08:00:09122012869.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:14:18