爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 118296|回复: 149

[经验总结] Python全自动:下载数据—分析绘图—上传图到邮箱—关机

  [复制链接]

新浪微博达人勋

发表于 2015-6-25 18:17:31 | 显示全部楼层 |阅读模式

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

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

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作为附件,做完关机。
把代码贴在了下边,添加了注释。
  1. # coding=utf-8 ####make Chinese characters available
  2. #!/usr/bin/env python
  3. #
  4. # (C) Copyright 2012-2013 ECMWF.
  5. #
  6. # This software is licensed under the terms of the Apache Licence Version 2.0
  7. # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
  8. # In applying this licence, ECMWF does not waive the privileges and immunities
  9. # granted to it by virtue of its status as an intergovernmental organisation nor
  10. # does it submit to any jurisdiction.
  11. #

  12. from ecmwfapi import ECMWFDataServer         #EC下载所用,参见
  13. #http://bbs.06climate.com/forum.php?mod=viewthread&tid=24435&page=1&extra=#pid293934 和EC官网
  14. import netCDF4 as nc     #读nc
  15. import matplotlib.pyplot as plt    #画图
  16. import numpy as np   #矩阵计算
  17. from mpl_toolkits.basemap import Basemap    #加载地理信息
  18. import smtplib    #发邮件
  19. from email.mime.text import MIMEText   #邮件文字
  20. from email.mime.multipart import MIMEMultipart   #邮件附件
  21. import os     #系统命令
  22. # To run this example, you need an API key
  23. # available from https://api.ecmwf.int/v1/key/

  24. # print help(smtplib)
  25. # exit()

  26. #============================================================
  27. #===========从ERA-Interim数据集中下载资料========================
  28. #============================================================
  29. #这里需要配置文件和添加API key,详见http://bbs.06climate.com/forum.php?mod=viewthread&tid=24435&page=1&extra=#pid293934
  30. server = ECMWFDataServer()
  31. times=["1981","1982","1983","1984","1985","1986","1987","1988","1989","1990",\
  32.        "1991","1992","1993","1994","1995","1996","1997","1998","1999","2000",\
  33.        "2001","2002","2003","2004","2005","2006","2007","2008","2009","2010",\
  34.        "2011","2012","2013","2013"]
  35. for tt in times[0:1]:    #此处为了示例,并未循环所有年份,仅起始年份1981年
  36.         server.retrieve({
  37.                 'dataset' : "interim",                  # ERA-interim的数据
  38.                 'step'    : "0",                        # ERA-interim的实况资料
  39.                 'levtype' : "pl",                       # pressure levels
  40.                 'date'    : tt+"-06-01/to/"+tt+"-06-31",  #日期
  41.                 'time'    : "00/06/12/18",              #  时次
  42.                 'param'   : "t",                        #下载的变量名称
  43.                 'levelist': "500",                      #下载层次
  44.                 'area'    : "55/70/15/140",  #纬度北界/经度西界/纬度南界/经度东界
  45.                 'grid'    : "1/1",                #网格分辨率
  46.                 'format'  :'netcdf',            #下载格式为nc
  47.                 'target'  : tt+"t.nc",          #储存名称,无路径则为同一目录
  48.                 })
  49. print "Download finished"

  50. #========================================================
  51. #============分析所下载数据并画图==========================
  52. #========================================================
  53. #===========此处为了示例,仅画1981年========================
  54. #读取1981年6月1号00时的温度
  55. obj=nc.Dataset(tt+"t.nc")
  56. t=obj.variables['t'][0,:,:]
  57. #创建投影方案,等经纬度投影,并以15-55N,70-140E作为绘图区域
  58. m=Basemap(projection='cyl',llcrnrlat=15,llcrnrlon=70,urcrnrlat=55,urcrnrlon=140)
  59. #加载中国地图
  60. m.readshapefile('E:/shp_map/bou2_4l','bou2_4l.shp',color='gray')
  61. #生成绘图背景格点场
  62. ny=t.shape[0];nx=t.shape[1]
  63. lons,lats=m.makegrid(nx,ny)
  64. x,y=m(lons,lats)
  65. yy=y[::-1]
  66. #画经纬度网格
  67. m.drawparallels(np.arange(55.,15.,-10.))
  68. m.drawmeridians(np.arange(70.,141.,15.))
  69. #画填色图
  70. cm = plt.cm.get_cmap('YlOrRd')    #读取一个内置的色系
  71. shades=m.contourf(x,yy,t,cmap=cm)  #将数据填色绘出
  72. m.colorbar(shades)                      #添加colorbar
  73. #画等值线
  74. curve=m.contour(x,yy,t,colors='black')     #画等值线
  75. plt.clabel(curve,fmt='%1.0f',colors='black')    #等值线标注
  76. #添加标题
  77. plt.title('500hPa_temperature')
  78. #存成pdf矢量图
  79. plt.savefig('output.pdf')
  80. plt.close()  #关闭绘图功能
  81. #print obj
  82. #obj.close()
  83. #exit()
  84. #==============================================
  85. #==============将出的图作为邮件附件发送出去=======
  86. #==============================================
  87. msg=MIMEMultipart()
  88. msg['from'] = '578938046@qq.com'+'<'+'578938046@qq.com'+'>'
  89. msg['to'] = '578938046@qq.com'
  90. msg['subject'] = '邮件标题:一封用python自发自收的带附件邮件'
  91. txt=MIMEText("这是正文内容,附件有图,请查收",'plain','utf-8')   
  92. msg.attach(txt)
  93. #构造附件1
  94. att1=MIMEText(open('output.pdf', 'rb').read(), 'base64', 'utf-8')
  95. att1["Content-Type"] = 'application/octet-stream'
  96. att1["Content-Disposition"] = 'attachment; filename="output.pdf"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字
  97. msg.attach(att1)

  98. try:
  99.     server = smtplib.SMTP()        #构造邮件传输服务
  100.     server.connect('smtp.qq.com')   #连接qq邮件host
  101.     server.starttls()   
  102.     server.login('578938046@qq.com','密码保密哦')#前为用户名,后为密码
  103.     server.sendmail(msg['from'], msg['to'],msg.as_string())   #从哪到哪,传邮件
  104.     server.quit()  #退出邮件服务
  105.     print '发送成功'
  106. except Exception, e:
  107.     print str(e)
  108. #============================
  109. #===========关机=============
  110. #============================
  111. exit()  ####此处将exit()注释掉则执行立即关机,否则运行止于此
  112. cmd="cmd.exe /k shutdown -s -t 0";
  113. os.system(cmd)
