python 用netCDF4读取nc 文件并存入csv中

(本博客仅用作记录研究生生涯的代码学习,如若转载请标记出处)
需求:对nc文件进行读取,并提出其中的经纬度和土壤湿度数据。
nc数据即为专业气象处理数据
首先读取nc文件看看格式,需要用到netCDF4库,netCDF4可直接pip install netCDF4下载即可

from netCDF4 import Dataset
path = '1.nc'
print(Dataset(path).variables.keys())

结果如下,其中latitude,longitude,以及土壤湿度数据SM_subdaily是我们所需要的。

dict_keys(['latitude', 'longitude', 'timeintervals', 'SIGMA_daily', 'SM_daily', 'SM_subdaily', 'SIGMA_subdaily'])

其次,需要把数据提取出来,如下所示:

    lat = nc.variables['latitude'][:]
    lon = nc.variables['longitude'][:]
    SM_sub = nc.variables['SM_subdaily'][:]

最后,把需要使用的数据保存到csv文件中。

    with open('new.csv', 'a', newline='') as fp:  #建立一个新的csv文件
        writer = csv.writer(fp, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        writer.writerow(['SM_subdaily', 'latitude', 'longitude'])
        # 输入经纬度的维数
        for i in range(len(SM_sub)):  # 此处是SM_sub具有4个维度
            for j in range(802):  # 此处的经度长度为802
                for k in range(252): # 此处的纬度长度为252
                    if str(SM_sub[i][j][k]) not in '--':
                        writer.writerow([SM_sub[i, j, k], lat[j, k], lon[j, k]]) # lat和lon具有一样的数据格式

查看数据大小和维度如下:

lat.shape  # Out: (802, 252)
SM_sub.shape  # Out: (4, 802, 252)  
lon.shape  # Out: (802, 252)

土壤湿度数据有4个时间点,因此有4个维度,需求并未要求分成4个sheet表,因此依据时间放一个sheet表内即可。
因此总代码如下:

from netCDF4 import Dataset
import csv
import os

def get_files(path):
    """
    :param path: 原目标文件夹
    :return:数据文件路径
    """
    files = []
    for filepath, dirnames, filenames in os.walk(path):
        for filename in filenames:
            files.append(filename)
    return  files

def readnc(file):
    nc = Dataset(file)
    lat = nc.variables['latitude'][:]
    lon = nc.variables['longitude'][:]
    SM_sub = nc.variables['SM_subdaily'][:]
    return SM_sub,lat,lon

def preservenc(filename,SM_sub,lat,lon):
    with open(filename, 'a', newline='') as fp:
        writer = csv.writer(fp, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        writer.writerow(['SM_subdaily', 'latitude', 'longitude'])
        # 输入经纬度的维数
        for i in range(len(SM_sub)):
            for j in range(802):
                for k in range(252):
                    if str(SM_sub[i][j][k]) not in '--':
                        writer.writerow([SM_sub[i, j, k], lat[j, k], lon[j, k]])

if __name__ == '__main__':
    path = r'xxxxxx'# 此处为自己路径
    filepath = get_files(path)
    for i in range(12):
        print('第'+str(i+1)+'个文件正在处理中')
        data = readnc(filepath[i])
        filename = 'NEW_pre'+str(i+1)+'.csv'
        preservenc(filename,SM_sub=data[0],lat=data[1],lon=data[2])
        print('第' + str(i+1) + '处理结束')
    print('运算完成')

打开一个csv文件查看结果如下:
python 用netCDF4读取nc 文件并存入csv中_第1张图片
结果正确

总结:保存csv多个sheet表文件我不会了,欢迎大家交流,即把土壤数据依据每个维度存放在一个csv文件的不同sheet中,这如何实现。

你可能感兴趣的:(python)