您好,登錄后才能下訂單哦!
使用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中,會更加方便。
來看一個示例: 無錫婦科醫院排行 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格式文件
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。