数据获取 | 傻瓜式的python下载GFS预报数据

文摘   2024-12-16 16:20   北京  

数据获取 | 傻瓜式的python下载GFS预报数据

个人信息

公众号:气python风雨

Image Name

关注我获取更多学习资料,第一时间收到我的Python学习资料,也可获取我的联系方式沟通合作

前言

最近TGA的年度游戏被索尼的《宇宙机器人》拿下了,不是哥们你谁啊?
言归正传
一个朋友近来需要下载GFS脚本,遂拿官方脚本改改比较傻瓜式的操作。
GFS(全球预报系统)模型提供了全球范围内的气象预报数据,是许多气象预报服务的基础。 然而,手动下载这些数据既耗时又低效。 为了解决这一问题,我们开发了一个Python脚本,旨在自动化下载指定时间区间的GFS预报数据。

项目目标

本项目的目标是创建一个Python脚本,该脚本能够:

  1. 根据用户输入的时间区间(例如 2024082300),自动下载相应的GFS预报文件。
  2. 将下载的文件存放在以输入时间命名的文件夹中。
  3. 提高数据下载的效率和准确性,减少手动操作的繁琐性。

项目内容

我们的脚本通过以下步骤实现自动化下载:

  1. 输入时间区间:用户通过命令行参数输入指定的时间区间。
  2. 构建URL:脚本根据输入的时间构建GFS数据的下载URL。
  3. 下载数据:使用Python的urllib库打开URL并下载数据。
  4. 存储数据:将下载的数据存放在以输入时间命名的文件夹中。
""" 
Python script to download selected files from rda.ucar.edu for a specified time interval.
"""

import sys, os
from urllib.request import build_opener

def download_files(date_time):
    base_url = "https://data.rda.ucar.edu/d084001/{year}/{date}/gfs.0p25.{date}00.f"
    forecast_hours = range(01273)  # From 0 to 126 hours, every 3 hours
    opener = build_opener()
    folder_name = date_time
    os.makedirs(folder_name, exist_ok=True)

    for hour in forecast_hours:
        file_url = f"{base_url.format(year=date_time[:4], date=date_time[:8])}{hour:03}.grib2"
        ofile = os.path.basename(file_url)
        sys.stdout.write(f"downloading {ofile} ... ")
        sys.stdout.flush()
        try:
            infile = opener.open(file_url)
            outfile_path = os.path.join(folder_name, ofile)
            with open(outfile_path, "wb"as outfile:
                outfile.write(infile.read())
            sys.stdout.write("done\n")
        except Exception as e:
            sys.stdout.write(f"failed: {e}\n")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python script_name.py <date_time>")
        sys.exit(1)

    date_time = sys.argv[1]
    download_files(date_time)

使用方法:

  1. 将上述脚本保存为一个文件,例如 download_gfs.py。
  2. 使脚本可执行:chmod 755 download_gfs.py。
  3. 运行脚本并传入指定的时间,例如:python download_gfs.py 2024082300
!python download_gfs.py 2024082300
downloading gfs.0p25.2024082300.f000.grib2 ... ^C Traceback (most recent call last): File "/home/mw/project/download_gfs.py", line 34, in <module> download_files(date_time) File "/home/mw/project/download_gfs.py", line 23, in download_files outfile.write(infile.read()) File "/opt/conda/lib/python3.9/http/client.py", line 465, in read return self._readall_chunked() File "/opt/conda/lib/python3.9/http/client.py", line 572, in _readall_chunked chunk_left = self._get_chunk_left() File "/opt/conda/lib/python3.9/http/client.py", line 555, in _get_chunk_left chunk_left = self._read_next_chunk_size() File "/opt/conda/lib/python3.9/http/client.py", line 515, in _read_next_chunk_size line = self.fp.readline(_MAXLINE + 1) File "/opt/conda/lib/python3.9/socket.py", line 704, in readinto return self._sock.recv_into(b) File "/opt/conda/lib/python3.9/ssl.py", line 1241, in recv_into return self.read(nbytes, buffer) File "/opt/conda/lib/python3.9/ssl.py", line 1099, in read return self._sslobj.read(len, buffer) KeyboardInterrupt

此处空间放不下手动终止了,可以看到文件夹下已有文件

!ls /home/mw/project/2024082300
gfs.0p25.2024082300.f000.grib2

小结

通过这个Python脚本,我们能够高效地下载指定时间区间的GFS预报数据,并将它们自动存放到相应的文件夹中。这不仅提高了数据处理的效率,还减少了人为错误的可能性。希望这个工具能够帮助气象爱好者和专业人士更方便地获取和分析GFS数据。
如果想下载其他时次可以配合shell脚本循环传参实现


气python风雨
主要发一些涉及大气科学的Python文章与个人学习备忘录
 最新文章