使用python的netCDF4庫讀取.nc檔案 和 建立.nc檔案
使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- nc複製檔案
- linux大檔案上傳(nc)Linux
- 【python】建立,讀取檔案Python
- python檔案建立、讀取和寫入Python
- python讀取檔案——python讀取和儲存mat檔案Python
- NC65如何匯出補丁(jar檔案)JAR
- 檔案上傳字元截斷與NC提交技巧字元
- 建立與讀取.ini檔案
- apache---poi讀取和建立excel檔案ApacheExcel
- python讀取和生成excel檔案PythonExcel
- python-geopandas讀取、建立shapefile檔案Python
- 如何用java DOM 在一xml檔案里加像 《!DOCTYPE和《!ELEMENTT @Nc呢JavaXML
- 使用 Python 讀取 8 GB 大小的檔案Python
- python小白檔案讀取Python
- python讀取大檔案Python
- python 讀取csv檔案Python
- python 讀取文字檔案Python
- Python之檔案讀取和寫入Python
- python 使用字典讀取CSV檔案Python
- 使用openpyxl庫讀取Excel檔案資料Excel
- C#讀取文字檔案和寫文字檔案C#
- 使用Python讀取PlantUML匯出的XMI檔案Python
- python如何讀取大檔案Python
- Python -讀取,儲存檔案Python
- 【Python標準庫:fileinput】優雅的讀取檔案Python
- python中xlrd庫如何實現檔案讀取?Python
- csv檔案的寫入和讀取
- VBA建立文字檔案、讀寫文字檔案
- Java中的獲取檔案的物理絕對路徑,和讀取檔案Java
- python讀取yaml配置檔案的方法PythonYAML
- Git使用教程2:版本庫的建立和新增檔案Git
- 使用yaml檔案讀取資料YAML
- Java 讀取檔案Java
- tiff檔案讀取
- 任意檔案讀取
- Java 檔案處理完全指南:建立、讀取、寫入和刪除檔案詳細解析Java
- python怎麼讀取配置檔案Python
- Python 讀取HDF5檔案Python