如何按条件重采样时间序列:仅当有效数据占比≥50%时生成小时值
带有效数据占比条件的时间序列重采样解决方案
核心思路
要实现仅当小时内非NaN有效数据占比≥50%时计算均值,否则返回NaN的需求,需要在重采样过程中加入对有效数据占比的判断逻辑:
- 按小时分组后,计算每组的有效数据占比
- 根据占比阈值决定返回均值还是NaN
方法一:自定义重采样函数
直接通过resample().apply()传入自定义函数,在函数内完成占比判断和均值计算:
# 先将Datetime列设置为索引(如果未设置) df.set_index('Datetime', inplace=True) def resample_with_valid_threshold(series): # 计算当前小时内有效数据的占比 valid_ratio = series.notna().mean() # 满足阈值则返回均值,否则返回NaN return series.mean() if valid_ratio >= 0.5 else float('nan') # 执行重采样 resampled_precip = df['Precip'].resample('h').apply(resample_with_valid_threshold)
方法二:先聚合再过滤
先同时计算每组的均值和有效数据占比,再根据阈值筛选结果,这种方式更便于查看各时段的有效率:
# 先将Datetime列设置为索引(如果未设置) df.set_index('Datetime', inplace=True) # 聚合得到均值和有效数据占比 agg_results = df['Precip'].resample('h').agg( Precip_mean='mean', valid_ratio=lambda x: x.notna().mean() ) # 根据阈值生成最终结果 agg_results['Precip'] = agg_results.apply( lambda row: row['Precip_mean'] if row['valid_ratio'] >= 0.5 else float('nan'), axis=1 ) # 提取最终需要的列 resampled_precip = agg_results['Precip']
示例验证
针对你提供的测试数据:
- 00:00时段有4个有效数据(占比≈66.7%),满足阈值,计算得均值
(0.2+0.3+0.1+0.0)/4 = 0.15 - 01:00时段仅2个有效数据(占比≈33.3%),不满足阈值,返回NaN
最终输出与你的期望完全一致:
Datetime 2014-07-01 00:00:00 0.15 2014-07-01 01:00:00 NaN Name: Precip, dtype: float64
内容的提问来源于stack exchange,提问作者SPfaller
相关产品推荐
相关产品推荐

