温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用python的netCDF4库读取.nc文件 和 创建.nc文件

发布时间:2020-08-11 23:25:18 来源:ITPUB博客 阅读:435 作者:ckxllf 栏目:编程语言

  使用python netCDF4库读取.nc文件 和 创建.nc文件

  1. 介绍

  .nc(network Common Data Format)文件是气象上常用的数据格式,python上读取.nc使用较多的库为netCDF4这个库,下面将介绍这个库的具体方法。

  安装很简单:

  pip install netCDF4

  2. .nc文件的读取

  #导入nc库

  import netCDF4 as nc

  filename = '2017-06-15_2017-06-17.nc' # .nc文件名

  f = nc.Dataset(filename) #读取.nc文件,传入f中。此时f包含了该.nc文件的全部信息

  #step1: 查看.nc文件的全部变量,及该变量的全部信息(维度大小,单位等)

  all_vars = f.variables.keys() #获取所有变量名称

  print(len(all_vars)) #长度为18

  all_vars_info = f.variables.items() #获取所有变量信息

  print(type(all_vars_info)) #输出为: odict_items 。这里将其转化为 list列表

  print(len(all_vars_info)) #长度为18

  all_vars_info = list(all_vars_info) #此时每个变量的信息为其中一个列表

  如图:包含经纬度、时间、等变量名称

  

使用python的netCDF4库读取.nc文件 和 创建.nc文件

  看看 all_vars_info的前两个变量的信息,如下,显示了 shape unit name float32 fillvalue等信息

  #step2: 查看.nc文件的单个变量,及该变量的全部信息(维度大小,单位等)

  如果对某个变量感兴趣(已知变量名),想查看这个变量的信息,获取这个变量的数据,方法如下:

  #我们要查看 ’u‘的信息

  var = 'u'

  var_info = f.variables[var] #获取变量信息

  var_data = f[var][:] #获取变量的数据

  print(var_info)

  print(var_data.shape)

  #很方便转化为array数组

  print(type(var_data)) # .nc文件的变量数组都为Masked array

  var_data = np.array(var_data) #转化为np.array数组

  输出如下:

  #step3: 列表形式记录所有变量信息

  ###最直接的办法,获取每个变量的缩写名字,标准名字(long_name),units和shape大小。这样很方便后续操作

  all_vars_name = []

  all_vars_long_name = []

  all_vars_units = []

  all_vars_shape = []

  for key in f1.variables.keys():

  all_vars_name.append(key)

  all_vars_long_name.append(f1.variables[key].long_name)

  all_vars_units.append(f1.variables[key].units)

  all_vars_shape.append(f1.variables[key].shape)

  结果如下:

  

使用python的netCDF4库读取.nc文件 和 创建.nc文件

  **注意:**完成上述操作之后,记得关掉该文件

  f.close() #关闭文件。如果文件关闭后,再使用f.variabels.items()等操作是行不通的。

  3. nc文件的创建

  #step1: 创建一个文件

  f_w = nc.Dataset('hecheng.nc','w',format = 'NETCDF4') #创建一个格式为.nc的,名字为 ‘hecheng.nc’的文件

  #step2: 写入一些基本的信息

  .nc文件的里面的每个变量都有维度信息,比如,上面的 var=‘u’,维度为 1237161*177。这里面的各个维度,并不是随便定义的,是与基础的变量信息相关的。

  如[12,37,161,177] = [time,level,latitude,longitude],第一个维度为时间信息,依次为 垂直层信息,纬度、经度信息。

  所以,我们要先写入一些基本的信息:时间,垂直层,纬度,经度

  #time纬度为12。注意,第2个参数 表示维度,但是必须是 integer整型,也就是只能创建一个基础单一维度信息。

  #如果后面要创建一个变量维度>1,则必须由前面的单一维度组合而来。后面会介绍。

  #确定基础变量的维度信息。相对与坐标系的各个轴(x,y,z)

  f_w.createDimension('time',12)

  f_w.createDimension('level',37)

  f_w.createDimension('lat',161)

  f_w.createDimension('lon',177)

  ##创建变量。参数依次为:‘变量名称’,‘数据类型’,‘基础维度信息’

  f_w.createVariable('time',np.int,('time'))

  f_w.createVariable('level',np.int,('level'))

  f_w.createVariable('lat',np.float32,('lat'))

  f_w.createVariable('lon',np.float32,('lon'))

  #写入变量time的数据。维度必须与定义的一致。

  time = np.array([0,6,12,18,0,6,12,18,0,6,12,18])

  f_w.variables['time'][:] = time

  #新创建一个多维度变量,并写入数据,

  f_w.createVariable( 'u', np.float32, ('time','level','lat','lon'))

  var_data = np.ones(shape=(12,37,161,177), dtype = np.float32)

  f_w.variables[var][:] = var_data

  关闭文件

  f_w.close()

  还可以写入fill_value等信息

  

使用python的netCDF4库读取.nc文件 和 创建.nc文件

  按照上述方式创建完成后,用一些可视化软件打开,结果如上图。

  #step3: 创建群组

  如上图,所以变量都是平行的位置,如果变量特别多,将相同类型的变量放进同一个group中,会更加方便。

  来看一个示例: 无锡妇科医院排行 http://www.0510bhyy.com/

  f_w = nc.Dataset('haha4.nc','w',format = 'NETCDF4')

  f_w.createDimension('time',12)

  f_w.createDimension('level',37)

  f_w.createDimension('lat',161)

  f_w.createDimension('lon',177)

  f_w.createVariable('time',np.int,('time'))

  f_w.createVariable('level',np.int,('level'))

  f_w.createVariable('lat',np.float32,('lat'))

  f_w.createVariable('lon',np.float32,('lon'))

  time = np.array([0,6,12,18,0,6,12,18,0,6,12,18])

  f_w.variables['time'][:] = time

  f_w.variables['level'][:] = level

  f_w.createVariable( 'q', np.float32, ('time','level','lat','lon'))

  var_data = np.ones(shape=(12,37,161,177), dtype = np.float32)

  f_w.variables['q'][:] = var_data

  #创建一个群组,名字为'wind'

  group1 = f_w.createGroup('wind')

  group1.createVariable( 'u', np.float32, ('time','level','lat','lon'))

  var_data = np.ones(shape=(12,37,161,177), dtype = np.float32)

  group1.variables['u'][:] = var_data

  group1.createVariable( 'v', np.float32, ('time','level','lat','lon'))

  var_data = np.zeros(shape=(12,37,161,177), dtype = np.float32)

  group1.variables['v'][:] = var_data

  group1.close # 关闭群组, 注意,这里没有括号

  f_w.close()

  创建结果如下:

  看,group的信息出来了

  **#step4:查看带有group的.nc文件的信息 **

  f1 = nc.Dataset('haha5.nc')

  vars = f1.variables.keys() #odict_keys(['time', 'level', 'lat', 'lon', 'q']) 看不到groups信息

  #通过以下命令

  group_name = f1.groups.keys() #获取组名,输出为:odict_keys(['wind'])

  使用如下命令都能看到group内的变量的信息。

  #获取group内的变量的数据

  group_var_data = f1['wind']['u'][:]

  print(group_var_data.shape) #(12, 37, 161, 177)

  4. 总结

  气象上常用除了.nc文件外,还有 hdf文件,这两者格式都差不多,但是我更爱.hdf格式文件

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI