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
相关产品推荐
相关产品推荐

