基于Python實(shí)現(xiàn)批量讀取大量nc格式文件并導(dǎo)出全部時(shí)間信息
本文介紹基于Python語言,逐一讀取大量.nc格式的多時(shí)相柵格文件,導(dǎo)出其中所具有的全部時(shí)間信息的方法。
.nc是NetCDF(Network Common Data Form)文件的擴(kuò)展名,表示一種常用的科學(xué)數(shù)據(jù)存儲(chǔ)格式。NetCDF是一種自描述的、可移植的二進(jìn)制文件格式,用于存儲(chǔ)科學(xué)和工程領(lǐng)域的大型數(shù)據(jù)集;由于其自身的特性,.nc數(shù)據(jù)被廣泛應(yīng)用于氣象學(xué)、海洋學(xué)、地球科學(xué)、氣候研究、大氣科學(xué)、地理信息系統(tǒng)等領(lǐng)域。
首先,明確一下本文的需求?,F(xiàn)在有一個(gè)文件夾,其中具有大量的.nc格式的柵格文件,如下圖所示。
其中,每一個(gè).nc
格式的文件都具有多個(gè)時(shí)相(或者說是多個(gè)維度),而不僅僅只是一個(gè)時(shí)相。我們希望,讀取這個(gè)文件夾中的全部.nc
格式文件,并獲取其所表示的每一個(gè)時(shí)相。
明確了需求后,我們就可以開始具體的操作。首先,本文所需用到的代碼如下。
# -*- coding: utf-8 -*- """ Created on Sun Dec 31 20:28:03 2023 @author: fkxxgis """ import os import netCDF4 from netCDF4 import Dataset def list_nc_dates(folder_path): nc_dates = [] for file_name in os.listdir(folder_path): if file_name.endswith(".nc"): file_path = os.path.join(folder_path, file_name) try: dataset = Dataset(file_path) time_var = dataset.variables["time"] time_values = time_var[:] time_units = time_var.units time_calendar = time_var.calendar dates = [] for value in time_values: date = netCDF4.num2date(value, units=time_units, calendar=time_calendar) dates.append(date.strftime("%Y-%m-%d %H:%M:%S")) nc_dates.append((file_name, dates)) except Exception as e: print(f"Error reading file {file_name}: {str(e)}") return nc_dates folder_path = "F:/Data_Reflectance_Rec/soil_1" nc_dates = list_nc_dates(folder_path) for nc_file, dates in nc_dates: for date in dates: print(date)
這段代碼整體思路也很明確。
首先,我們導(dǎo)入所需的模塊。在這里,需要導(dǎo)入Python的os模塊,用于處理文件和文件夾路徑操作;同時(shí)導(dǎo)入netCDF4庫,并接著從netCDF4庫中導(dǎo)入Dataset類,用于打開和讀取.nc文件。在這里,如果需要配置netCDF4庫,大家可以參考文章Anaconda下Python中h5py與netCDF4模塊下載與安裝方法。
接下來,我們定義了一個(gè)名為list_nc_dates的函數(shù),接受一個(gè)文件夾路徑作為參數(shù)。在函數(shù)中,首先創(chuàng)建一個(gè)空列表nc_dates,用于存儲(chǔ)每個(gè).nc文件及其對應(yīng)的日期列表;隨后,使用os.listdir()函數(shù)遍歷文件夾中的所有文件,通過檢查文件名是否以.nc結(jié)尾來篩選出.nc文件。緊接著,對于篩選出來的.nc文件,使用os.path.join()函數(shù)構(gòu)建其完整路徑。
其次,使用Dataset類打開.nc文件,并將打開的文件對象賦值給dataset變量;隨后,獲取.nc文件的時(shí)間,在本文的.nc數(shù)據(jù)中,也就是名為time的變量,并將時(shí)間變量的值讀取到time_values變量中。接下來,分別獲取時(shí)間變量的單位與時(shí)間類型。
隨后,我們創(chuàng)建一個(gè)空列表dates,用于存儲(chǔ)日期字符串。遍歷時(shí)間變量的每個(gè)值,使用netCDF4.num2date()函數(shù)將時(shí)間值轉(zhuǎn)換為日期對象。緊接著,將日期對象轉(zhuǎn)換為指定格式的字符串,并將其添加到dates列表中。此外,這里還將.nc文件名和對應(yīng)的日期列表作為元組添加到nc_dates列表中,方便我們后期對日期的核對。函數(shù)的最后,返回包含每個(gè).nc文件及其對應(yīng)日期的列表。
在函數(shù)外部,我們設(shè)置文件夾路徑,隨后即可調(diào)用list_nc_dates函數(shù),將文件夾路徑傳遞給它,并將返回的結(jié)果賦值給nc_dates變量。最后,通過循環(huán),打印每個(gè)日期即可。
執(zhí)行上述代碼,即可出現(xiàn)如下圖所示的結(jié)果(結(jié)果很長,就截取一部分)。由于在本文中,每一個(gè).nc格式文件的每一個(gè)維度(即每一個(gè)時(shí)相)都是精確到天的,所以下圖天數(shù)后的時(shí)、分、秒都是00。當(dāng)然,如果大家的.nc格式文件維度很多,時(shí)相打印出來的話也不好完全顯示,所以可以考慮將時(shí)間信息導(dǎo)出為表格文件等;例如,可以將每一個(gè)date都放在DataFrame中,隨后導(dǎo)出為.csv文件。
至此,大功告成。
到此這篇關(guān)于基于Python實(shí)現(xiàn)批量讀取大量nc格式文件并導(dǎo)出全部時(shí)間信息的文章就介紹到這了,更多相關(guān)Python讀取nc格式文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?sklearn預(yù)測評估指標(biāo)混淆矩陣計(jì)算示例詳解
這篇文章主要為大家介紹了Python?sklearn預(yù)測評估指標(biāo)混淆矩陣計(jì)算示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Python使用PyPDF2庫實(shí)現(xiàn)向PDF文件中插入內(nèi)容
Python的PyPDF2庫是一個(gè)強(qiáng)大的工具,它允許我們方便地操作PDF文件,包括合并、拆分、旋轉(zhuǎn)頁面等操作,下面我們就來看看如何使用PyPDF2庫實(shí)現(xiàn)向PDF文件中插入內(nèi)容吧2024-04-04使用Tensorflow將自己的數(shù)據(jù)分割成batch訓(xùn)練實(shí)例
今天小編就為大家分享一篇使用Tensorflow將自己的數(shù)據(jù)分割成batch訓(xùn)練實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01使用python計(jì)算方差方式——pandas.series.std()
這篇文章主要介紹了使用python計(jì)算方差方式——pandas.series.std(),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解內(nèi)容,需要的朋友們可以參考下。2020-08-08Python使用Selenium實(shí)現(xiàn)按文本查找元素
本文我們將通過示例為大家詳細(xì)介紹如何在Python中使用selenium通過文本查找元素的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2023-11-11