这里是一个Python的代码实例,可以实现将两个nc文件按照时间维度整合成一个:
import netCDF4 as nc
# 读取原始nc文件
filename1 = 'file1.nc'
filename2 = 'file2.nc'
nc1 = nc.Dataset(filename1)
nc2 = nc.Dataset(filename2)
# 创建新的nc文件
newnc = nc.Dataset('newfile.nc', 'w')
# 复制第一个文件的变量和维度信息
for name, variable in nc1.variables.items():
if name not in ['time']:
newvar = newnc.createVariable(name, variable.datatype, variable.dimensions)
newvar[:] = variable[:]
else:
# 创建新的时间维度
newdim = newnc.createDimension('time', None)
newvar = newnc.createVariable(name, variable.datatype, ('time',))
newvar.units = variable.units
newvar.calendar = variable.calendar
newvar.axis = variable.axis
# 将第一个文件的时间数据写入新文件
newnc.variables['time'][:] = nc1.variables['time'][:]
# 将第二个文件的变量数据写入新文件
start_time = nc.num2date(nc2.variables['time'][0], nc2.variables['time'].units, nc2.variables['time'].calendar)
time_index = (nc1.variables['time'][:] < start_time).sum()
for name, variable in nc2.variables.items():
if name not in ['time']:
newnc.variables[name][time_index:] = variable[:]
else:
# 将第二个文件的时间数据写入新文件
newnc.variables['time'][time_index:] = variable[:]
# 关闭文件
nc1.close()
nc2.close()
newnc.close()
假设第一个nc文件中的风速变量名是u1和v1,第二个nc文件中的风速变量名是u2和v2,则上面的代码将会把它们整合成一个文件,并命名为newfile.nc。你可以替换变量和文件名,用来适应你的具体场景。
from netCDF4 import Dataset
import csv
import string
import netCDF4 as nf
import datetime
nc = Dataset(r'data/ocean_wave_mask_0.25_1979_2019.nc')
print(nc.variables.keys())
time = nc.variables['time'][:]
# 纬度 latitude
# expver = nc.variables['expver'][:] 79-21nc是三维,没有这个维度
# 经度 longitude
latitude = nc.variables['latitude'][:]
# 风速
longitude = nc.variables['longitude'][:]
lsm = nc.variables['lsm'][:]
mwd = nc.variables['mwd'][:]
mwp = nc.variables['mwp'][:]
swh = nc.variables['swh'][:]
shts = nc.variables['shts'][:]
shww = nc.variables['shww'][:]
#解析出时间
def getDate(time):
arr = nf.num2date(nc.variables['time'][:], 'hours since 1900-01-01 00:00:00.0').data
y = arr[0].year
m = arr[0].month
return "%(year)d-%(month)02d"%{'year':y,'month':m}
print(getDate(time))
now_time1 = datetime.datetime.now()
print(now_time1)
with open(fr'{79-19}.csv', 'a', newline='') as fp:
#字段名
writer = csv.writer(fp, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
# writer.writerow(['time',
# 'Land-sea mask',
# 'Mean wave direction',
# 'Mean wave period',
# 'Significant height of combined wind waves and swell',
# 'Significant height of total swell',
# 'Significant height of wind waves'])
writer.writerow(['time',
'lsm',
'mwd',
'mwp',
'swh',
'shts',
'shww'])
# 输入经纬度的维数
# for i in range(len(time)):
# for j in range(len(expver)):
# for k in range(len(latitude)):
# for r in range(len(longitude)):
# if str(lsm[i][j][k][r]) not in '--':
# if str(mwd[i][j][k][r]) not in '--':
# if str(mwp[i][j][k][r]) not in '--':
# if str(swh[i][j][k][r]) not in '--':
# if str(shts[i][j][k][r]) not in '--':
# if str(shww[i][j][k][r]) not in '--':
# writer.writerow([getDate(time[i]),
# # expver[j],
# # latitude[k],
# # longitude[r],
# lsm[i, j, k, r],
# mwd[i, j, k, r],
# mwp[i, j, k, r],
# swh[i, j, k, r],
# shts[i, j, k, r],
# shww[i, j, k, r]
# ])
for i in range(len(time)):
for k in range(len(latitude)):
for r in range(len(longitude)):
if str(lsm[i][k][r]) not in '--':
if str(mwd[i][k][r]) not in '--':
if str(mwp[i][k][r]) not in '--':
if str(swh[i][k][r]) not in '--':
if str(shts[i][k][r]) not in '--':
if str(shww[i][k][r]) not in '--':
writer.writerow([getDate(time[i]),
# expver[j],
# latitude[k],
# longitude[r],
lsm[i, k, r],
mwd[i, k, r],
mwp[i, k, r],
swh[i, k, r],
shts[i, k, r],
shww[i, k, r]
])
now_time2 = datetime.datetime.now()
print(now_time2)
print('yes')