爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 52912|回复: 39

[混合编程] Python+CDO批处理CMIP5模式数据 插值

  [复制链接]

新浪微博达人勋

发表于 2017-5-5 16:38:00 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 JOJOweibo 于 2017-9-26 09:10 编辑

春节后被同学安利了Python,沾上以后深深的被它的简洁所吸引。同时最近需要处理CMIP5模式数据,要对N个模式结果插值到指定网格,Climate Data Operators (CDO)在这方面表现出色,因此,我使用这两种语言处理CMIP5数据,得到指定层,指定时间跨度,差值到指定网格的数据。本人菜鸟一枚,在跌跌撞撞中编好了这个小程序,交卷给气象家园。虽然我编程差,还是希望大家能多交流,当然,也希望能帮到有同样需求的小伙伴。
1)首先描述问题:
组里面的CMIP数据是以model名字为目录存放的(图1),比如ACCESS1-3的所有变量(va,ua,ts...)存放在文件夹/model/ACCESS1-3/中

此外,每个变量切割成了几个不同时间跨度的文件(图2),eg:va变量1850-2005年的数据存放在三个文件中:
va_Amon_ACCESS1-3_historical_r1i1p1_185001-189912.nc
va_Amon_ACCESS1-3_historical_r1i1p1_190001-194912.nc
va_Amon_ACCESS1-3_historical_r1i1p1_200001-200512.nc
另外,每个模式的分辨率不同,我们需要插值到相同的网格上处理。
2)解决思路:
遍历model中的变量(e.g. va), 将上述三个va的文件粘合为一个临时文件(outfiletemp1)。
在outfiletemp1中挑出850hPa,以及需要的时间跨度(eg1900-2005)输出为临时文件(outfiletemp2),
然后对outfiletemp2进行插值,cdo remapbil,输出最终文件outfile就可以了


如下为python代码:
  1. # JOJO,IAP,Beijing 2017/09/05 Email:mtjsummer@163.com
  2. import numpy as np
  3. from netCDF4 import Dataset
  4. # #CDO做了一个python 的包,大家pip install cdo 就可以 import了
  5. from cdo import *
  6. import os
  7. cdo = Cdo()

  8. # there are 41 models data
  9. models=['bcc-csm1-1', 'CanESM2', 'CNRM-CM5', 'FGOALS-g2', 'FGOALS-s2', \
  10. 'GFDL-CM3', 'GFDL-ESM2G', 'GFDL-ESM2M', 'GISS-E2-H', 'GISS-E2-R',\
  11. 'MRI-CGCM3', 'MIROC-ESM', 'MIROC-ESM-CHEM', 'MIROC4h', 'MIROC5',\
  12.   'NorESM1-M', 'HadCM3', 'HadGEM2-CC', 'HadGEM2-ES', 'inmcm4', \
  13.   'IPSL-CM5A-LR', 'NorESM1-ME', 'CSIRO-Mk3-6-0', 'MPI-ESM-LR', \
  14.   'CanCM4', 'ACCESS1-0', 'CCSM4', 'IPSL-CM5A-MR', 'IPSL-CM5B-LR',\
  15.    'EC-EARTH', 'MPI-ESM-P', 'HadGEM2-AO', 'ACCESS1-3', 'BNU-ESM', \
  16.    'MPI-ESM-MR', 'CMCC-CM', 'CESM1-FASTCHEM', 'FIO-ESM', 'CESM1-CAM5',\
  17.     'CESM1-BGC', 'CESM1-WACCM']



  18. <div class="blockcode"><blockquote># 设置全局变量
  19. varname='va'
  20. yrSart=str(1948)
  21. yrLast=str(2005)
  22. infolder='/disk_raid5/data/CMIP5/historical/model/'
  23. outfolder='/disk_raid5/pub/mtj/works/0EAWM_ENSO/CMIP5/'+varname+'/'
  24. i=0

  25. for model in models:

  26.     # select target files---Method 0---------
  27.     filesdir=os.path.join(infolder, model)
  28.     print(i,model)
  29.     os.chdir(filesdir)#改变当前工作目录到指定的路径os.chdir()
  30.     files=[fname for fname in glob.glob(varname+'_Amon_'+model+'_historical_r1i1p1_*.nc')]
  31.     files.sort(key=str.lower)#将files按字母顺序排序
  32.     print(files)
  33.     # select target files---Method 1---------
  34.     # filesdir=os.path.join(infloder,models[0])
  35.     # print(filesdir)
  36.     # fs2=[d for d in os.listdir(filesdir) if os.path.isfile(os.path.join(filesdir,d)) \
  37.     # and d.split('_')[0]=='va' and d.split('_')[4]=='r1i1p1']
  38.     # print(fs2)
  39.     # 检查model中是否存在varname的数据
  40.     if len(files)==0:
  41.         print('there is no ',varname,'data in ',model)
  42.         continue
  43.   
  44.     # 检查outfile是否已经计算过了
  45.     outfile=outfolder+varname+'_Amon_'+model+'_r1i1p1_'+yrSart+'-'+yrLast+'.nc'
  46.     if os.path.isfile(outfile):
  47.             print('the ',outfile,' is already existed')
  48.             continue
  49.     # combile files temporarily
  50.     outfiletemp1=outfolder+varname+'_temp1.nc'
  51.     cdo.cat(input=files,output=outfiletemp1)
  52.     print('combile files OK')   

  53.     # cdo to select level,year (outfiletemp2) and remapbil (outfile)
  54.     outfiletemp2=outfolder+varname+'_temp2.nc'
  55.     outfiletemp3=outfolder+varname+'_temp3.nc'
  56.     cdo.sellevel('85000',input=outfiletemp1,output=outfiletemp2)
  57.     cdo.selyear('1979/2008',input=outfiletemp2,output=outfiletemp3)
  58.     cdo.remapbil('r144x73',input =outfiletemp3,output =outfile)
  59.     print('the monthly',yrSart,'-',yrLast,' r144*73')
  60.     os.remove(outfiletemp1)
  61.     os.remove(outfiletemp2)
  62.     os.remove(outfiletemp2)
  63.     print('tempfiles removed,',model,'is OK')
  64.     i=i+1
