Python讀取不同.nc文件并列出所包含的全部時間節(jié)點

??本文介紹基于Python語言,逐一讀取大量.nc格式的多時相柵格文件,導出其中所具有的全部時間信息的方法。

??.ncNetCDF(Network Common Data Form)文件的擴展名,表示一種常用的科學數據存儲格式。NetCDF是一種自描述的、可移植的二進制文件格式,用于存儲科學和工程領域的大型數據集;由于其自身的特性,.nc數據被廣泛應用于氣象學、海洋學、地球科學、氣候研究、大氣科學、地理信息系統(tǒng)等領域。

??首先,明確一下本文的需求?,F在有一個文件夾,其中具有大量的.nc格式的柵格文件,如下圖所示。

??其中,每一個.nc格式的文件都具有多個時相(或者說是多個維度),而不僅僅只是一個時相。我們希望,讀取這個文件夾中的全部.nc格式文件,并獲取其所表示的每一個時相。

??明確了需求后,我們就可以開始具體的操作。首先,本文所需用到的代碼如下。

# -*- 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)

??這段代碼整體思路也很明確。

??首先,我們導入所需的模塊。在這里,需要導入Pythonos模塊,用于處理文件和文件夾路徑操作;同時導入netCDF4庫,并接著從netCDF4庫中導入Dataset類,用于打開和讀取.nc文件。在這里,如果需要配置netCDF4庫,大家可以參考文章Python模塊h5py與netCDF4在Anaconda環(huán)境的下載與安裝http://www.itdecent.cn/p/4f78fb3151d6)。

??接下來,我們定義了一個名為list_nc_dates的函數,接受一個文件夾路徑作為參數。在函數中,首先創(chuàng)建一個空列表nc_dates,用于存儲每個.nc文件及其對應的日期列表;隨后,使用os.listdir()函數遍歷文件夾中的所有文件,通過檢查文件名是否以.nc結尾來篩選出.nc文件。緊接著,對于篩選出來的.nc文件,使用os.path.join()函數構建其完整路徑。

??其次,使用Dataset類打開.nc文件,并將打開的文件對象賦值給dataset變量;隨后,獲取.nc文件的時間,在本文的.nc數據中,也就是名為time的變量,并將時間變量的值讀取到time_values變量中。接下來,分別獲取時間變量的單位與時間類型。

??隨后,我們創(chuàng)建一個空列表dates,用于存儲日期字符串。遍歷時間變量的每個值,使用netCDF4.num2date()函數將時間值轉換為日期對象。緊接著,將日期對象轉換為指定格式的字符串,并將其添加到dates列表中。此外,這里還將.nc文件名和對應的日期列表作為元組添加到nc_dates列表中,方便我們后期對日期的核對。函數的最后,返回包含每個.nc文件及其對應日期的列表。

??在函數外部,我們設置文件夾路徑,隨后即可調用list_nc_dates函數,將文件夾路徑傳遞給它,并將返回的結果賦值給nc_dates變量。最后,通過循環(huán),打印每個日期即可。

??執(zhí)行上述代碼,即可出現如下圖所示的結果(結果很長,就截取一部分)。由于在本文中,每一個.nc格式文件的每一個維度(即每一個時相)都是精確到天的,所以下圖天數后的時、分、秒都是00。當然,如果大家的.nc格式文件維度很多,時相打印出來的話也不好完全顯示,所以可以考慮將時間信息導出為表格文件等;例如,可以將每一個date都放在DataFrame中,隨后導出為.csv文件。

??至此,大功告成。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容