pycharm下载GFS120小时数据并转为nc文件和TIF文件保存(可任选变量,按字段下载)·GFS气象预测数据下载

一、引用库

import requests
import xarray as xr
import os
from datetime import datetime, timedelta
import tempfile
import datetime as dt
import rioxarray

二、选择自己所需要的变量

# 定义基础URL
base_url = "https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl"

# 定义日期和时次
date_str = (dt.date.today() - dt.timedelta(days=0)).strftime("%Y%m%d")
hour_str = "00"

# 定义变量和层次
variables = "var_TMP=on"
levels = "lev_2_m_above_ground=on"

定义URL不需要改动

定义日期和时次,变量和层次可以按照自己的需求选择,下一篇文章会有详细的网站介绍,在网站的显示url中可以自己复制粘贴。

网站如下:

Grib Filter gfs_0p25 (noaa.gov)

pycharm下载GFS120小时数据并转为nc文件和TIF文件保存(可任选变量,按字段下载)·GFS气象预测数据下载_第1张图片

三、开始下载数据

# 循环下载001小时到120小时的数据
for forecast_hour in range(1, 121):
    # 构建文件名
    file_name = f"gfs.t{hour_str}z.pgrb2.0p25.f{forecast_hour:03d}"

    # 构建完整URL
    url = f"{base_url}?dir=%2Fgfs.{date_str}%2F{hour_str}%2Fatmos&file={file_name}&{variables}&{levels}"

    # 发送请求获取数据
    response = requests.get(url)

    # 检查请求是否成功
    if response.status_code == 200:
        # 创建临时文件
        with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
            tmp_file.write(response.content)
            tmp_file_path = tmp_file.name

        # 使用xarray打开GRIB2数据,指定使用'cfgrib'引擎,并使用filter_by_keys参数
        ds = xr.open_dataset(tmp_file_path, engine='cfgrib')

四、保存数据

   # 指定保存路径
        save_path_nc = r"C:\Users\Lenovo\Desktop\nc\tmp2m"
        save_path_tif = r"C:\Users\Lenovo\Desktop\nc\tmp2mtif"

        # 确保保存路径存在
        os.makedirs(save_path_nc, exist_ok=True)
        os.makedirs(save_path_tif, exist_ok=True)

        # 构建保存文件名
        save_filename_nc = f"gfs_forecast_{date_str}_{hour_str}_f{forecast_hour:03d}_{variables}_{levels}.nc"

        # 保存数据为NetCDF文件
        ds.to_netcdf(os.path.join(save_path_nc, save_filename_nc))

        # 打印保存文件的路径
        print(f"NetCDF数据已保存至: {os.path.join(save_path_nc, save_filename_nc)}")

        # 将NetCDF文件转换为TIFF文件并保存
        ds_rio = ds.rio.write_crs("EPSG:4326")  # 设置坐标系为WGS 84
        save_filename_tif = f"gfs_forecast_{date_str}_{hour_str}_f{forecast_hour:03d}_{variables}_{levels}.tif"
        ds_rio.rio.to_raster(os.path.join(save_path_tif, save_filename_tif))

        # 打印保存TIFF文件的路径
        print(f"TIFF文件已保存至: {os.path.join(save_path_tif, save_filename_tif)}")

        # 关闭数据集连接
        ds.close()

        # 删除临时文件
        os.remove(tmp_file_path)


    else:
        date_str = (dt.date.today() - dt.timedelta(days=1)).strftime("%Y%m%d")

else语句保证了你在选择的时次如(00),虽然今天已经过了零点,但是网站的时次是标准时,该文件夹并没有更新,else语句自动将时间换为昨天零点更新的数据,当然你可以直接在选择日期时就将零改为任何数,一般网站会允许你下载0-10天前的数据。(不过当然数据是越新越好,gdas数据一直在改良gfs预测数据)

五、完整代码

import requests
import xarray as xr
import os
from datetime import datetime, timedelta
import tempfile
import datetime as dt
import rioxarray

# 定义基础URL
base_url = "https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl"

# 定义日期和时次
date_str = (dt.date.today() - dt.timedelta(days=0)).strftime("%Y%m%d")
hour_str = "00"

# 定义变量和层次
variables = "var_TMP=on"
levels = "lev_2_m_above_ground=on"

# 循环下载001小时到120小时的数据
for forecast_hour in range(1, 121):
    # 构建文件名
    file_name = f"gfs.t{hour_str}z.pgrb2.0p25.f{forecast_hour:03d}"

    # 构建完整URL
    url = f"{base_url}?dir=%2Fgfs.{date_str}%2F{hour_str}%2Fatmos&file={file_name}&{variables}&{levels}"

    # 发送请求获取数据
    response = requests.get(url)

    # 检查请求是否成功
    if response.status_code == 200:
        # 创建临时文件
        with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
            tmp_file.write(response.content)
            tmp_file_path = tmp_file.name

        # 使用xarray打开GRIB2数据,指定使用'cfgrib'引擎,并使用filter_by_keys参数
        ds = xr.open_dataset(tmp_file_path, engine='cfgrib')

        # 指定保存路径
        save_path_nc = r"C:\Users\Lenovo\Desktop\nc\tmp2m"
        save_path_tif = r"C:\Users\Lenovo\Desktop\nc\tmp2mtif"

        # 确保保存路径存在
        os.makedirs(save_path_nc, exist_ok=True)
        os.makedirs(save_path_tif, exist_ok=True)

        # 构建保存文件名
        save_filename_nc = f"gfs_forecast_{date_str}_{hour_str}_f{forecast_hour:03d}_{variables}_{levels}.nc"

        # 保存数据为NetCDF文件
        ds.to_netcdf(os.path.join(save_path_nc, save_filename_nc))

        # 打印保存文件的路径
        print(f"NetCDF数据已保存至: {os.path.join(save_path_nc, save_filename_nc)}")

        # 将NetCDF文件转换为TIFF文件并保存
        ds_rio = ds.rio.write_crs("EPSG:4326")  # 设置坐标系为WGS 84
        save_filename_tif = f"gfs_forecast_{date_str}_{hour_str}_f{forecast_hour:03d}_{variables}_{levels}.tif"
        ds_rio.rio.to_raster(os.path.join(save_path_tif, save_filename_tif))

        # 打印保存TIFF文件的路径
        print(f"TIFF文件已保存至: {os.path.join(save_path_tif, save_filename_tif)}")

        # 关闭数据集连接
        ds.close()

        # 删除临时文件
        os.remove(tmp_file_path)


    else:
        date_str = (dt.date.today() - dt.timedelta(days=1)).strftime("%Y%m%d")

你可能感兴趣的:(pycharm,数据库)