复制代码




最后,得到这样一个output.pdf:
QQ截图20151111152736.png
收到这样的邮件,打开邮件后,如下:
QQ截图20150625180737.png
需要注意的是,需要开启qq邮箱中的SMTP服务,才能发邮件,其他邮箱也都如此,qq邮箱开启该服务如下:
QQ截图20150625222048.png



多说一句,EC下载资料,单个python脚本任务的下载速度是有限制的,大约100k左右。如果下载量大的话,可以多个python脚本多个shell一起下载,这样虽然一个shell的下载速度也不超过100k,但6、7个一起搞,也能全速前进了,当然了,这个就得手动了,目前还不知道有更好的方法。





点评

32个赞!  发表于 2015-6-25 19:13

评分

参与人数 11威望 +2 金钱 +121 贡献 +23 体力 +80 收起 理由
yangwawa + 20 很给力!
辞觉 + 1 很给力!
Swallow + 5 赞一个!
云知道 + 5 很给力!
po_po1 + 20 + 1
chongzika + 10 很给力!逛论坛总会有发现
泡泡爱可乐 + 10
阿阿飞飞 + 10 + 2 很给力!
mofangbao + 15 + 5
Mid_Farmer + 20 + 2 很给力!
lqouc + 2 + 10 + 8 + 80

查看全部评分

本帖被以下淘专辑推荐:

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

新浪微博达人勋

发表于 2015-9-16 11:11:19 | 显示全部楼层
晚晴山 发表于 2015-7-29 14:16
不是。。。。我的ok是指愿意搞出来分享 但是没搞出来呢还。。。

http://bbs.06climate.com/forum.p ... &extra=page%3D1
在线安装包的方法总结,希望有用
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-6-25 18:21:01 | 显示全部楼层
Python好东西啊!
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2015-8-12 22:07:16 | 显示全部楼层
ginanony 发表于 2015-8-12 15:14
这么厉害的程序,学习了
有个问题,cm = plt.cm.get_cmap('YlOrRd')   中的'YlOrRd'是否还有其他的配色方 ...

有的,你可以利用help()功能,括号里输入plt.cm.get_cmap,有你想要的函数的帮助
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2015-6-25 18:23:20 | 显示全部楼层
随缘 发表于 2015-6-25 18:21
Python好东西啊!

是的,最近在学python,python很厉害
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-6-25 19:25:34 | 显示全部楼层
真不错啊,我还有太多要学习。
感谢分享啦
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-6-25 19:41:36 | 显示全部楼层
lqouc 发表于 2015-6-25 19:25
真不错啊,我还有太多要学习。
感谢分享啦

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

新浪微博达人勋

发表于 2015-6-25 21:14:04 | 显示全部楼层
给跪了。。{:eb502:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2015-6-25 21:50:12 | 显示全部楼层
太好了!                  
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-6-25 22:12:31 | 显示全部楼层
很赞 学习中
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-6-25 22:21:31 | 显示全部楼层
学习Python还是很不错的。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-6-25 22:42:05 | 显示全部楼层
多些Python的应用实例,能大大提高大家学习的兴趣
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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