如何用Python批量下载MISO网站指定日期范围的CSV文件
批量下载MISO日事后LMP CSV文件的Python方案
实现思路
目标文件命名有固定规律:YYYYMMDD_da_expost_lmp.csv,存储路径为https://docs.misoenergy.org/marketreports/[文件名]。我们可以通过生成指定日期范围内的所有日期字符串,拼接成下载链接,逐个尝试下载并保存到本地(同时处理无数据的日期,避免报错中断)。
步骤拆解与代码实现
1. 导入所需库
import urllib3 import pandas as pd from datetime import date, timedelta import os
2. 生成日期范围的格式化字符串
定义起始日期(2022-01-01),生成到当前日期的所有日期并转成YYYYMMDD格式:
# 定义起始日期和结束日期(结束日期设为今天) start_date = date(2022, 1, 1) end_date = date.today() # 生成日期序列 date_range = [] current_date = start_date while current_date <= end_date: # 转成YYYYMMDD格式的字符串 date_str = current_date.strftime("%Y%m%d") date_range.append(date_str) # 日期加1天 current_date += timedelta(days=1)
3. 批量下载并保存文件
遍历每个日期字符串,拼接URL,尝试下载并保存,同时捕获下载失败的情况(比如节假日无数据):
# 禁用不安全请求警告 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 创建保存文件的文件夹(如果不存在) save_folder = "miso_lmp_data" if not os.path.exists(save_folder): os.makedirs(save_folder) # 遍历所有日期,批量下载 for date_str in date_range: file_name = f"{date_str}_da_expost_lmp.csv" url = f"https://docs.misoenergy.org/marketreports/{file_name}" save_path = os.path.join(save_folder, file_name) # 跳过已下载的文件(可选,避免重复下载) if os.path.exists(save_path): print(f"{file_name} 已存在,跳过") continue try: # 读取CSV文件(跳过前4行说明性内容) df = pd.read_csv(url, skiprows=4) # 保存到本地 df.to_csv(save_path, index=False) print(f"成功下载并保存:{file_name}") except Exception as e: # 打印错误信息,继续下一个日期 print(f"下载失败 {file_name}:{str(e)}")
代码说明
datetime模块用于生成连续的日期序列,省去手动拼接日期的麻烦os.makedirs创建本地文件夹,避免文件散落在根目录- 加入跳过已下载文件的逻辑,适合中断后继续下载
- 异常捕获
try-except确保某个日期下载失败时,程序不会直接终止,继续处理后续日期
内容的提问来源于stack exchange,提问作者Unfazed
相关产品推荐
相关产品推荐