复制代码









图2

图2

图1

图1

评分

参与人数 3金钱 +43 贡献 +2 体力 +80 收起 理由
grug + 5 赞一个!
po_po1 + 20 很给力!
风往北吹 + 18 + 2 + 80 很给力!

查看全部评分

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

新浪微博达人勋

 楼主| 发表于 2017-5-5 16:42:56 | 显示全部楼层

RE: Python+CDO处理CMIP5模式数据 插值

本帖最后由 JOJOweibo 于 2017-5-5 16:47 编辑

标题错别字了,插值, 用python的小伙伴,欢迎交流QQ:305897795
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-5-9 09:30:06 | 显示全部楼层
多谢楼主分享{:5_214:}
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-5-9 10:47:18 | 显示全部楼层
大神
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2017-5-10 11:50:39 | 显示全部楼层
请教一下,我准备用cat函数合并nc数据,错误提示为unsupported file type(library support not complied in)。这是因为没有安装netcdf4扩展包吗?如何安装呢?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-5-10 19:52:32 | 显示全部楼层
学到啦~谢楼主
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-5-12 10:05:44 | 显示全部楼层
tiantianyixin 发表于 2017-5-10 11:50
请教一下,我准备用cat函数合并nc数据,错误提示为unsupported file type(library support not complied i ...

可能是这句有一点点小错误,少了一个空格,cdo无法读入: os.system('cdo select,level=85000,year='+yrSart+'/'+yrLast+outfiletemp1+' '+outfiletemp2)
你先试试改成这样:os.system('cdo select,level=50000,year=1950/2000 '+outfiletemp1+' '+outfiletemp2)
如果有问题再QQ我
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-5-12 10:07:37 | 显示全部楼层
tiantianyixin 发表于 2017-5-10 11:50
请教一下,我准备用cat函数合并nc数据,错误提示为unsupported file type(library support not complied i ...

推荐使用anaconda安装各种包,
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-5-12 10:07:43 | 显示全部楼层
tiantianyixin 发表于 2017-5-10 11:50
请教一下,我准备用cat函数合并nc数据,错误提示为unsupported file type(library support not complied i ...

推荐使用anaconda安装各种包,
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-5-17 20:40:33 | 显示全部楼层
厉害了,才学Python就这么666
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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