You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按条件重采样时间序列:仅当有效数据占比≥50%时生成小时值

带有效数据占比条件的时间序列重采样解决方案

核心思路

要实现仅当小时内非NaN有效数据占比≥50%时计算均值,否则返回NaN的需求,需要在重采样过程中加入对有效数据占比的判断逻辑:

  1. 按小时分组后,计算每组的有效数据占比
  2. 根据占比阈值决定返回均值还是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:05:30