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

Pandas按1小时重采样DataFrame时出现非预期NaN值的问题求助

Pandas按1小时重采样DataFrame时出现非预期NaN值的问题求助

我完全懂你的困扰——本来只想给真正缺失的小时数据标记NaN,结果连那些非整点时间(比如15:06:55、16:00:01)对应的行也变成了NaN,这肯定不是你想要的结果。

问题根源

出现这个情况的核心原因是:resample('1H')是按整点时间区间处理数据的(比如15:00-16:00算一个区间)。你的原始非整点时间会被划分到对应的小时区间,但如果没有明确指定聚合规则(比如取该区间内的有效值),pandas无法确定这个区间该保留什么值,就会默认填充NaN;而真正完全没有数据的小时区间自然也会是NaN,这就导致两种情况的NaN混在了一起。

解决方案

这里给你两种实用的处理思路,你可以根据业务需求选择:

方案一:先对齐非整点时间到整点,再补全缺失小时

这个思路先把所有非整点时间统一对齐到当前小时的整点,再生成连续的小时序列,最后只处理真正缺失的NaN:

# 合并日期与时间列,转为Datetime索引
df['Date-Time'] = pd.to_datetime(df[0] + df[1], format='%Y-%m-%d%H:%M:%S')
df = df.set_index('Date-Time')

# 将所有时间戳截断到当前小时的整点(比如15:06:55 → 15:00:00)
df.index = df.index.floor('H')

# 按小时分组,取每组的第一个有效值(如果同一小时有多个数据,可换成last()/mean()等)
df = df.groupby(df.index).first()

# 生成连续的小时序列,此时只有真正缺失的小时才会出现NaN
df = df.asfreq('1H')

# 填充缺失值,示例用向前填充,可按需换成bfill/指定值等
df = df.fillna(method='ffill')

方案二:重采样时指定聚合规则,保留非整点数据

这个思路直接在重采样时明确每个小时区间要保留的值,这样非整点时间的数值会被保留到对应小时,只有完全没数据的小时才会是NaN:

# 合并日期与时间列,转为Datetime索引
df['Date-Time'] = pd.to_datetime(df[0] + df[1], format='%Y-%m-%d%H:%M:%S')
df = df.set_index('Date-Time')

# 按1小时重采样,取每个区间内的第一个有效值(按需可换成mean()/max()等)
df_resampled = df.resample('1H').first()

# 填充真正缺失的小时数据,示例用向前填充,可按需调整
df_resampled = df_resampled.fillna(method='ffill')

注意事项

如果你的数据中存在同一小时内多个非整点数据的情况,一定要根据业务需求选对聚合方式:

  • 取第一个/最后一个值:first()/last()
  • 取均值:mean()
  • 取最大值/最小值:max()/min()

这样就能精准区分真正缺失的小时数据和非整点时间的数据,只给前者填充NaN(或你需要的填充值)啦。

备注:内容来源于stack exchange,提问作者Arindam Das

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 12:54:36