如何对DataFrame多列10分钟间隔数据按月重采样求均值?
问题解决方案
1. 排查并修复语法错误
语法错误通常出在时间索引生成、循环创建DataFrame或resample调用环节,按以下步骤检查:
- 确保时间索引生成代码正确:
# 生成2017-01-01至2021-12-31的10分钟频率时间索引 time_idx = pd.date_range(start='2017-01-01', end='2021-12-31', freq='10T') - 循环创建DataFrame时,保证列数据与时间索引长度匹配,避免索引对齐错误
- 确认
resample调用语法无误:必须是df.resample('1M').mean(),注意方法调用的括号和参数格式
2. 解决Sapan列全NaN问题
你提到已将原数据NaN替换为1、非NaN替换为0,但Sapan列仍全NaN,说明替换操作未生效或循环赋值出错:
- 先验证Sapan列的替换结果:
若输出仍有NaN,重新执行替换逻辑:# 查看列值分布,确认替换是否成功 print(zz['Sapan'].value_counts(dropna=False))# 批量替换所有列的NaN为1,非NaN为0 zz = zz.apply(lambda col: col.fillna(1).where(col.isna(), 0)) # 或单独处理Sapan列 zz['Sapan'] = zz['Sapan'].fillna(1).mask(zz['Sapan'].notna(), 0) - 循环创建DataFrame时,确保Sapan列数据被正确对齐到时间索引:
processed_dfs = {} for col in zz.columns: # 将原列数据对齐到时间索引,缺失位置补1(匹配你的替换规则) aligned_data = zz[col].reindex(time_idx, fill_value=1) processed_dfs[col] = pd.DataFrame(aligned_data, columns=[col])
3. 完整可运行代码示例
import pandas as pd # 1. 执行NaN替换 zz = zz.apply(lambda col: col.fillna(1).where(col.isna(), 0)) # 2. 生成标准时间索引 time_idx = pd.date_range(start='2017-01-01', end='2021-12-31', freq='10T') # 3. 循环创建带时间索引的DataFrame processed_dfs = {} for col in zz.columns: aligned_data = zz[col].reindex(time_idx, fill_value=1) processed_dfs[col] = pd.DataFrame(aligned_data, columns=[col]) # 4. 月度重采样求均值 for col, df in processed_dfs.items(): monthly_mean = df.resample('1M').mean() print(f"列 {col} 月度均值:") print(monthly_mean)
额外验证点
- 检查新生成的DataFrame索引类型:必须是
DatetimeIndex,否则resample会失效print(type(processed_dfs['Sapan'].index)) # 正确输出应为 <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
内容的提问来源于stack exchange,提问作者iyya
相关产品推荐
相关产品推荐

