??本文介紹基于Python語言的netCDF4
庫,讀取.nc
格式的數(shù)據(jù)文件,并提取指定維(時間、經度與緯度)下的變量數(shù)據(jù)的方法。
??我們之前介紹過.nc
格式的數(shù)據(jù),其是NetCDF
(Network Common Data Form)文件的擴展名,是一種常用的科學數(shù)據(jù)存儲格式,多用于存儲科學和工程領域的大型數(shù)據(jù)集。同時,在我們之前的文章Python批量讀取大量nc格式文件并導出全部時間信息(https://blog.csdn.net/zhebushibiaoshifu/article/details/135331417)中,就介紹過基于netCDF4
庫,對一個文件夾下大量.nc
格式數(shù)據(jù)文件的某一維的信息加以提取的方法。而在本文中,我們則是同樣基于netCDF4
庫,讀取.nc
文件,并提取指定維(Dimensions,也就相當于是自變量)下的變量(Variables,也就相當于是因變量)的具體數(shù)值。
??首先,我們需要配置一下netCDF4
庫,具體配置方法大家可以參考文章Anaconda下Python中h5py與netCDF4模塊下載與安裝方法(https://blog.csdn.net/zhebushibiaoshifu/article/details/120553597)。
??隨后,本文所需代碼如下。
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 22 21:41:52 2024
@author: fkxxgis
"""
import netCDF4 as nc
nc_path = r"F:\Data_Reflectance_Rec\soil_1\2020_01.nc"
nc_data = nc.Dataset(nc_path)
print(nc_data)
time_value = nc_data.variables["time"][:]
longitude_value = nc_data.variables["lon"][:]
latitude_value = nc_data.variables["lat"][:]
# 第一種需求
time_need = 0
nc_value_1 = nc_data.variables["swvl1"][time_need, : , : ]
# 第二種需求
longitude_need = 106.467
latitude_need = 36.817
longitude_nc = (abs(longitude_value - longitude_need)).argmin()
latitude_nc = (abs(latitude_value - latitude_need)).argmin()
nc_value_2 = nc_data.variables["swvl1"][time_need, latitude_nc, longitude_nc]
??其中,我們首先導入netCDF4
庫,并指定要讀取的.nc
格式數(shù)據(jù)文件的路徑nc_path
;隨后,使用nc.Dataset()
打開這一文件,并將返回的Dataset
對象存儲在nc_data
變量中;緊接著,通過print()
打印nc_data
,這將顯示要讀取的.nc
格式數(shù)據(jù)文件的基本信息,如變量、維、屬性等——這里具體打印出來的情況如下圖所示。
??其中,在上圖我們需要重點關注紫色框內的內容。首先,在dimensions
中,我們可以看到所有的維;我這里的.nc
格式數(shù)據(jù)是一個表示氣象的數(shù)據(jù),所以文件中的維依次就是時間、緯度與經度;隨后,在variables
中,我們可以看到所有的數(shù)據(jù)變量(這里的數(shù)據(jù)變量是包含了維、變量與其他參數(shù))——其中我們重點觀察數(shù)據(jù)中的因變量(也就是上圖中的swvl1
),需要留意一下其后不同維的排序順序,在后面我們按照維提取變量數(shù)據(jù)的時候會用到。
??回到前述代碼的介紹中。通過前面print()
打印出來的nc_data
信息,我們知道了這個.nc
數(shù)據(jù)的維,此時我們可以將這幾個維也打印出來看看。例如,time_value = nc_data.variables["time"][:]
就表示將時間這個維打印出來,相當于獲取了全部的時間節(jié)點。
??再接下來,我們即可開始按照維來提取變量。為了方便,我們就以這個.nc
文件的時間維中的第一個節(jié)點對應的數(shù)據(jù)(也就是第一景數(shù)據(jù))為例來介紹;因此,我們先將time_need
設置為0
,表示讀取第一個時間節(jié)點的數(shù)據(jù)。在這里,我們給出了2
種按照維來提取變量的需求。
??首先,是第一種需求,也就是time_need = 0
這一行代碼的下一行。nc_data.variables["swvl1"]
表示這個.nc
文件中讀取名為swvl1
的變量的值,而后面的[time_need, :, :]
表示選擇指定時間維下的所有經度和緯度位置的值。這些值將被存儲在nc_value_1
變量中,也就是說這個nc_value_1
變量相當于就是當前這個.nc
文件的第一景數(shù)據(jù)(時間節(jié)點排在第一位的數(shù)據(jù))。
??其次,是第二種需求。前面我們提取了指定時間維下的所有經度和緯度位置的值,那么現(xiàn)在就更進一步,提取指定時間維度、經度維度以及緯度維度的數(shù)據(jù)(相當于就是從前面的一景數(shù)據(jù)變成了一個像元的數(shù)據(jù))。首先,我們指定一個處于.nc
文件成像范圍內的目標經度longitude_need
和目標緯度latitude_need
,并使用argmin()
函數(shù)找到目標經、緯度值與文件中經度、緯度的維數(shù)據(jù)值最接近的索引值——即longitude_nc
和latitude_nc
。最后,即可使用nc_data.variables["swvl1"][time_need, latitude_nc, longitude_nc]
來獲取特定時間、經度和緯度位置的值,并將結果存儲在nc_value_2
變量中。
??這里提一句——為什么需要用argmin()
函數(shù)呢?這個是因為,我們在實際情況中,需要提取指定空間位置的像素時,這個位置的經、緯度數(shù)據(jù)肯定是隨機的;而通過argmin()
函數(shù),就可以找到.nc
文件里面經度、緯度所對應的維中,與我們實際需要的經、緯度最接近的那個數(shù)值所對應的維的下標。例如,上述代碼中,我們希望提取實際經度為106.467
位置處的數(shù)據(jù);而我這里這個.nc
文件,其維中的經度的分辨率是0.1
,那它自然沒有辦法非常精確地確定106.467
的位置;所以需要通過argmin()
函數(shù),找到與106.467
最接近的數(shù)據(jù)106.5
,并進一步確定出這個106.5
所在的經度維的下標,那么就可以提取出指定的變量了。
??如下圖所示,我們通過上述第二種需求,提取出來了目標時間、經度與緯度維下的一個像素。
??那么這個像素值對不對呢?我們可以在ArcGIS中打開這個.nc
文件的第一景數(shù)據(jù),找到代碼中目標經、緯度(也就是longitude_need
和latitude_need
所指向的數(shù)據(jù))所對應的像元,并查看其像素值;如下圖所示。
??可以看到,上圖在ArcGIS提取出來的像素值,與上上圖在Python中提取出來的像素值一致,說明我們的代碼無誤。
??至此,大功告成。文章來源:http://www.zghlxwxcb.cn/news/detail-837256.html
歡迎關注:瘋狂學習GIS文章來源地址http://www.zghlxwxcb.cn/news/detail-837256.html
到了這里,關于Python讀取.nc數(shù)據(jù)并提取指定時間、經緯度維度對應的變量數(shù)值的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!