python:通过URL地址批量下载CFS回报预测数据

网址:NCEI Object Store Explorer

点进去要下载的话只能手动一个一个点;

在网上搜索批量下载方法,有公众号提到:

CFS预报数据下载&驱动WRF

结合自己的需要(比如我需要在月末获得一直到9月的预报数据),参考以上代码,大部分寻求CHATGPT帮助,完成代码:其中,非常感谢师兄帮我解决一个大问题,因为最开始直接复制的网址

其中,“index.html#”未删掉,导致下载下来的grb一直打不开,师兄说是wget和request不识别#,所以下载不成功都是因为下载的是index.html,而不是数据;最终删掉可以下载并且正常打开了! 

import os,sys
from datetime import datetime,timedelta
import bisect
import pandas as pd 
import requests

def get_dates(year):
    dates = []
    
    # 5月31日
    date_1 = datetime(year, 5, 31)
    dates.append(date_1)
    
    # 6月30日
    date_2 = datetime(year, 6, 30)
    dates.append(date_2)
    
    # 7月30日
    date_3 = datetime(year, 7, 30)
    dates.append(date_3)
    
    # 8月29日
    date_4 = datetime(year, 8, 29)
    dates.append(date_4)
    
    return dates


def generate_monthly_intervals(start_year_month, end_year_month):
    date_format = "%Y%m"
    date_intervals = []

    # 将起始日期和结束日期转换为 datetime 对象
    start_date = datetime.strptime(start_year_month, date_format)
    end_date = datetime.strptime(end_year_month, date_format)

    # 按照每隔一个月的间隔生成日期,并添加到日期间隔列表中
    current_date = start_date
    while current_date <= end_date:
        date_intervals.append(current_date.strftime(date_format))
        year = current_date.year
        month = current_date.month
        if month == 12:
            year += 1
            month = 1
        else:
            month += 1
        current_date = datetime(year, month, 1)

    return date_intervals

def download_file(url, save_path):
    try:
        response = requests.get(url)
        response.raise_for_status()  # Check for any error in the response
        with open(save_path, 'wb') as file:
            file.write(response.content)
        print(f"File downloaded successfully to: {save_path}")
    except requests.exceptions.RequestException as e:
        print(f"Error downloading the file: {e}")


def download_cfs_his(init,date_interval):
    '''
    下载历史数据
    '''
    YYYY     = init[:4]
    YYYYMM   = init[:6]
    YYYYMMDD = init[:8]
    YYYYMM_pre = date_interval

    url_root = "https://www.ncei.noaa.gov/oa/prod-cfs-reforecast/high-priority-subset/monthly-means-9-month"
    #url_sfc  = f"{url_root}/6-hourly-flux/{YYYY}/{YYYYMM}/{YYYYMMDD}/{init}"
    valid = YYYYMMDD+'00'
    url_sfc = f"{url_root}/{YYYY}/{YYYYMM}/{YYYYMMDD}/flxf{valid}.01.{YYYYMM_pre}.avrg.grb2"
    #url_sfc = f"{url_root}/{YYYY}/{YYYYMM}/{YYYYMMDD}"
    #os.system(f"wget {url_sfc}/flxf{valid}.01.{YYYYMM_pre}.avrg.grb2")
    wrk_dir = f"E:/seasonyield_predict_2/datapre/cfs_hindcast/grib_his2"
    if not os.path.exists(wrk_dir): 
        os.makedirs(wrk_dir)
    os.chdir(wrk_dir)

    filename = f"flxf{valid}.01.{YYYYMM_pre}.avrg.grb2"
    download_file(url_sfc, filename)


if __name__ == "__main__":
    
    for year in range(1987,2011):
        result_dates = get_dates(year)
        for date in result_dates:
            #date=result_dates[1]
            init=date.strftime("%Y%m%d")
            ###预报月份
            start_year_month = init[:6]
            end_year_month = str(year)+'09'
            # 生成日期列表
            result_intervals = generate_monthly_intervals(start_year_month, end_year_month)
            # 输出日期列表
            for i in range(1,len(result_intervals)):
                date_interval=result_intervals[i]
                download_cfs_his(init,date_interval)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值