使用Statsmodels adfuller执行ADF检验时遇NaN/Inf报错排查
解决statsmodels adfuller的ValueError: array must not contain infs or NaNs问题
我之前也踩过完全一样的坑!明明用np.isnan和pd.isnull检查过都没问题,但adfuller还是报错,后来排查出几个容易忽略的细节,给你整理了可行的解决步骤:
1. 排查「隐性异常值」
表面的全局检查可能漏掉局部问题,试试这些更细致的方法:
- 逐列精准排查,避免整表检查的盲区:
import numpy as np for col in df.columns: has_nan = df[col].isna().any() has_inf = df[col].isin([np.inf, -np.inf]).any() print(f"列 {col}: 存在NaN={has_nan}, 存在Inf={has_inf}") - 查看数据统计极值,有没有接近Inf的超大/超小数值(比如1e308这类临界值,会被adfuller判定为Inf):
print(df.describe()) - 强制转换为数值类型,避免object类型藏着字符串格式的异常值:
df = df.astype('float64')
2. 补全NaN填充逻辑
你提到的填充规则可能有遗漏,比如开头连续多个NaN时,前向填充(ffill)无法覆盖,需要反向填充兜底:
# 先前向填充,再用反向填充补全开头的NaN df = df.fillna(method='ffill').fillna(method='bfill')
同时直接把Inf替换为NaN后统一处理:
df = df.replace([np.inf, -np.inf], np.nan).fillna(method='ffill').fillna(method='bfill')
3. 确认adfuller的输入格式
adfuller要求传入一维数值数组,确保你传的不是带索引的Series,而是纯数值序列:
from statsmodels.tsa.stattools import adfuller # 正确的传入方式:提取列的数值数组 result = adfuller(df['你的时间序列列'].values)
4. 用断言强制验证清理结果
最后加个断言,确保数据真的没有异常值,避免后续踩坑:
assert not df.isnull().any().any(), "数据中仍存在未清理的NaN值!" assert not np.isinf(df).any().any(), "数据中仍存在未清理的Inf值!"
如果断言触发,就说明还有遗漏的异常值,再针对性排查即可。
内容的提问来源于stack exchange,提问作者eternity1
相关产品推荐
相关产品推荐

