数据获取 | 傻瓜式的python下载GFS预报数据
个人信息
公众号:气python风雨
关注我获取更多学习资料,第一时间收到我的Python学习资料,也可获取我的联系方式沟通合作
前言
最近TGA的年度游戏被索尼的《宇宙机器人》拿下了,不是哥们你谁啊?
言归正传
一个朋友近来需要下载GFS脚本,遂拿官方脚本改改比较傻瓜式的操作。
GFS(全球预报系统)模型提供了全球范围内的气象预报数据,是许多气象预报服务的基础。 然而,手动下载这些数据既耗时又低效。 为了解决这一问题,我们开发了一个Python脚本,旨在自动化下载指定时间区间的GFS预报数据。
项目目标
本项目的目标是创建一个Python脚本,该脚本能够:
根据用户输入的时间区间(例如 2024082300),自动下载相应的GFS预报文件。 将下载的文件存放在以输入时间命名的文件夹中。 提高数据下载的效率和准确性,减少手动操作的繁琐性。
项目内容
我们的脚本通过以下步骤实现自动化下载:
输入时间区间:用户通过命令行参数输入指定的时间区间。 构建URL:脚本根据输入的时间构建GFS数据的下载URL。 下载数据:使用Python的urllib库打开URL并下载数据。 存储数据:将下载的数据存放在以输入时间命名的文件夹中。
"""
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(0, 127, 3) # 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)
使用方法:
将上述脚本保存为一个文件,例如 download_gfs.py。 使脚本可执行:chmod 755 download_gfs.py。 运行脚本并传入指定的时间,例如: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脚本循环传参实现