如何将dataframe每3个观测值分为一组取均值,实现日度数据降采样
解决方案
以下基于Python pandas库实现需求,分两种场景给出可直接运行的代码:
场景1:数据已按采集时间升序排列、无缺失记录、严格每3条对应1天
直接按索引整除3分组计算均值即可:
import pandas as pd # 请将下方变量替换为你实际的DataFrame名、列名 # 原始DataFrame:df # 汇率观测值列名:exchange_rate # 可选:日期列名:date_col daily_df = df.groupby(df.index // 3).agg( # 如需保留日期,保留该行,否则可删除 record_date = ('date_col', 'first'), daily_exchange_avg = ('exchange_rate', 'mean') ).reset_index(drop=True)
运行后daily_df即为30条每日均值的结果集。
场景2:数据包含datetime类型的时间列(推荐,容错性更高)
如果数据自带采集时间戳,优先使用重采样逻辑,可避免因数据顺序错乱、单日采样数量异常导致的计算错误:
# 时间列转为datetime格式(如已转换可跳过该行) df['collect_time'] = pd.to_datetime(df['collect_time']) # 将时间列设为索引 df = df.set_index('collect_time') # 按自然日重采样计算均值 daily_df = df.resample('D')['exchange_rate'].mean().reset_index()
注意事项
- 如果存在单日采样次数不足3次的情况,重采样方法会自动计算当日所有有效观测的均值,比固定步长分组更符合实际研究需求
- 如需保留其他字段的聚合结果,可在
agg方法中自定义规则,例如数值列取均值、分类列取首个有效值 - 如果仅需要输出均值数组,可简化写法:
daily_avg_list = df['exchange_rate'].groupby(df.index//3).mean().tolist()
内容的提问来源于stack exchange,提问作者Eugenio
相关产品推荐
相关产品推荐

