基于日期时间调整循环迭代次数:夏令时数据爬取问题修复
问题解决与代码优化
核心问题分析
- 语法错误:
if i == '2020-03-29'末尾缺少冒号,直接触发SyntaxError。 - 变量名冲突:内层循环复用
i作为变量,覆盖了外层的日期变量,会导致后续迭代逻辑混乱。 - 数据收集错误:当前代码每次循环仅保留最后一个小时的
y值,而非收集当日所有小时的完整数据。 - 硬编码日期不灵活:仅判断单个夏令时日期,无法覆盖另外两个受影响的日期,且后续夏令时规则变化时需手动修改代码。
优化后的代码
from datetime import date, timedelta from urllib.request import urlopen import json start_date = date(2020, 1, 1) end_date = date(2022, 11, 1) def daterange(start_date, end_date): for n in range(int((end_date - start_date).days)): yield start_date + timedelta(n) parsing_range_svk = [] for single_date in daterange(start_date, end_date): single = single_date.strftime("%Y-%m-%d") parsing_range_svk.append(single) svk = [] for date_str in parsing_range_svk: try: # 请求并解析目标JSON数据 response = urlopen(f"https://www.svk.se/services/controlroom/v2/situation?date={date_str}&biddingArea=SE1") data_json_svk = json.loads(response.read()) # 获取当日所有小时级数据的列表 hourly_data = data_json_svk['Data'][0]['data'] # 批量提取每个小时的'y'值 daily_rows = [item['y'] for item in hourly_data] svk.append(daily_rows) except Exception as e: print(f"处理日期 {date_str} 时出错: {str(e)}") # 出错时可选择添加空列表或跳过该日期 svk.append([])
关键优化点说明
- 修复语法问题:移除硬编码的日期判断,改用动态读取数据长度的方式,同时确保所有代码语法合规。
- 避免变量冲突:将外层日期变量重命名为
date_str,内层用列表推导式简化逻辑,彻底杜绝变量覆盖问题。 - 完整收集数据:通过列表推导式一次性提取当日所有小时的
y值,确保每个日期对应完整的小时数据列表。 - 自动适配小时数:直接读取返回数据中
hourly_data的长度,不管是23还是24小时,都能自动适配,无需手动维护夏令时日期清单。 - 异常容错处理:增加
try-except块,捕获请求失败、JSON解析错误或键不存在等异常,避免程序中途崩溃,同时记录错误信息便于排查。
内容的提问来源于stack exchange,提问作者user20050294
相关产品推荐
相关产品推荐

