Pandas按1秒间隔分组求最值与首尾值遇索引错误的技术咨询
解决方案
一、修复resample索引错误
resample要求DataFrame的索引为datetime类型,先处理TIMESTAMP列:
import pandas as pd # 读取CSV后转换时间列并设为索引 df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP']) df = df.set_index('TIMESTAMP') # 对PRICE列按1秒分组聚合 result = df['PRICE'].resample('1S').agg(['min', 'max', 'first', 'last']) # 重命名列名更直观 result.columns = ['low', 'high', 'open', 'close']
如果之前未指定PRICE列直接聚合,会对所有列操作,容易引发多级列或索引异常,指定目标列即可避免。
二、给原DataFrame添加统计列
方法1:用transform直接生成
# 确保索引是datetime类型 df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP']) df = df.set_index('TIMESTAMP') # 生成对应分组的统计值并匹配到每一行 df['low'] = df['PRICE'].resample('1S').transform('min') df['high'] = df['PRICE'].resample('1S').transform('max') df['open'] = df['PRICE'].resample('1S').transform('first') df['close'] = df['PRICE'].resample('1S').transform('last')
方法2:分组后合并回原表
df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP']) # 生成分组统计结果并重置索引 grouped_stats = df['PRICE'].resample('1S', on='TIMESTAMP').agg(['min','max','first','last']).reset_index() grouped_stats.columns = ['time_bin', 'low', 'high', 'open', 'close'] # 给原数据添加时间分组标记(取整到秒) df['time_bin'] = df['TIMESTAMP'].dt.floor('1S') # 合并统计列 df = df.merge(grouped_stats, on='time_bin', how='left')
三、用自定义函数实现需求
可以通过groupby+Grouper配合自定义函数完成:
df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP']) # 自定义聚合逻辑 def calc_bar(group): price = group['PRICE'] return pd.Series({ 'low': price.min(), 'high': price.max(), 'open': price.iloc[0], 'close': price.iloc[-1] }) # 按1秒间隔分组并应用函数 result = df.groupby(pd.Grouper(key='TIMESTAMP', freq='1S')).apply(calc_bar).dropna()
dropna()用于过滤无数据的时间区间,不需要可直接移除。
内容的提问来源于stack exchange,提问作者soloman_1988
相关产品推荐
相关产品推荐

