Python Pandas中Resample().mean()起始点缺失时结果添加至DataFrame的方法
Pandas按10分钟间隔重采样时丢失起始时段均值的批量解决方案
问题背景
- 需批量处理143个DataFrame,将
value列按10分钟间隔(如13:30、13:40)重采样计算均值 - 数据起始于13:36左右,重采样后13:30-13:40时段的均值丢失,原因是原索引不含13:30这个整点
- 尝试过调整
resample的offset/origin/convention参数、手动循环补值、添加13:30索引行,均未解决问题
解决方案
核心思路:先生成覆盖数据时间范围的完整10分钟整点索引,重采样计算均值后,将时段均值映射回原DataFrame的对应行。
可批量运行的代码
import pandas as pd def process_single_df(df): # 确保索引为datetime类型 df = df.copy() df.index = pd.to_datetime(df.index) # 生成覆盖数据范围的完整10分钟整点索引 start_ts = df.index.min().floor('10min') end_ts = df.index.max().ceil('10min') full_10min_index = pd.date_range(start=start_ts, end=end_ts, freq='10Min') # 重采样计算均值,并对齐到完整索引 resampled_avg = df['value'].resample('10Min').mean().reindex(full_10min_index) # 将对应时段的均值赋值给原DataFrame的每一行 df['tenminavg'] = df.index.floor('10min').map(resampled_avg) return df # 批量处理:假设dfs是包含143个DataFrame的列表 processed_dfs = [process_single_df(df) for df in dfs]
关键逻辑说明
- 生成完整索引:通过
floor和ceil确定数据覆盖的第一个和最后一个10分钟整点,用date_range生成无缺失的时段索引,确保13:30这类起始前的整点被包含 - 重采样对齐:重采样后用
reindex绑定完整索引,保证所有时段的均值都被保留(即使原数据没有该整点的索引) - 映射回原数据:用
floor('10min')把原数据的每个时间戳归到对应的10分钟时段,再通过map直接获取该时段的均值,实现整时段内所有行的均值填充
原代码问题分析
- 直接将
resample结果赋值给原DataFrame,只会在原索引存在的整点位置填充值,缺失的整点(如13:30)会被跳过 - 循环中错误地将NaN与字符串
"nan"比较(Pandas中NaN是np.nan,不是字符串类型),且索引访问逻辑有误
内容的提问来源于stack exchange,提问作者Leni
相关产品推荐
相关产品推荐

