API项目中从列表提取数据时的关键错误代码

0 投票
3 回答
49 浏览
提问于 2025-04-13 19:58

我有一个Python项目,目的是从英国政府的API获取银行假期的信息。我想从一个覆盖2024年的日期范围中提取银行假期的列表。但是我遇到了一个关于日期的错误。

#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

我的导师说我在用一个值进行索引,而不是用一个键。但我搞不清楚缺少了什么。

理想情况下,我想在获取到总的假期日期后使用切片(应该有8个日期),但是考虑到我现在的迷茫,我觉得这可能不太现实,哈哈。

date_range = pd.date_range(start='2024-01-01', end='2025-01-01')
print (date_range[0:7])

有什么建议吗?我还是个完全的新手,因为生病错过了很多课,所以我现在边学边做。

3 个回答

0

你从请求中得到的数据是一个嵌套字典,这是一种用键值对来存储数据的数据结构。这意味着你需要用一个键来从字典中获取数据。也许你的导师就是这个意思。例如,要获取苏格兰的所有信息,你可以在 bank_holidays['scotland'] 中使用键 scotland

有时候,打印出(部分)嵌套字典的内容可以帮助你理解它是如何构建的。

for key in bank_holidays:
    print(f"Level 1 is : {key}")
    for sub in bank_holidays[key]:
        if sub == "events":
            print(f"\tLevel 2 is : {sub} {bank_holidays[key][sub][0]}")
        else:
            print(f"\tLevel 2 is : {sub}")

上面的代码会打印出类似下面的内容。在这里,你可以看到三个国家名称是最上层的键,我称它们为 key,而“division”和“events”是这里的子层键,称为 sub。每个银行假期都表示为一个字典,包含以下键: title, date, notes, and bunting

Level 1 is : england-and-wales
    Level 2 is : division
    Level 2 is : events {'title': 'New Year’s Day', 'date': '2018-01-01', 'notes': '', 'bunting': True}
Level 1 is : scotland
    Level 2 is : division
    Level 2 is : events {'title': 'New Year’s Day', 'date': '2018-01-01', 'notes': '', 'bunting': True}
Level 1 is : northern-ireland
    Level 2 is : division
    Level 2 is : events {'title': 'New Year’s Day', 'date': '2018-01-01', 'notes': '', 'bunting': True}
0

要获取某个国家的假日列表,可以使用 bank_holidays[country]。在这个列表中,假日信息存放在 events 这个字典的键里。

在处理日期 2024-01-012025-01-01 时,不需要提到 bank_holidays。直接把这些字符串传进去就可以了。

当你要检查假日列表中的某个假日时,需要查看它的 date 这个键。

在打印事件列表的信息时,要用 holidays 作为字典,而不是 holiday_date

你在 holiday_date['title '] 里有个拼写错误。这个键后面不应该有空格。

import requests
from datetime import datetime

country = 'england-and-wales'

# retrieve the data of bank holidays
endpoint1 = 'https://www.gov.uk/bank-holidays.json'
response = requests.get(endpoint1)
bank_holidays = response.json()
eng_holidays = bank_holidays[country]['events']

start_date = datetime.strptime('2024-01-01','%Y-%m-%d').date()
end_date = datetime.strptime('2025-01-01','%Y-%m-%d').date()

holidays_found = False

for holidays in eng_holidays:
    holiday_date = datetime.strptime(holidays['date'], '%Y-%m-%d').date()

    if start_date <= holiday_date <= end_date:
        print(holidays['title'], 'is on', holidays['date'])
        holidays_found = True

if not holidays_found:
    print('Please try again')
0

如果你把代码中的循环部分改成这样,它就会打印出所有英格兰的银行假期:

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()

start_date = datetime.strptime('2024-01-01','%Y-%m-%d').date()
end_date = datetime.strptime('2025-01-01','%Y-%m-%d').date()

# loop over every holiday for England and Wales
for holiday in bank_holidays["england-and-wales"]["events"]:
    # extract only the value of the item
    # *_ takes in the notes and bunting which are not used
    title, date, *_ = holiday.values()
    holiday_date = datetime.strptime(date, '%Y-%m-%d').date()
    # only print holidays in 2024
    if start_date <= holiday_date <= end_date:
        print(f"{title} is on {date}")
# if it doesn't work at all
else:
    print('Please try again')

撰写回答