【问题标题】:NetCDF: subtracting time stepsNetCDF:减去时间步长
【发布时间】:2019-02-19 14:42:36
【问题描述】:

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

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

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

【问题讨论】:

  • 请提供一些信息,说明您尝试了哪些方法,哪些方法无效。
  • 您使用什么工具来处理 netCDF 文件?

标签: time netcdf


【解决方案1】:

我可以在 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()

【讨论】:

  • 非常感谢。这是肯定要走的路。当我尝试将新值写入文件时出现 ValueError。 ValueError:无法将大小为 194449 的数组重新整形为形状 (0,577,337)。有什么建议?谢谢!
  • @Gernika:我假设根据您的尺寸,您有厚度的 2D 字段(实际上也是 3D 时间)?否则我不知道为什么是3维。然而,由于错误是“无法重塑 ...(0,577,337)”,这意味着第一个维度上没有数据。你能检查/显示结果ncdump -h your_inputfile 吗?
  • 谢谢!维度:时间=无限; // (目前 21 个) y = 577 ; x = 337 ;变量:float lithk(time, y, x) ; lithk:_FillValue = 9.96921e+36f ; lithk:grid_mapping = "Polar_Stereographic" ; lithk:standard_name = "land_ice_thickness" ; lithk:units = "m" ;
  • @Gernika:在我的示例代码中,我发现索引有一个错误。有ncin.variables['lithk'][ntime+1:ntime+1] = valout,而它应该是ncin.variables['lithk'][ntime:ntime+1] = valout。你还可以展示你的代码,你是如何编写输出的。
  • 非常感谢!这似乎运行没有错误。我试图用 data = ncfile.createVariable('valout','float32',('time')) 将这个差异写成一个新变量。我可以将它写为一个新的 netcdf 文件,然后将它与原始文件合并,这样原始厚度和计算出的厚度都在同一个文件中。我打算为此使用 NCO 的 ncks。但是,当我这样做并使用 ncdump 检查文件时,没有任何值。
猜你喜欢
  • 2021-11-06
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多