- 积分
- 22715
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2011-7-23
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 平流层的萝卜 于 2015-11-11 15:28 编辑
想象一下,你打包好行李明天就准备去西藏玩个10天半个月的,但是今晚qq突然传来某个坑爹的消息:“小*,帮我用欧洲中心的资料画张近30年500hPa的平均温度图,明天传给我。”这时,你的egg碎了一地。
因为接下来按照常规,你将手动下载era的资料,等它下载完后,还得写程序画图,再把图通过邮箱或者qq传给他,又或者直接关机装没看见......
================================那么=========================================
脚本语言Python也许可以解决你的窘境,如果你把脚本写完整,就可以让python帮忙自动下载资料,自动分析出图,自动把图上传至邮箱,最后自动关机。而此时你就可以该干嘛干嘛了。
在此之前,当然需要安装一些扩展包,不过这些也都是一劳永逸的事情。
http://bbs.06climate.com/forum.php?mod=viewthread&tid=24435&page=1&extra=#pid293934 也感谢这个帖子的楼主介绍了如何用Python下载数据。
上个例子:我下载了ERA-Interim的温度nc数据,出图为output.pdf,再从自己的邮箱中写封邮件给自己,把output.pdf作为附件,做完关机。
把代码贴在了下边,添加了注释。
- # coding=utf-8 ####make Chinese characters available
- #!/usr/bin/env python
- #
- # (C) Copyright 2012-2013 ECMWF.
- #
- # This software is licensed under the terms of the Apache Licence Version 2.0
- # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
- # In applying this licence, ECMWF does not waive the privileges and immunities
- # granted to it by virtue of its status as an intergovernmental organisation nor
- # does it submit to any jurisdiction.
- #
- from ecmwfapi import ECMWFDataServer #EC下载所用,参见
- #http://bbs.06climate.com/forum.php?mod=viewthread&tid=24435&page=1&extra=#pid293934 和EC官网
- import netCDF4 as nc #读nc
- import matplotlib.pyplot as plt #画图
- import numpy as np #矩阵计算
- from mpl_toolkits.basemap import Basemap #加载地理信息
- import smtplib #发邮件
- from email.mime.text import MIMEText #邮件文字
- from email.mime.multipart import MIMEMultipart #邮件附件
- import os #系统命令
- # To run this example, you need an API key
- # available from https://api.ecmwf.int/v1/key/
- # print help(smtplib)
- # exit()
- #============================================================
- #===========从ERA-Interim数据集中下载资料========================
- #============================================================
- #这里需要配置文件和添加API key,详见http://bbs.06climate.com/forum.php?mod=viewthread&tid=24435&page=1&extra=#pid293934
- server = ECMWFDataServer()
- times=["1981","1982","1983","1984","1985","1986","1987","1988","1989","1990",\
- "1991","1992","1993","1994","1995","1996","1997","1998","1999","2000",\
- "2001","2002","2003","2004","2005","2006","2007","2008","2009","2010",\
- "2011","2012","2013","2013"]
- for tt in times[0:1]: #此处为了示例,并未循环所有年份,仅起始年份1981年
- server.retrieve({
- 'dataset' : "interim", # ERA-interim的数据
- 'step' : "0", # ERA-interim的实况资料
- 'levtype' : "pl", # pressure levels
- 'date' : tt+"-06-01/to/"+tt+"-06-31", #日期
- 'time' : "00/06/12/18", # 时次
- 'param' : "t", #下载的变量名称
- 'levelist': "500", #下载层次
- 'area' : "55/70/15/140", #纬度北界/经度西界/纬度南界/经度东界
- 'grid' : "1/1", #网格分辨率
- 'format' :'netcdf', #下载格式为nc
- 'target' : tt+"t.nc", #储存名称,无路径则为同一目录
- })
- print "Download finished"
- #========================================================
- #============分析所下载数据并画图==========================
- #========================================================
- #===========此处为了示例,仅画1981年========================
- #读取1981年6月1号00时的温度
- obj=nc.Dataset(tt+"t.nc")
- t=obj.variables['t'][0,:,:]
- #创建投影方案,等经纬度投影,并以15-55N,70-140E作为绘图区域
- m=Basemap(projection='cyl',llcrnrlat=15,llcrnrlon=70,urcrnrlat=55,urcrnrlon=140)
- #加载中国地图
- m.readshapefile('E:/shp_map/bou2_4l','bou2_4l.shp',color='gray')
- #生成绘图背景格点场
- ny=t.shape[0];nx=t.shape[1]
- lons,lats=m.makegrid(nx,ny)
- x,y=m(lons,lats)
- yy=y[::-1]
- #画经纬度网格
- m.drawparallels(np.arange(55.,15.,-10.))
- m.drawmeridians(np.arange(70.,141.,15.))
- #画填色图
- cm = plt.cm.get_cmap('YlOrRd') #读取一个内置的色系
- shades=m.contourf(x,yy,t,cmap=cm) #将数据填色绘出
- m.colorbar(shades) #添加colorbar
- #画等值线
- curve=m.contour(x,yy,t,colors='black') #画等值线
- plt.clabel(curve,fmt='%1.0f',colors='black') #等值线标注
- #添加标题
- plt.title('500hPa_temperature')
- #存成pdf矢量图
- plt.savefig('output.pdf')
- plt.close() #关闭绘图功能
- #print obj
- #obj.close()
- #exit()
- #==============================================
- #==============将出的图作为邮件附件发送出去=======
- #==============================================
- msg=MIMEMultipart()
- msg['from'] = '578938046@qq.com'+'<'+'578938046@qq.com'+'>'
- msg['to'] = '578938046@qq.com'
- msg['subject'] = '邮件标题:一封用python自发自收的带附件邮件'
- txt=MIMEText("这是正文内容,附件有图,请查收",'plain','utf-8')
- msg.attach(txt)
- #构造附件1
- att1=MIMEText(open('output.pdf', 'rb').read(), 'base64', 'utf-8')
- att1["Content-Type"] = 'application/octet-stream'
- att1["Content-Disposition"] = 'attachment; filename="output.pdf"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字
- msg.attach(att1)
- try:
- server = smtplib.SMTP() #构造邮件传输服务
- server.connect('smtp.qq.com') #连接qq邮件host
- server.starttls()
- server.login('578938046@qq.com','密码保密哦')#前为用户名,后为密码
- server.sendmail(msg['from'], msg['to'],msg.as_string()) #从哪到哪,传邮件
- server.quit() #退出邮件服务
- print '发送成功'
- except Exception, e:
- print str(e)
- #============================
- #===========关机=============
- #============================
- exit() ####此处将exit()注释掉则执行立即关机,否则运行止于此
- cmd="cmd.exe /k shutdown -s -t 0";
- os.system(cmd)
复制代码
最后,得到这样一个output.pdf:
收到这样的邮件,打开邮件后,如下:
需要注意的是,需要开启qq邮箱中的SMTP服务,才能发邮件,其他邮箱也都如此,qq邮箱开启该服务如下:
多说一句,EC下载资料,单个python脚本任务的下载速度是有限制的,大约100k左右。如果下载量大的话,可以多个python脚本多个shell一起下载,这样虽然一个shell的下载速度也不超过100k,但6、7个一起搞,也能全速前进了,当然了,这个就得手动了,目前还不知道有更好的方法。
|
评分
-
查看全部评分
|