使用python的netCDF4庫讀取.nc檔案 和 建立.nc檔案

ckxllf發表於2019-10-06

  使用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) #此時每個變數的資訊為其中一個列表

  如圖:包含經緯度、時間、等變數名稱

  

在這裡插入圖片描述

  看看 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)

  結果如下:

  

在這裡插入圖片描述

  **注意:**完成上述操作之後,記得關掉該檔案

  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等資訊

  

在這裡插入圖片描述

  按照上述方式建立完成後,用一些視覺化軟體開啟,結果如上圖。

  #step3: 建立群組

  如上圖,所以變數都是平行的位置,如果變數特別多,將相同型別的變數放進同一個group中,會更加方便。

  來看一個示例: 無錫婦科醫院排行

  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格式檔案


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2658934/,如需轉載,請註明出處,否則將追究法律責任。

相關文章