构建CSV与API到BigQuery的数据管道时遇KeyError问题求助
KeyError: 'lastUpdateEt' 问题分析与解决
问题原因
- API字段不匹配:你调用的Covid Tracking API(
https://api.covidtracking.com/v1/states/ca/daily.json)已停止维护,返回数据中不存在lastUpdateEt字段,字段结构或名称已发生变更。 - CSV字段缺失:本地CSV文件
New_york_covid_data.csv中可能没有lastUpdateEt列,或者列名拼写、大小写与代码中使用的不一致。 - 过滤后无数据(次要):如果
df1[df1['date'] >= 20210101]过滤后返回空DataFrame,后续访问字段也会触发KeyError,但报错栈显示核心问题是字段不存在。
解决步骤
1. 确认数据源的实际字段
在提取数据的函数中添加列名打印,明确真实字段:
def covidExtractApi(): api = "https://api.covidtracking.com/v1/states/ca/daily.json" api_opener = urlopen(api) data = json.load(api_opener) df1 = pd.DataFrame(data) # 打印API返回的所有列名 print("API数据列名:", df1.columns.tolist()) df1 = df1[df1['date'] >= 20210101] return df1 def covidExtractCsv(): df2 = pd.read_csv(r"C:\Users\Chris\PycharmProjects\Projects\Data_Engineering_Projects\Covid_folder\New_york_covid_data.csv") # 打印CSV的所有列名 print("CSV数据列名:", df2.columns.tolist()) df2 = df2[df2['date'] >= 20210101] return df2
运行后查看输出,找到对应更新时间的字段(比如lastModified或updated等)。
2. 修改代码中的字段引用
根据实际字段名替换lastUpdateEt和checkTimeEt。例如,如果API返回的是lastModified,修改covidTransform函数:
# 替换lastUpdateEt为实际字段名,比如lastModified df1['dateLastUpdated'] = df1["lastModified"].str.split(' ', expand=True)[0] df1['timeLastUpdated'] = df1["lastModified"].str.split(' ', expand=True)[1] df2["dateLastUpdated"] = df2["lastModified"].str.split(' ', expand=True)[0] df2["timeLastUpdated"] = df2["lastModified"].str.split(' ', expand=True)[1]
如果checkTimeEt也不存在,同样替换为CSV和API中实际存在的对应字段。
3. 添加字段存在性检查(可选)
为避免后续出现类似问题,在访问字段前先校验:
def covidTransform(df1, df2): # 检查API数据的必要字段 required_fields_api = ['lastUpdateEt', 'checkTimeEt'] missing_api = [f for f in required_fields_api if f not in df1.columns] if missing_api: raise ValueError(f"API数据缺失必要字段:{missing_api}") # 检查CSV数据的必要字段 required_fields_csv = ['lastUpdateEt', 'checkTimeEt'] missing_csv = [f for f in required_fields_csv if f not in df2.columns] if missing_csv: raise ValueError(f"CSV数据缺失必要字段:{missing_csv}") # 后续转换逻辑...
4. 更换维护中的数据源(可选)
由于Covid Tracking Project在2021年3月后已停止更新数据,若需要最新疫情数据,建议更换为CDC官方API或其他仍在维护的疫情数据接口。
内容的提问来源于stack exchange,提问作者Christopher Wilson
相关产品推荐
相关产品推荐

