You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 10:31:30