API项目中从列表提取数据时的关键错误代码
我有一个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 个回答
你从请求中得到的数据是一个嵌套字典,这是一种用键值对来存储数据的数据结构。这意味着你需要用一个键来从字典中获取数据。也许你的导师就是这个意思。例如,要获取苏格兰的所有信息,你可以在 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}
要获取某个国家的假日列表,可以使用 bank_holidays[country]
。在这个列表中,假日信息存放在 events
这个字典的键里。
在处理日期 2024-01-01
和 2025-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')
如果你把代码中的循环部分改成这样,它就会打印出所有英格兰的银行假期:
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')