Python實現(xiàn)讀取.nc數(shù)據(jù)并提取指定時間與經(jīng)緯度維度對應(yīng)的變量數(shù)值
本文介紹基于Python語言的netCDF4庫,讀取.nc格式的數(shù)據(jù)文件,并提取指定維(時間、經(jīng)度與緯度)下的變量數(shù)據(jù)的方法。
我們之前介紹過.nc格式的數(shù)據(jù),其是NetCDF(Network Common Data Form)文件的擴展名,是一種常用的科學(xué)數(shù)據(jù)存儲格式,多用于存儲科學(xué)和工程領(lǐng)域的大型數(shù)據(jù)集。同時,在我們之前的文章Python批量讀取大量nc格式文件并導(dǎo)出全部時間信息中,就介紹過基于netCDF4庫,對一個文件夾下大量.nc格式數(shù)據(jù)文件的某一維的信息加以提取的方法。而在本文中,我們則是同樣基于netCDF4庫,讀取.nc文件,并提取指定維(Dimensions,也就相當(dāng)于是自變量)下的變量(Variables,也就相當(dāng)于是因變量)的具體數(shù)值。
首先,我們需要配置一下netCDF4庫,具體配置方法大家可以參考文章Anaconda下Python中h5py與netCDF4模塊下載與安裝方法。
隨后,本文所需代碼如下。
# -*- 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]
其中,我們首先導(dǎo)入netCDF4庫,并指定要讀取的.nc格式數(shù)據(jù)文件的路徑nc_path;隨后,使用nc.Dataset()打開這一文件,并將返回的Dataset對象存儲在nc_data變量中;緊接著,通過print()打印nc_data,這將顯示要讀取的.nc格式數(shù)據(jù)文件的基本信息,如變量、維、屬性等——這里具體打印出來的情況如下圖所示。
其中,在上圖我們需要重點關(guān)注紫色框內(nèi)的內(nèi)容。首先,在dimensions中,我們可以看到所有的維;我這里的.nc格式數(shù)據(jù)是一個表示氣象的數(shù)據(jù),所以文件中的維依次就是時間、緯度與經(jīng)度;隨后,在variables中,我們可以看到所有的數(shù)據(jù)變量(這里的數(shù)據(jù)變量是包含了維、變量與其他參數(shù))——其中我們重點觀察數(shù)據(jù)中的因變量(也就是上圖中的swvl1),需要留意一下其后不同維的排序順序,在后面我們按照維提取變量數(shù)據(jù)的時候會用到。
回到前述代碼的介紹中。通過前面print()打印出來的nc_data信息,我們知道了這個.nc數(shù)據(jù)的維,此時我們可以將這幾個維也打印出來看看。例如,time_value = nc_data.variables["time"][:]就表示將時間這個維打印出來,相當(dāng)于獲取了全部的時間節(jié)點。
再接下來,我們即可開始按照維來提取變量。為了方便,我們就以這個.nc文件的時間維中的第一個節(jié)點對應(yīng)的數(shù)據(jù)(也就是第一景數(shù)據(jù))為例來介紹;因此,我們先將time_need設(shè)置為0,表示讀取第一個時間節(jié)點的數(shù)據(jù)。在這里,我們給出了2種按照維來提取變量的需求。
首先,是第一種需求,也就是time_need = 0這一行代碼的下一行。nc_data.variables["swvl1"]表示這個.nc文件中讀取名為swvl1的變量的值,而后面的[time_need, :, :]表示選擇指定時間維下的所有經(jīng)度和緯度位置的值。這些值將被存儲在nc_value_1變量中,也就是說這個nc_value_1變量相當(dāng)于就是當(dāng)前這個.nc文件的第一景數(shù)據(jù)(時間節(jié)點排在第一位的數(shù)據(jù))。
其次,是第二種需求。前面我們提取了指定時間維下的所有經(jīng)度和緯度位置的值,那么現(xiàn)在就更進一步,提取指定時間維度、經(jīng)度維度以及緯度維度的數(shù)據(jù)(相當(dāng)于就是從前面的一景數(shù)據(jù)變成了一個像元的數(shù)據(jù))。首先,我們指定一個處于.nc文件成像范圍內(nèi)的目標經(jīng)度longitude_need和目標緯度latitude_need,并使用argmin()函數(shù)找到目標經(jīng)、緯度值與文件中經(jīng)度、緯度的維數(shù)據(jù)值最接近的索引值——即longitude_nc和latitude_nc。最后,即可使用nc_data.variables["swvl1"][time_need, latitude_nc, longitude_nc]來獲取特定時間、經(jīng)度和緯度位置的值,并將結(jié)果存儲在nc_value_2變量中。
這里提一句——為什么需要用argmin()函數(shù)呢?這個是因為,我們在實際情況中,需要提取指定空間位置的像素時,這個位置的經(jīng)、緯度數(shù)據(jù)肯定是隨機的;而通過argmin()函數(shù),就可以找到.nc文件里面經(jīng)度、緯度所對應(yīng)的維中,與我們實際需要的經(jīng)、緯度最接近的那個數(shù)值所對應(yīng)的維的下標。例如,上述代碼中,我們希望提取實際經(jīng)度為106.467位置處的數(shù)據(jù);而我這里這個.nc文件,其維中的經(jīng)度的分辨率是0.1,那它自然沒有辦法非常精確地確定106.467的位置;所以需要通過argmin()函數(shù),找到與106.467最接近的數(shù)據(jù)106.5,并進一步確定出這個106.5所在的經(jīng)度維的下標,那么就可以提取出指定的變量了。
如下圖所示,我們通過上述第二種需求,提取出來了目標時間、經(jīng)度與緯度維下的一個像素。
那么這個像素值對不對呢?我們可以在ArcGIS中打開這個.nc
文件的第一景數(shù)據(jù),找到代碼中目標經(jīng)、緯度(也就是longitude_need
和latitude_need
所指向的數(shù)據(jù))所對應(yīng)的像元,并查看其像素值;如下圖所示。
可以看到,上圖在ArcGIS提取出來的像素值,與上上圖在Python中提取出來的像素值一致,說明我們的代碼無誤。
至此,大功告成。
到此這篇關(guān)于Python實現(xiàn)讀取.nc數(shù)據(jù)并提取指定時間與經(jīng)緯度維度對應(yīng)的變量數(shù)值的文章就介紹到這了,更多相關(guān)Python讀取.nc數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python基于paramiko庫遠程執(zhí)行 SSH 命令,實現(xiàn) sftp 下載文件
這篇文章主要介紹了python基于paramiko庫遠程執(zhí)行 SSH 命令,實現(xiàn) sftp 下載文件的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03對python中不同模塊(函數(shù)、類、變量)的調(diào)用詳解
今天小編就為大家分享一篇對python中不同模塊(函數(shù)、類、變量)的調(diào)用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07python通過百度地圖API獲取某地址的經(jīng)緯度詳解
這篇文章主要給大家介紹了關(guān)于python通過百度地圖API獲取某地址的經(jīng)緯度的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01python實現(xiàn)逆序輸出一個數(shù)字的示例講解
今天小編就為大家分享一篇python實現(xiàn)逆序輸出一個數(shù)字的示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06