1、nc文件科普

       NetCDF(.nc)文件可通過多種專業軟件打開,包括Panoply、GIS工具(如ArcGIS/QGIS)、編程語言(Python/R)以及氣象數據處理工具(如ncview、meteoinfo),但普通文本編輯器(如記事本)僅能查看原始代碼無法解析數據。

專業軟件推薦

1.1、Panoply。

       NASA開發的跨平台工具,專用於氣象、海洋等科學數據的可視化,支持NetCDF格式的直接讀取和圖形化展示。官網下載:NASA Panoply。

1.2、GIS軟件。

       ArcGIS:通過Multidimension Tools模塊轉換為柵格圖層。

       QGIS:原生支持.nc文件拖拽打開,支持數據符號化處理。

1.3、編程工具。

       Python:使用netCDF4庫或xarray庫讀取數據。

       R語言:通過ncdf4包處理.nc文件。

1.4、氣象專用工具。

       ncview:輕量級Linux工具,適用於WRF模型輸出的.nc文件。

       meteoinfo:國產開源軟件,支持快速讀取氣象數據。

1.5、其他工具。

       CIMCO Edit:數控編程軟件,適用於工業NC代碼編輯(非氣象數據)。

       HDFView:支持部分NetCDF文件,需配合Java環境使用。

1.6、注意事項

       CAD軟件無法直接打開.nc文件,工業NC代碼文件(如數控加工文件)需專用轉換工具(如諾誠NC轉換器)。

       文本編輯器(記事本/Word)僅顯示二進制代碼,無法解析科學數據內容。

2、編程工具解析(目前採用的是python)

2.1、編碼環境要求

       windows需要安裝hdf5,python環境需要安裝netcdf4庫。

2.1.1、hdf5安裝

       https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.12  下載對應的環境版本安裝即可

2.1.2、hdf5環境變量配置

Python解析nc格式的文件_python

需配置 HDF5_DIR 環境變量

2.1.3、netcdf4 類庫安裝

        這時候只需要安裝編譯好的netcdf4庫的二進制文件即可:
        終端pip安裝

# pip install netcdf4 --prefer-binary

如果是源碼安裝,可能會報錯,一定要留意一下!!!

2.2、python環境安裝小結

Python解析nc格式的文件_python_02

3、python讀取nc文件,並保存csv

廢話不多説,直接上代碼了。

3.1、詳細查看NC文件結構

import netCDF4 as nc
 
def inspect_nc_file(nc_file_path):
    """
    詳細查看NC文件結構
    """
    try:
        with nc.Dataset(nc_file_path, 'r') as nc_file:
            print("=" * 50)
            print("NC文件基本信息:")
            print("=" * 50)
            
            # 文件格式和維度
            print(f"文件格式: {nc_file.data_model}")
            print(f"文件維度: {nc_file.dimensions}")
            print(f"文件變量: {list(nc_file.variables.keys())}")
            
            print("\n" + "=" * 50)
            print("維度詳細信息:")
            print("=" * 50)
            for dim_name, dim in nc_file.dimensions.items():
                print(f"{dim_name}: {len(dim)} 個元素")
            
            print("\n" + "=" * 50)
            print("變量詳細信息:")
            print("=" * 50)
            for var_name, var in nc_file.variables.items():
                print(f"\n變量名: {var_name}")
                print(f"  維度: {var.dimensions}")
                print(f"  形狀: {var.shape}")
                print(f"  數據類型: {var.dtype}")
                print(f"  屬性: {dict(var.__dict__)}")
                
                # 顯示部分數據樣本
                if len(var.shape) <= 2:  # 只顯示低維數據的樣本
                    sample_data = var[:]
                    if hasattr(sample_data, 'flatten'):
                        sample_data = sample_data.flatten()
                    print(f"  數據樣本: {sample_data[:5]}...")  # 顯示前5個值
            
            print("\n" + "=" * 50)
            print("全局屬性:")
            print("=" * 50)
            for attr_name in nc_file.ncattrs():
                print(f"{attr_name}: {getattr(nc_file, attr_name)}")
                
    except Exception as e:
        print(f"錯誤: {e}")
 
# 使用示例
inspect_nc_file('wspd_2024.nc')

3.2、讀取NC文件並保存CSV

注意:需根據3.1代碼的輸出格式,對應的調整讀取與保存代碼。

import netCDF4 as nc
import pandas as pd
import numpy as np
 
def nc_to_csv(nc_file_path, csv_file_path):
    """
    將NC文件轉換為CSV文件
    
    參數:
    nc_file_path: NC文件路徑
    csv_file_path: 輸出的CSV文件路徑
    """
    try:
        # 讀取NC文件
        with nc.Dataset(nc_file_path, 'r') as nc_file:
            # 提取變量數據
            lat = nc_file.variables['lat'][:]
            lon = nc_file.variables['lon'][:]
            data = nc_file.variables['data'][:]
            
            print(f"數據維度: lat={lat.shape}, lon={lon.shape}, data={data.shape}")
            
            # 創建網格座標
            lon_grid, lat_grid = np.meshgrid(lon, lat)
            
            # 展平數據
            df = pd.DataFrame({
                'latitude': lat_grid.flatten(),
                'longitude': lon_grid.flatten(),
                'data_value': data.flatten()
            })
            
            # 保存為CSV
            df.to_csv(csv_file_path, index=False)
            print(f"文件已保存到: {csv_file_path}")
            print(f"共 {len(df)} 行數據")
            
    except Exception as e:
        print(f"錯誤: {e}")
 
# 使用示例
if __name__ == "__main__":
    nc_to_csv('wspd_2024.nc', 'wspd_2024.csv')