时间序列重采样输出异常问题求助:月度重采样结果不符合预期
问题排查与解决方案
先拆解你遇到的几个核心问题:月度结果出现NaN、求和值异常(比如64.5),还有日期格式的困惑,咱们一步步来解决。
问题根源分析
- 日期索引未正确配置
如果你的日期列只是普通字符串,没有转换成datetime类型并设为DataFrame的索引,resample函数根本无法正确识别时间维度,会导致计算逻辑混乱,甚至出现奇怪的数值。 - 缺失日期未补全
原始数据存在缺失日期(比如10月2日),默认的resample只会对已有数据点计算,缺失日期的数值会被直接忽略。如果某个月完全没有数据点,就会返回NaN——这就是2015-02-28出现NaN的原因。 - 异常小数(64.5)的可能原因
这个小数大概率是因为原始数据中存在非整数数值,或者索引有重复日期(同一日期有多条记录,求和后出现小数);当然也有可能是你不小心误用了mean()而非sum()(不过你明确说用了sum(),这条可以排除)。
分步解决方案
第一步:修复日期索引
先把日期列转换成datetime类型,并设置为DataFrame的索引:
import pandas as pd # 假设你的日期列名为'date',数值列名为'individuals' df['date'] = pd.to_datetime(df['date']) df = df.set_index('date')
第二步:补全日度缺失数据并填充0
你提到部分日期值为0、部分缺失,我们需要先把时间序列补全为连续的日度数据,缺失日期填充为0,这样月度求和才会包含所有日期的数值:
# 补全日度数据,缺失日期填充0 df_daily = df.asfreq('D', fill_value=0)
第三步:重采样月度求和
现在再进行月度重采样求和,结果就会符合预期:
df_monthly = df_daily['individuals'].resample('M').sum()
第四步:调整日期格式(按需)
你期望的日期格式看起来是笔误(2015-31-10应该是2015-10-31,即年-月-日的当月最后一天),如果需要修改索引显示格式,可以这样做:
# 转换成标准年-月-日格式(比如2015-10-31) df_monthly.index = df_monthly.index.strftime('%Y-%m-%d') # 如果确实需要年-日-月格式(不推荐,不符合常规日期规范) # df_monthly.index = df_monthly.index.strftime('%Y-%d-%m')
验证结果
经过以上步骤后,你的月度数据会显示每个月所有日期的数值之和,无数据的月份会显示0而非NaN;如果原始数据都是整数,求和结果也会是整数,不会出现奇怪的小数。
内容的提问来源于stack exchange,提问作者Mannheimer_Coder
相关产品推荐
相关产品推荐

