Python调用英政府银行假日API时触发KeyError问题求助
英国银行假日API调用KeyError问题解决思路
问题背景
我做了一个Python项目,用来调用英国政府的银行假日API,想要获取2024年区间内的银行假日列表,但处理日期时触发了KeyError错误。导师指出我是对值而非键进行索引,但我作为编程新手,因生病缺课正在自学,找不到问题所在,希望得到解决思路。
原代码
#import bank holidays from API data import requests from datetime import datetime # retrieve the data of bank holidays endpoint1 = 'https://www.gov.uk/bank-holidays.json' response = requests.get(endpoint1) bank_holidays = response.json() print (bank_holidays) # use a data structure to show dates start_date = datetime.strptime(bank_holidays['2024-01-01'],'%Y-%m-%d').date() end_date = datetime.strptime(bank_holidays['2025-01-01'],'%Y-%m-%d').date() #for date, holidays in bank_holidays.items(): holiday_date = datetime.strptime('date', '%Y-%m-%d').date() for holidays in bank_holidays: if start_date <= holiday_date <= end_date: print(holiday_date['title '], 'is on', holiday_date['date']) else: print('Please try again')
报错信息
"C:\Users\Natalie\Documents\project python\pythonProject\.venv\Scripts\python.exe" "C:\Users\Natalie\Documents\project python\pythonProject\main.py" Would you like to check the Bank Holiday/s this year? [Yes/No?] yes Let's get started Traceback (most recent call last): File "C:\Users\Natalie\Documents\project python\pythonProject\main.py", line 28, in <module> start_date = datetime.strptime(bank_holidays['2024-01-01'],'%Y-%m-%d').date() ~~~~~~~~~^^^^^^^ KeyError: '2024-01-01' Process finished with exit code 1
尝试的切片代码
date_range = pd.date_range(start='2024-01-01', end='2025-01-01') print (date_range[0:7])
解决步骤
1. 理清API返回的数据结构
你打印bank_holidays后会发现,这个字典的顶层键是地区名称(比如england-and-wales、scotland),每个地区对应的值里包含一个events列表,列表里的每个元素才是单个假日的字典(包含date和title字段)。你直接用bank_holidays['2024-01-01']肯定会报错,因为这个日期根本不是顶层字典的键。
2. 修正日期范围的定义
start_date和end_date是你要筛选的时间区间,不需要从API数据里取,直接把字符串转成date对象即可:
start_date = datetime.strptime('2024-01-01', '%Y-%m-%d').date() end_date = datetime.strptime('2025-01-01', '%Y-%m-%d').date()
3. 正确遍历假日列表
先选择你要查询的地区(比如英格兰和威尔士),拿到该地区的假日列表,再逐个处理每个假日:
- 不要提前用字符串
'date'转日期,这完全是错误的,要从每个假日字典里取出date字段再转换 - 循环时要遍历
events列表,而不是顶层的地区字典
修正后的完整代码示例
import requests from datetime import datetime # 获取银行假日数据 endpoint = 'https://www.gov.uk/bank-holidays.json' response = requests.get(endpoint) bank_holidays = response.json() # 定义筛选的日期范围 start_date = datetime.strptime('2024-01-01', '%Y-%m-%d').date() end_date = datetime.strptime('2025-01-01', '%Y-%m-%d').date() # 选择要查询的地区(比如英格兰和威尔士) target_region = 'england-and-wales' holiday_events = bank_holidays[target_region]['events'] # 遍历并筛选2024年的假日 found_holidays = False for event in holiday_events: # 把假日的date字段转成date对象 event_date = datetime.strptime(event['date'], '%Y-%m-%d').date() if start_date <= event_date < end_date: print(f"{event['title']} is on {event['date']}") found_holidays = True if not found_holidays: print("该区间内没有找到匹配的银行假日")
内容的提问来源于stack exchange,提问作者Natalie McGreevy
相关产品推荐
相关产品推荐

