ECMWF 欧洲中期天气预报中心 下载长序列气象数据(温度,风场等)

时间:2024-03-13 13:01:07

由于改版,从ECMWF上获取数据需要通过API访问,本文提供了python代码批量下载数据的方法

下面网址提供了再分析数据(reanalysis dataset),也就是长序列气象数据
https://www.ecmwf.int/en/forecasts/datasets/browse-reanalysis-datasets

(当然这个网站也提供了一些实时数据,但其获取方式不是本文的关注点)

1、首先需要注册一个账户,方便网站为你提供API的key
https://apps.ecmwf.int/registration/

2、将API的key储存为一个.ecmwfapirc文件
https://api.ecmwf.int/v1/key/ 在这个网站得到自己账户申请下来的key
创建前导点.ecmwfapirc文件官方的方法是:
①新建一个txt文本,将下面这三行代码复制进去,然后保存
ECMWF 欧洲中期天气预报中心 下载长序列气象数据(温度,风场等)
②把文件重命名为.ecmwfapirc.(注意前后都有点),然后就可以了

but,我这样怎么试都没有成功,所以在这里提供另一种方法

打开cmd,将路径转为你想放置文件的位置,然后输入
ECMWF 欧洲中期天气预报中心 下载长序列气象数据(温度,风场等)
就得到一个类型为ecmwfapirc的文件

最后用记事本打开该文件,把三行key的信息粘进去并保存文件

Windows用户: 将文件存在 C:\Users<USERNAME>.ecmwfapirc (一般是这个路径下)

3、安装python支持库

需要依靠他们自己开发的第三方类库
打开cmd(任意路径),

输入以下命令后,静待安装成功

   pip install https://software.ecmwf.int/wiki/download/attachments/56664858/ecmwf-api-client-python.tgz

也可以选择先在网上下载好ecmwf-api-client-python.tgz文件
https://software.ecmwf.int/wiki/download/attachments/56664858/ecmwf-api-client-python.tgz
然后再pip install

4、python代码批量获取气象数据
在开头提供的网址逛一下,可以找到不少数据集,点开以后就是选择一下想下载数据时间,种类什么的
ECMWF 欧洲中期天气预报中心 下载长序列气象数据(温度,风场等)

选好以后点击view the MARS request 就可以拿到他们自行生成的结构体
ECMWF 欧洲中期天气预报中心 下载长序列气象数据(温度,风场等)

你可以仅查看python版本的,然后复制到你的python集成开发环境

观察这个结构会发现,其实这样明白这些字段的含义,就完全不用在网站上点啊点

可以通过更改参数设置来批量获取,你也可以把它放到循环体中,每次循环变更参数

##参数说明
1、type是输出格式,这里你可以改成netcdf (.nc),或者grid
2、target是输出路径+文件名,可以使用相对路径,只给文件名表示放在和.py文件相同的路径下
3、可以新加一个'area': "LatMax/LongMin/LatMin/LongMax", 来通过经纬度选择子区域(默认是获得全球资料)

参考代码(批量获得中国月平均风场数据)

from ecmwfapi import ECMWFDataServer
server = ECMWFDataServer()


level=['1000','700','500']

direction=['U','V']

param=['131.128','132.128']

dates="20150101/20150201/20150301/20150401/20150501/20150601/20150701/20150801/20150901/20151001/20151101/20151201"


for l in range(0,3):
    for p in range(0,2):
        filename=direction[p] + level[l] + ".nc"
        server.retrieve({
                    "class": "ei",
                    "dataset": "interim",
                    "date": dates,
                    "expver": "1",
                    "grid": "0.75/0.75",
                    "levelist": level[l],
                    "levtype": "pl",
                    "param": param[p],
                    "stream": "moda",
                    "type": "an",
                    'area': "60/70/17/138",
                    'format': "netcdf",
                    "target": filename,
                })
        print('********************************')
        print('finish')
        print(filename)