Pandas实现15分钟数据上采样为1分钟并均摊数值的问题求解
解决方案
实现逻辑
- 先计算原15分钟序列相邻两项的和,除以15得到每分钟需要填充的数值
- 对原序列做1分钟上采样,用前向填充把计算好的单分钟值填充到对应区间的所有分钟行
- 最后单独处理最后15分钟区间的边界值,可根据需求调整规则
完整可运行代码
import pandas as pd import numpy as np # 构造测试数据(优化了原有冗余写法) dates = pd.date_range(start="20190101",end="20200101", freq="15min") values = np.random.randint(0,10,size=(len(dates), 1)) df = pd.DataFrame(values, index=dates, columns=['value']) # 核心逻辑:计算相邻两个15分钟值的平均分摊额 # shift(-1)取后一个15分钟点的值,求和后除以15 df['min_val'] = (df['value'] + df['value'].shift(-1)) / 15 # 最后一个点没有下一个值,默认用自身值除以15,可根据需求调整 df['min_val'] = df['min_val'].fillna(df['value'] / 15) # 1分钟重采样+前向填充 resampled_df = df.resample('min')['min_val'].ffill().to_frame(name='value') # 打印前16行验证结果 print(resampled_df.head(16)) # 验证总和一致性 print(f"原数据总和:{df['value'].sum()}") print(f"重采样后总和:{resampled_df['value'].sum()}")
代码说明
- 核心用
shift(-1)获取相邻下一个15分钟采样点的数值,和当前值求和后平摊到15个分钟点,完全匹配你提出的计算规则 - 重采样后用
ffill()前向填充,保证每个15分钟区间内的15个分钟点都对应同一个平摊值 - 边界的最后一个15分钟区间默认按自身值平摊,如果你有其他边界处理需求可以直接修改
fillna部分的逻辑 - 如果需要完全保证原数据总和与重采样后总和一致,仅需把最后一个点的配对规则改成和第一个前序值配对即可。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

