NetCDF:减去时间步长

问题描述 投票:-2回答:1

我有一个关于特定netCDF文件操作的问题。我不确定如何解决这个问题。

我有一个netCDF文件,有21个时间步长,并包含变量lithk中的厚度数据。

我想从最后一步减去第一个时间步,以获得第一个和最后一个时间步之间的厚度变化。然后我想将这个新计算的数据作为新变量添加回netCDF文件。我已经尝试了很多解决方案,并且无法提出迄今为止有效的解决方案。我真的很感激任何帮助。非常感谢

time netcdf
1个回答
0
投票

我可以在Python中使用netCDF4模块和NumPy提出伪解析(你可能需要修改它以满足你的需要)以防万一。

from netCDF4 import Dataset 
import numpy as np

现在,我将以写入模式打开netCDF文件:

ncin = Dataset(your_file_in, 'a');

然后我会读取数据:

datain = ncin.variables['lithk'][:];ntime=np.size(datain);

现在我们可以计算第一个和最后一个步骤之间的变化:

valout = datain[0] - datain[-1]

您想要将新值写入文件:

ncin.variables['lithk'][ntime+1:ntime+1] = valout;
ncin.close()

请注意,因为我没有您的数据,而且我在没有测试的情况下编写了答案,您可能还需要修改时间变量,并且为了沿时间维度更改数据的数量,它必须是“无限制的”。否则,您只需编写一个新的netCDF文件,将时间维度值更改为22。

我可以提出这样的最后一个例子,我首先在netCDF中创建随机数据集并按照您的意愿进行调整:

import numpy as np
from netCDF4 import Dataset,num2date,date2num
# -----------------------------
ndata=21;
dataout=np.random.random((ndata,));
unout='seconds since 2018-01-01 00:00:00'
# ---------------------
# make data:
ncout=Dataset('test.nc','w','NETCDF3_CLASSIC');
ncout.createDimension('time',None);
ncout.createVariable('time','float64',('time'));ncout.variables['time'].setncattr('units',unout);ncout.variables['time'][:]=np.linspace(0,3600*ndata,ndata);
ncout.createVariable('lithk','float32',('time'));ncout.variables['lithk'][:]=dataout;
ncout.close()
# ----------------------
# modify last value:
ncin = Dataset('test.nc', 'a');
datain = ncin.variables['lithk'][:];ntime=np.size(datain);
valout = datain[0] - datain[-1]
ncin.variables['lithk'][ntime:ntime+1] = valout;
ncin.close()
© www.soinside.com 2019 - 2024. All rights reserved.