(本博客仅用作记录研究生生涯的代码学习,如若转载请标记出处)
需求:对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多个sheet表文件我不会了,欢迎大家交流,即把土壤数据依据每个维度存放在一个csv文件的不同sheet中,这如何实现。