爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 21821|回复: 10

[经验总结] 小白自己摸索出来的如何用Python下欧洲中心数据

[复制链接]

新浪微博达人勋

发表于 2018-7-11 09:50:01 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 huangying 于 2018-7-11 09:59 编辑

由于学习需要欧洲中心的再分析数据,最近两天一直在摸索如何用Python下数据。有一点点头绪,想和大家分享我的经验。
如有错误和不足之处请各位大佬指正补充,谢谢!
第一次发帖子,也不太会用这个编辑器,所以做得有点难看。。


                               
登录/注册后可看大图

预备工作:
安装Python
如果需要 ,可以自行下载。我放在附件里了
按照它的提示安装,非常简单




                               
登录/注册后可看大图



1.下数据第一步
当然是申请一个账户,
然后 在这里 获得key  https://api.ecmwf.int/v1/key/
是这样的一个页面,那些url key email 就是我们需要的信息
(图1)




2.下载欧洲中心网上的一个文件:ecmwf-api-client-python
地址: https://confluence.ecmwf.int/display/WEBAPI/Web-API+Downloads
我挂在附件里,如果找不到可以下这个。
然后解压有这些,我不太了解这些程序运行方式,所以我把它放到安装Python那个目录里了,不知道放别处行不行?
图(2)
再从第一个文件夹里找到下图api.py这个,用IDLE编辑

                               
登录/注册后可看大图

然后找到这几行 图(3)

                               
登录/注册后可看大图

将之前网页上获得的那三行信息填进去,如下:图(4)

                               
登录/注册后可看大图

然后保存。



图1

图1

图2

图2

图3

图3

图4

图4

ecmwf-api-client-python.tgz

5.5 KB, 下载次数: 21, 下载积分: 金钱 -5

python-2.7.14rc1.amd64.msi

19.24 MB, 下载次数: 48, 下载积分: 金钱 -5

评分

参与人数 1金钱 +20 贡献 +5 收起 理由
mofangbao + 20 + 5

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-7-11 09:51:01 | 显示全部楼层
本帖最后由 huangying 于 2018-7-11 09:55 编辑

3.试一试有没有问题

之前解压的这个文件 有个example,用以测试用IDLE打开,运行它(按F5就可以)。如下结果就是正确的
然后再打开你之前的那个文件夹,就可以看到下好的文件啦


另外:我所做的是参考以下帖子内容,作者写得很详细,建议大家去学习一下:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=24435

这个帖子发表于几年前,ecmwf的页面已经有所更改,原帖的一些链接找不到相应的资料,所以我的帖子补充了一些资料。

希望大家来发表意见和经验,一起学习,一起进步!





untitled6.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-11 11:53:57 | 显示全部楼层
huangying 发表于 2018-7-11 09:51
3.试一试有没有问题

之前解压的这个文件 有个example,用以测试用IDLE打开,运行它(按F5就可以)。如下 ...

这两天正好在下数据,也参考了14年那张帖子,现在已经正常下载了。但是我开始初步探索里面数据的时候发现,通过variables直接读出来的要素(var=f.variables['var'],)都是netcdf4._netcdf4.variable类别(type(var)),不是np.ndarray数组,因此没法进行广播运算(var直接和标量进行加减乘除运算),如果用np.asarray(var)转成np.ndarray数组再运算,电脑直接崩溃。不知道究竟应该怎样对付netcdf4._netcdf4.variable这种数据
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-11 16:54:04 | 显示全部楼层
schliezer 发表于 2018-7-11 11:53
这两天正好在下数据,也参考了14年那张帖子,现在已经正常下载了。但是我开始初步探索里面数据的时候发现 ...

用var=f.variables['var'][:]就能读到内容了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-11 16:57:58 | 显示全部楼层
ecmwf-api-client-python
这个直接在cmd里用pip install ecmwf-api-client-python 应该能找到(我忘记了),方便些
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-11 17:39:31 | 显示全部楼层
我不知道叫什么 发表于 2018-7-11 16:54
用var=f.variables['var'][:]就能读到内容了

试了,死机。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-11 17:39:36 | 显示全部楼层
我不知道叫什么 发表于 2018-7-11 16:54
用var=f.variables['var'][:]就能读到内容了

试了,死机。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-7-11 18:00:43 | 显示全部楼层
写了一个脚本,用于下载1988.1~1989.12的T和Td(温度和露点温度),范围34.5~40.5N,90~105S.
可以正常运行,如果需要的话,修改year1和year2(起始年和最后一年的推后一年)即可
脚本如下:

#!/usr/bin/env python
import calendar
from ecmwfapi import ECMWFDataServer
server = ECMWFDataServer()
year1=1988
year2=1990
for iyear in range(year1,year2):
    for imonth in range(1,13):
        startDate = '%04d-%02d-%02d' % (iyear, imonth, 1)
        numberOfDays = calendar.monthrange(iyear, imonth)[1]
        lastDate = '%04d-%02d-%02d' % (iyear, imonth, numberOfDays)
        requestDates = (startDate + "/to/" + lastDate)
        server.retrieve({
            "class": "ei",
            "dataset": "interim",
            "date": requestDates,
            "expver": "1",
            "grid": "0.75/0.75",
            "levtype": "sfc",
            "param": "167.128/168.128",
            "step": "0",
            "stream": "oper",
            "time": "00:00:00",
            "type": "an",
            "area": "40.5/90/34.5/105",
            "format":"netcdf",
            "target":  "D:/era_down/TandTd."+str(iyear)+str(imonth)+".nc",
        })
        server.retrieve({
            "class": "ei",
            "dataset": "interim",
            "date": requestDates,
            "expver": "1",
            "grid": "0.75/0.75",
            "levtype": "sfc",
            "param": "167.128/168.128",
            "step": "3/6/9/12",
            "stream": "oper",
            "time": "00:00:00",
            "type": "fc",
            "area": "40.5/90/34.5/105",
            "format":"netcdf",
            "target":  "D:/era_down/TandTd."+str(iyear)+str(imonth)+".nc",
        })


脚本是参考官网上的那个MARS再根据需要对他进行修改。
但是我有个问题:
为什么有两段server.retrieve这样的程序?他们的差别仅在于type和step,表示的是什么呢?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-17 07:40:51 | 显示全部楼层
{:eb502:}{:eb502:}{:eb502:}{:eb502:}
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-5-12 15:43:01 | 显示全部楼层
{:eb502:}{:eb502:}{:eb502:}
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表