为何pandas读取Excel时指定parse_dates='date'仍报缺失列ValueError?
问题
运行以下代码时抛出错误:ValueError: Missing column provided to 'parse_dates': 'date',但Excel表格中确实存在名为date的列,预期代码能正常读取该列并加载数据。
运行的代码
import pandas as pd import numpy as np from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from statsmodels.tsa.statespace.varmax import VARMAX from statsmodels.tsa.api import VAR from statsmodels.tsa.stattools import grangercausalitytests, adfuller from tqdm import tqdm_notebook from itertools import product import matplotlib.pyplot as plt import statsmodels.api as sm import warnings warnings.filterwarnings('ignore') filepath = r'/Users/nathanielfremy/PycharmProjects/pythonProject/VAR Economics/data.xlsx' open(filepath) macro_data = pd.read_excel(filepath, parse_dates=['date'], index_col='date') print(macro_data.shape) macro_data.head()
可能的原因及解决方法
Excel文件包含多个工作表,默认读取的不是目标表
pd.read_excel默认读取第一个工作表,如果date列在其他工作表中,就会找不到该列。
解决方法:指定sheet_name参数,替换为实际包含date列的工作表名称:macro_data = pd.read_excel(filepath, sheet_name='目标工作表名', parse_dates=['date'], index_col='date')date列的表头存在空格或隐藏字符
列名可能看起来是date,但实际前后有空格、全角空格或其他不可见字符,导致匹配失败。
解决方法:先读取数据查看真实列名,再针对性处理:# 先读取数据不做解析,查看列名 temp_data = pd.read_excel(filepath) print(temp_data.columns.tolist()) # 如果列名有空格,先清洗列名再处理 temp_data.columns = temp_data.columns.str.strip() temp_data['date'] = pd.to_datetime(temp_data['date']) macro_data = temp_data.set_index('date')表头不在Excel的第一行
如果date列的表头位于第二行或更靠后,默认header=0(读取第一行作为表头)会导致列名读取错误。
解决方法:指定header参数为表头所在的行索引(从0开始计数):# 假设表头在第二行(索引为1) macro_data = pd.read_excel(filepath, header=1, parse_dates=['date'], index_col='date')冗余的
open(filepath)语句
代码中的open(filepath)完全多余,虽然不会直接导致列缺失问题,但可能占用文件句柄,建议删除该语句。
修正后的示例代码
import pandas as pd import numpy as np from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from statsmodels.tsa.statespace.varmax import VARMAX from statsmodels.tsa.api import VAR from statsmodels.tsa.stattools import grangercausalitytests, adfuller from tqdm import tqdm_notebook from itertools import product import matplotlib.pyplot as plt import statsmodels.api as sm import warnings warnings.filterwarnings('ignore') filepath = r'/Users/nathanielfremy/PycharmProjects/pythonProject/VAR Economics/data.xlsx' # 先检查列名 temp_data = pd.read_excel(filepath) print("实际列名:", temp_data.columns.tolist()) # 清洗列名并处理日期 temp_data.columns = temp_data.columns.str.strip() temp_data['date'] = pd.to_datetime(temp_data['date']) macro_data = temp_data.set_index('date') print(macro_data.shape) macro_data.head()
内容的提问来源于stack exchange,提问作者nate
相关产品推荐
相关产品推荐

