- 积分
- 123
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2017-5-2
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
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代码:
- # JOJO,IAP,Beijing 2017/09/05 Email:mtjsummer@163.com
- import numpy as np
- from netCDF4 import Dataset
- # #CDO做了一个python 的包,大家pip install cdo 就可以 import了
- from cdo import *
- import os
- cdo = Cdo()
- # there are 41 models data
- models=['bcc-csm1-1', 'CanESM2', 'CNRM-CM5', 'FGOALS-g2', 'FGOALS-s2', \
- 'GFDL-CM3', 'GFDL-ESM2G', 'GFDL-ESM2M', 'GISS-E2-H', 'GISS-E2-R',\
- 'MRI-CGCM3', 'MIROC-ESM', 'MIROC-ESM-CHEM', 'MIROC4h', 'MIROC5',\
- 'NorESM1-M', 'HadCM3', 'HadGEM2-CC', 'HadGEM2-ES', 'inmcm4', \
- 'IPSL-CM5A-LR', 'NorESM1-ME', 'CSIRO-Mk3-6-0', 'MPI-ESM-LR', \
- 'CanCM4', 'ACCESS1-0', 'CCSM4', 'IPSL-CM5A-MR', 'IPSL-CM5B-LR',\
- 'EC-EARTH', 'MPI-ESM-P', 'HadGEM2-AO', 'ACCESS1-3', 'BNU-ESM', \
- 'MPI-ESM-MR', 'CMCC-CM', 'CESM1-FASTCHEM', 'FIO-ESM', 'CESM1-CAM5',\
- 'CESM1-BGC', 'CESM1-WACCM']
- <div class="blockcode"><blockquote># 设置全局变量
- varname='va'
- yrSart=str(1948)
- yrLast=str(2005)
- infolder='/disk_raid5/data/CMIP5/historical/model/'
- outfolder='/disk_raid5/pub/mtj/works/0EAWM_ENSO/CMIP5/'+varname+'/'
- i=0
- for model in models:
- # select target files---Method 0---------
- filesdir=os.path.join(infolder, model)
- print(i,model)
- os.chdir(filesdir)#改变当前工作目录到指定的路径os.chdir()
- files=[fname for fname in glob.glob(varname+'_Amon_'+model+'_historical_r1i1p1_*.nc')]
- files.sort(key=str.lower)#将files按字母顺序排序
- print(files)
- # select target files---Method 1---------
- # filesdir=os.path.join(infloder,models[0])
- # print(filesdir)
- # fs2=[d for d in os.listdir(filesdir) if os.path.isfile(os.path.join(filesdir,d)) \
- # and d.split('_')[0]=='va' and d.split('_')[4]=='r1i1p1']
- # print(fs2)
- # 检查model中是否存在varname的数据
- if len(files)==0:
- print('there is no ',varname,'data in ',model)
- continue
-
- # 检查outfile是否已经计算过了
- outfile=outfolder+varname+'_Amon_'+model+'_r1i1p1_'+yrSart+'-'+yrLast+'.nc'
- if os.path.isfile(outfile):
- print('the ',outfile,' is already existed')
- continue
- # combile files temporarily
- outfiletemp1=outfolder+varname+'_temp1.nc'
- cdo.cat(input=files,output=outfiletemp1)
- print('combile files OK')
- # cdo to select level,year (outfiletemp2) and remapbil (outfile)
- outfiletemp2=outfolder+varname+'_temp2.nc'
- outfiletemp3=outfolder+varname+'_temp3.nc'
- cdo.sellevel('85000',input=outfiletemp1,output=outfiletemp2)
- cdo.selyear('1979/2008',input=outfiletemp2,output=outfiletemp3)
- cdo.remapbil('r144x73',input =outfiletemp3,output =outfile)
- print('the monthly',yrSart,'-',yrLast,' r144*73')
- os.remove(outfiletemp1)
- os.remove(outfiletemp2)
- os.remove(outfiletemp2)
- print('tempfiles removed,',model,'is OK')
- i=i+1
复制代码
|
-
图2
-
图1
评分
-
查看全部评分
|