ERA5提供逐小时 0.25分辨率,垂直37层的再分析资料。也提供月平均资料。但是没有日平均资料,因此如果需要日平均资料,则需要自己将24小时数据下载后再处理。关于分辨率,除了0.25°的,在下载时,好像也可以通过更改 python下载脚本中的 'grid': [1.0, 1.0],
参数进行下载。
The ERA5 dataset contains one (hourly, 31 km) high resolution realisation (referred to as “reanalysis” or “HRES”) and a reduced resolution ten member ensemble (referred to as “ensemble” or “EDA”).
官网文档介绍:https://confluence.ecmwf.int/display/CKB/ERA5%3A+data+documentation
ERA5数据中Analysis and forecast的区别:https://confluence.ecmwf.int/pages/viewpage.action?pageId=85402030
数据下载的准备工作(注册,获得API KEY,在本地创建 .cdsapirc 文件存储API KEY):https://cds.climate.copernicus.eu/api-how-to
ERA5的数据下载使用的python软件包是 cdsapi,和之前 下载ERA-Interim 所用的 ecmwfapi 不同。
数据下载链接 :
逐小时:https://cds.climate.copernicus.eu/cdsapp#!/dataset/reanalysis-era5-pressure-levels?tab=overview
逐日数据下载接口(有多个分辨率可选,但好像只能逐月的下载,且没有提供python下载脚本) https://cds.climate.copernicus.eu/cdsapp#!/software/app-c3s-daily-era5-statistics?tab=app
从上述网址获得python下载代码中没有指明 expver(experiment version),因此下载得到的数据中会多一个expver的维度。其中,expver=0001是ERA5,expver=0005是ERA5T,因此可以再加一行选项'expver': '1'
来进行筛选。
其中,ERA5T是初始发布数据,即滞后于实时时间不超过三个月的数据。如果在ERA5T中检测到严重的缺陷,该数据可能与最终的ERA5数据不同。但在实践中,这种情况不太可能发生。根据迄今为止ERA5的生产经验(以及过去的ERA-Interim),ECMWF预计这样的事件不会每几年发生一次以上,如果真的发生的话。在不太可能的情况下,需要这样的纠正,将尽快通知用户。
关于netcdf文件中ERA5T和ERA5的具体说明可以参考https://confluence.ecmwf.int/display/CUSF/ERA5+CDS+requests+which+return+a+mixture+of+ERA5+and+ERA5T+data
#!/usr/bin/env python
import cdsapi
varname = ['u_component_of_wind','v_component_of_wind']
filname = ['u','v']
c = cdsapi.Client()
for nv in range(0,len(varname),1):
for year in range(1979,2020,1):
c.retrieve(
'reanalysis-era5-pressure-levels', # 也可以是 'reanalysis-era5-single-levels-monthly-means',
{
'product_type': 'reanalysis', # 也可以是 'monthly_averaged_reanalysis'
'expver': '1',
'variable': varname[nv],
'pressure_level': [
'200', '225', '250',
'450', '500', '825',
'850',
],
'year': str(year),
'month': [
'01', '02', '03',
'04', '05', '06',
'07', '08', '09',
'10', '11', '12',
],
'day': [
'01', '02', '03',
'04', '05', '06',
'07', '08', '09',
'10', '11', '12',
'13', '14', '15',
'16', '17', '18',
'19', '20', '21',
'22', '23', '24',
'25', '26', '27',
'28', '29', '30',
'31',
],
'time': [
'00:00', '06:00', '12:00',
'18:00',
],
'area': [
90, -180, 0,
180,
],
'grid': [1.0, 1.0
],
'format': 'netcdf',
},
'/home/users/data/ERA5_subdaily_NH_%s_%d.nc'%(varname[nv],year))
下面这个网址可以将ERA5的逐月数据交互式可视化(如下图),并且提供了相应的python代码: https://cds.climate.copernicus.eu/apps/c3s/app-era5-explorer
ERA5的降水数据是逐小时的,如果要计算日累积降水,就需要将24小时的降水数据加起来,这里提供了代码: https://confluence.ecmwf.int/display/CKB/ERA5%3A+How+to+calculate+daily+total+precipitation
最近开始转战python。虽然之前做过python课的助教,但真正要用的时候,还是有些不知所措。
作为解释型语言的python,相比于编译型语言Fortran,C+,速度比较慢,运行效率较低,不能脱离解释器独立运行,但可读性高。
相比于matlab,python免费。相比于ncl,同为解释型语言,python的优点在于各种开源库、机器学习框架、方便开发整合。
python的变量不需要提前申明,直接赋值就可以了,且可以随时改变变量的值和类型。在这一方面,python比fortran这些语言要方便些
本人一开始拒绝使用python,也是因为他的包实在太多了,选择一多就容易选择困难,不如ncl来得简单方便,毕竟就那么几个函数。
但真的开始用python后,发现他虽然有很多软件包,但把每个包的主要功能了解清楚后,好像也没有那么难了。加上python的网上教程非常多,遇到什么问题,上网一搜就有答案。这一方面还是很好的
操作系统层面:
绘图:
数据处理:
另外一些比较小众的气象软件包:
这两个是我英国雷丁大学导师推荐的软件包,可以说是专门为气象领域涉及的。我尝试了一下cf-plot画图,确实很方便,一句代码就可以出图,不需要自己手动添加地形、经纬度坐标等等。他在存图的时候竟然不能有路径,而且在什么路径下运行程序,图就存在什么路径下,且存成pdf时不能多页存储,我也是惊了。而且这个怎么画河流山地等信息呢?
缺点:比较小众,网上关于这方面的教程也比较少
优点:出图方便,代码简洁,适合快速查看气象数据
cfplot:查看文件变量的方法 cfa
matplotlib简要介绍: https://blog.mazhangjing.com/2018/02/28/learn_matplotlib/#1-matplotlib%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D
python读取文件时,返回的都是字符串.同时,不管哪种方法读取,都会读入换行符,此时可利用strip()函数删去字符串开头和末尾的空格与换行符.如果需要处理数值数据,也需要自己转为 int 或 float.
写入文件时也只能写入字符串,int, float, list, array 都无法直接写入,需要转为str才可以.写入的时候可以使用格式化输出格式.
f = open("runoob.txt", "r")
print("文件名为: %s" %f.name)
# 第一种方法
# 从文件读取指定的字节数,如果未给定或为负则读取所有,包括换行符,并返回一个字符串
data = f.read(10)
# 第二种方法
# 每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。
# 括号内可以指定读取的字节数,包括换行符
f.readline()
while line: # 遍历文件所有行
print (line.strip())
print(type(line))
line = f.readline()
# 第三种方法
# 读取整个文件所有行,保存在一个列表(list)变量中,每次读取一行,但读取大文件会比较占内存。
# 括号内无参数
lines = f.readlines()
for line in lines:
print (line)
print(type(line))
# 第四种方法
for line in f:
print (line)
print(type(line))
f.close()
参考资料:
# 只能写入字符串,无法写入list、array,但可以把他们转换为字符串然后写入
ff = open("runoob.txt", "w")
ff.write("*"*50+"\n") # 写入50个*并换行
ff.writelines("lats"+str(lats)+"\nlons"+str(lons)) #同样需要自己加入换行符
写入文件时用到的两个主要模式,这两个模式不能同时出现:
如果需要读取文件特定行的内容,可以使用该模块,对于大文件可以提高效率。但读取结束后,记得关闭该文件,否则,如果循环操作中该文件有更新,但linecache模块缓存的文件内容则不会有更新。
import linecache
line = linecache.getline(‘a.txt’,4) # 读取第4行内容
print(line.strip()) # strip函数可移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
linecache.clearcache()
f.seek(offset[, whence]) # 移动文件读取指针到指定位置
# offset,需要移动偏移的字节数
# whence,给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。可选,默认为0.
f.tell() # 括号内无参数,返回文件当前位置
import os
os.path.isfile(filname) # 判断文件是否存在
os.path.exists(test_file) # 判断文件或文件夹是否存在,但无法区分文件和文件夹
# 因此,若是判断文件,还是用 isfile 会比较好
scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。
该命令好像只能复制文件,若要复制目录及目录下的所有文件,需要加入 -r 表示递归复制整个目录
scp -r local_file remote_username@remote_ip:remote_folder # 将本地数据复制到远程
scp -r root@www.runoob.com:/home/root/others/music /home/space/music/1.mp3 # 从远程复制数据到本地
remote sync(远程同步),但它不仅可以远程同步数据(类似于 scp 命令),还可以本地同步数据(类似于 cp 命令)。不同于 cp 或 scp 的一点是,使用 rsync 命令备份数据时,不会直接覆盖以前的数据(如果数据已经存在),而是先判断已经存在的数据和新数据的差异,只有数据不同时才会把不相同的部分覆盖。
使用rsync 在远程传输数据(备份数据)前,是需要进行登陆认证的,这个过程需要借助 ssh 协议或者 rsync 协议才能完成。在 rsync 命令中,如果使用单个冒号(:),则默认使用 ssh 协议;反之,如果使用两个冒号(::),则使用 rsync 协议。 ssh 协议和 rsync 协议的区别在于,rsync 协议在使用时需要额外配置,增加了工作量,但优势是更加安全;反之,ssh 协议使用方便,无需进行配置,但有泄漏服务器密码的风险。
rsync [OPTION] SRC DEST # 仅在本地备份数据
rsync [OPTION] SRC [USER@]HOST:DEST # 将本地数据备份到远程机器上
rsync [OPTION] [USER@]HOST:SRC DEST # 将远程机器上的数据备份到本地机器上
# SRC:用来表示要备份的目标数据所在的位置(路径);
# DEST:用于表示将数据备份到什么位置;
# USER@:当做远程同步操作时,需指明系统登录的用户名,如果不显示指定,默认为以 root 身份登录系统并完成同步操作。
# 常用的 OPTION 选项 -avzP
# -a相当于-r、-l、-p、-o、-g、-t、-D,表示递归同步目录、保留软连接、保持文件权限、保持文件属主、属组、时间和设备信息
# -v 表示打印一些信息,比如文件列表、文件数量等。
# -z 将会在传输过程中压缩。
# -P 表示在同步的过程中可以看到同步的过程状态,比如统计要同步的文件数量、 同步的文件传输速度等。
# 若只同步DEST中没有但SRC有的文件,则加入 --ignore-existing
# 若只同步DEST中存在的文件,则加入 --existing
# 删除 DEST 中 SRC 没有的文件, 则加入 --delete
# 其他还有很多参数,可以在bash中直接输入 rsync 进行查看。
总体来说,感觉rsync功能比scp强大。
XLAT 1 0 LATITUDE, SOUTH IS NEGATIVE (degree_north) XLONG 1 0 LONGITUDE, WEST IS NEGATIVE (degree_east) LU_INDEX 1 0 LAND USE CATEGORY (-) 土地利用类型,一共有24中,不过这里的数值是从2到16,目前只知道16代表水,3代表耕田。
VAR_SSO 1 0 variance of subgrid-scale orography (m2)
地形次网格的方差,不知道有什么用,但是海洋上都是0,陆地上有一部分是100000—300000
LAP_HGT 1 0 Laplacian of orography (m) 范围:-600—500
U 19 0 x-wind component (m s-1) V 19 0 y-wind component (m s-1) W 19 0 z-wind component (m s-1)
PH 19 0 perturbation geopotential (m2 s-2) 扰动位势:result—p3-21图,不知道是什么东西,但随着高度的升高,其数值逐渐增大,难道是因为高空垂直运动增大吗?奇怪?
PHB 19 0 base-state geopotential (m2 s-2) 基本位势(平均位势):台风中心始终是低重力势能,随着高度逐渐增大 Z=10的时候全部充满
T 19 0 perturbation potential temperature (theta-t0) (K) 扰动位温,有一个高温中心
MU 1 0 perturbation dry air mass in column (Pa) 干空气柱扰动气压:-3000~1500
MUB 1 0 base state dry air mass in column (Pa) 平均干空气柱气压:55000~95000
NEST_POS 1 0 - (-) 内嵌网格位置,没什么用
P 19 0 perturbation pressure (Pa) 扰动气压
PB 19 0 BASE STATE PRESSURE (Pa) 基本气压,和height的图形不一样,且台风中心气压高
P_HYD 19 0 hydrostatic pressure (Pa) 液体静压力 Q2 1 0 QV at 2 M (kg kg-1)地面2米高度的比湿、温度 T2 1 0 TEMP at 2 M (K) TH2 1 0 POT TEMP at 2 M (K) PSFC 1 0 SFC PRESSURE (Pa) 表面气压 U10 1 0 U at 10 M (m s-1) 地面10米分厂的纬向分量、径向分量 V10 1 0 V at 10 M (m s-1) QVAPOR 19 0 Water vapor mixing ratio (kg kg-1)(0.009~0.019) QCLOUD 19 0 Cloud water mixing ratio (kg kg-1)(0~0.0018) QRAIN 19 0 Rain water mixing ratio (kg kg-1) QICE 19 0 Ice mixing ratio (kg kg-1) QSNOW 19 0 Snow mixing ratio (kg kg-1) QGRAUP 19 0 Graupel mixing ratio (kg kg-1)
SHDMAX 1 0 ANNUAL MAX VEG FRACTION (-) SHDMIN 1 0 ANNUAL MIN VEG FRACTION (-) SNOALB 1 0 ANNUAL MAX SNOW ALBEDO IN FRACTION (-)
TSLB 4 0 SOIL TEMPERATURE (K) SMOIS 4 0 SOIL MOISTURE (m3 m-3) SH2O 4 0 SOIL LIQUID WATER (m3 m-3) SMCREL 4 0 RELATIVE SOIL MOISTURE (-)
SEAICE 1 0 SEA ICE FLAG (-) XICEM 1 0 SEA ICE FLAG (PREVIOUS STEP) (-) SFROFF 1 0 SURFACE RUNOFF (mm) UDROFF 1 0 UNDERGROUND RUNOFF (mm) IVGTYP 1 0 DOMINANT VEGETATION CATEGORY (-) ISLTYP 1 0 DOMINANT SOIL CATEGORY (-) VEGFRA 1 0 VEGETATION FRACTION (-) GRDFLX 1 0 GROUND HEAT FLUX (W m-2) ACGRDFLX 1 0 ACCUMULATED GROUND HEAT FLUX (J m-2) ACSNOM 1 0 ACCUMULATED MELTED SNOW (kg m-2) SNOW 1 0 SNOW WATER EQUIVALENT (kg m-2) SNOWH 1 0 PHYSICAL SNOW DEPTH (m) CANWAT 1 0 CANOPY WATER (kg m-2) SSTSK 1 0 SKIN SEA SURFACE TEMPERATURE (K) COSZEN 1 0 COS of SOLAR ZENITH ANGLE (dimensionless) LAI 1 0 LEAF AREA INDEX (m-2/m-2) 叶面积指数 VAR 1 0 OROGRAPHIC VARIANCE (-) MAPFAC_M 1 0 Map scale factor on mass grid (-) MAPFAC_MX 1 0 Map scale factor on mass grid, x direction (-) MAPFAC_MY 1 0 Map scale factor on mass grid, y direction (-) MF_VX_INV 1 0 Inverse map scale factor on v-grid, x direction (-) F 1 0 Coriolis sine latitude term (s-1) E 1 0 Coriolis cosine latitude term (s-1) SINALPHA 1 0 Local sine of map rotation (-) COSALPHA 1 0 Local cosine of map rotation (-) HGT 1 0 Terrain Height (m) TSK 1 0 SURFACE SKIN TEMPERATURE (K) RAINC 1 0 ACCUMULATED TOTAL CUMULUS PRECIPITATION (mm),4km以下基本认为对流可分辨,不开对流参数化,RAINC是0 RAINSH 1 0 ACCUMULATED SHALLOW CUMULUS PRECIPITATION (mm) RAINNC 1 0 ACCUMULATED TOTAL GRID SCALE PRECIPITATION (mm) SNOWNC 1 0 ACCUMULATED TOTAL GRID SCALE SNOW AND ICE (mm) GRAUPELNC 1 0 ACCUMULATED TOTAL GRID SCALE GRAUPEL (mm) HAILNC 1 0 ACCUMULATED TOTAL GRID SCALE HAIL (mm) CLDFRA 19 0 CLOUD FRACTION (-) SWDOWN 1 0 DOWNWARD SHORT WAVE FLUX AT GROUND SURFACE (W m-2) GLW 1 0 DOWNWARD LONG WAVE FLUX AT GROUND SURFACE (W m-2) SWNORM 1 0 NORMAL SHORT WAVE FLUX AT GROUND SURFACE (SLOPE-DEPENDENT) (W m-2) OLR 1 0 TOA OUTGOING LONG WAVE (W m-2) ALBEDO 1 0 ALBEDO (-) CLAT 1 0 COMPUTATIONAL GRID LATITUDE, SOUTH IS NEGATIVE (degree_north) ALBBCK 1 0 BACKGROUND ALBEDO (-) EMISS 1 0 SURFACE EMISSIVITY (-) NOAHRES 1 0 RESIDUAL OF THE NOAH SURFACE ENERGY BUDGET (W m{-2}) TMN 1 0 SOIL TEMPERATURE AT LOWER BOUNDARY (K) XLAND 1 0 LAND MASK (1 FOR LAND, 2 FOR WATER) (-) UST 1 0 U* IN SIMILARITY THEORY (m s-1) PBLH 1 0 PBL HEIGHT (m) HFX 1 0 UPWARD HEAT FLUX AT THE SURFACE (W m-2) QFX 1 0 UPWARD MOISTURE FLUX AT THE SURFACE (kg m-2 s-1) LH 1 0 LATENT HEAT FLUX AT THE SURFACE (W m-2) ACHFX 1 0 ACCUMULATED UPWARD HEAT FLUX AT THE SURFACE (J m-2) ACLHF 1 0 ACCUMULATED UPWARD LATENT HEAT FLUX AT THE SURFACE (J m-2) SNOWC 1 0 FLAG INDICATING SNOW COVERAGE (1 FOR SNOW COVER) (-)
SR 1 0 fraction of frozen precipitation (-) 固体降水比例
LANDMASK 1 0 LAND MASK (1 FOR LAND, 0 FOR WATER) (-) LAKEMASK 1 0 LAKE MASK (1 FOR LAKE, 0 FOR NON-LAKE) (-) SST 1 0 SEA SURFACE TEMPERATURE (K) SST_INPUT 1 0 SEA SURFACE TEMPERATURE FROM WRFLOWINPUT FILE (K)
pressure 19 0 Model pressure (hPa),就是那十九层的气压,没有用,删掉 height 19 0 Model height (km),台风中心高度低,也就是低压中心,到17层时,该高度已不明显,第十层时充满整个画面 tk 19 0 Temperature (K) tc 19 0 Temperature (C)这两个温度是一样的,就只是单位不一样,且到19层时,台风中心温度低于四周海洋,而在19层以前,台风中心温度高于四周海洋。
Shell 如何定义变量和给变量赋值 https://www.jianshu.com/p/7fd317a45be5
重点是赋值时,等号左右不能有任何空格。将命令的执行结果赋值给变量时,需要在命令两边加 ‘’ 或者 $()
在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。 这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。
以单引号’ ‘包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。
以双引号” “包围变量的值时,输出时会先解析里面的变量和命令。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。
shell数组:
a=(3 6 9 10)
echo ${a[0]}
echo ${a[*]} #print all variable
Shell 和其它编程语言不同,Shell 不能直接进行算数运算,必须使用数学计算命令
b=$((a[0]+1)) # Assign the result of the calc to b, 4
c=$((b+1)) # 5
# (()) only can be used for integer calc
# do not need to use $ in parentheses
若有命名字符变量数组时,
#!/bin/sh
CASENAME[1]=F2000
CASENAME[2]=CAM5
for ni in {1..1}
do
echo "${CASENAME[ni]}"
if [ $ni == 1 ] ; then
# 注意括号及双等号两边都需要有空格,否则运行失败
echo "----------"
fi
done
radiu=(3 6 9 10)
for ra in ${radiu[@]} ; do
echo ${ra}
done
字符串拼接 http://c.biancheng.net/view/1114.html
字符串分割 https://blog.csdn.net/u010003835/article/details/80750003
https://blog.csdn.net/dehailiu/article/details/10479527?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=1328665.18784.16160313276179911&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
路径分割得到路径和文件名 https://blog.csdn.net/Choice_JJ/article/details/8766335
想要在bash脚本中实现交互式运行命令,主要借助输入重定向操作符 « 来实现,举例如下
for nl in {0..2};do
utils/bin/box << EOF
n
y
EOF
mv output.file output.nc
done
# 此处 n 和 y 是传递给 utils/bin/box 的两个参数
Shell中通常将EOF与 « 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。
此处,EOF是一个分界符,在该分界符以后的内容都被当作输入(包括空格),直到shell又看到该分界符(位于单独一行的开头)。这个分界符可以是你所定义的任何字符串。