【问题标题】:copy netcdf file using python使用python复制netcdf文件
【发布时间】:2012-12-05 20:54:39
【问题描述】:

我想使用 Python 制作 netcdf 文件的副本。

有很好的例子说明如何读取或写入 netcdf 文件,但也许还有一个很好的方法是如何将变量输入然后输出到另一个文件。

一个简单的方法会很好,以便以最低的成本将维度和维度变量获取到输出文件。

【问题讨论】:

  • 我正在尝试使用模块 netCDF4。
  • 不,我的意思是您尝试解决这个问题的方法是什么?在发布此内容之前,您做了哪些研究?
  • 我尝试在 stackoverflow 和网络中找到解决方案。
  • 那是怎么回事?这里的人不会只为你工作。你需要在你的问题中准确地展示你为了让它工作而尝试了哪些代码或方法。在来这里寻求帮助之前,您需要向我们表明您已经用尽了所有选择。

标签: python netcdf


【解决方案1】:

如果您使用的是 Linux 或 macOS,则可以使用 nctoolkit (https://nctoolkit.readthedocs.io/en/latest/installing.html) 轻松实现。

import nctoolkit as nc
data = nc.open_data("infile.nc")
data.to_nc("outfile.nc")

【讨论】:

    【解决方案2】:

    自从我发现xarray 以来,这一直是我所有与 python+netCDF 相关的首选工具

    您可以轻松复制一个 netcdf 文件,例如:

    import xarray as xr
    
    input = xr.open_dataset('ncfile.nc')
    input.to_netcdf('copy_of_ncfile.nc')
    

    【讨论】:

      【解决方案3】:

      我在python netcdf: making a copy of all variables and attributes but one 找到了这个问题的答案,但我需要更改它以使用我的python/netCDF4 版本(Python 2.7.6/1.0.4)。如果您需要添加或减少元素,您将进行适当的修改。

      import netCDF4 as nc
      
      def create_file_from_source(src_file, trg_file):
          src = nc.Dataset(src_file)
          trg = nc.Dataset(trg_file, mode='w')
      
          # Create the dimensions of the file
          for name, dim in src.dimensions.items():
              trg.createDimension(name, len(dim) if not dim.isunlimited() else None)
      
          # Copy the global attributes
          trg.setncatts({a:src.getncattr(a) for a in src.ncattrs()})
      
          # Create the variables in the file
          for name, var in src.variables.items():
              trg.createVariable(name, var.dtype, var.dimensions)
      
              # Copy the variable attributes
              trg.variables[name].setncatts({a:var.getncattr(a) for a in var.ncattrs()})
      
              # Copy the variables values (as 'f4' eventually)
              trg.variables[name][:] = src.variables[name][:]
      
          # Save the file
          trg.close()
      
      create_file_from_source('in.nc', 'out.nc')
      

      这个sn-p已经过测试了。

      【讨论】:

        【解决方案4】:

        如果您只想使用netCDF-4 API 来复制任何 netCDF-4 文件,即使是那些使用任意用户定义类型的变量,这是一个难题。例如,netcdf4-python.googlecode.com 上的 netCDF4 模块目前缺乏对具有可变长度成员或复合基类型的可变长度类型的复合类型的支持。

        netCDF-4 C 发行版中提供的 nccopy 实用程序表明,仅使用 C netCDF-4 API 即可复制任意 netCDF-4 文件,但这是因为 C API 完全支持 netCDF-4 数据模型。如果您将目标限制为复制仅使用 googlecode 模块支持的平面类型的 netCDF-4 文件,则 nccopy.c 中使用的算法应该可以正常工作,并且应该非常适合 Python 中更优雅的实现。

        一个不那么雄心勃勃但更容易的项目是一个 Python 程序,它可以复制任何 netCDF“经典格式”文件,因为 netCDF-3 支持的经典模型没有用户定义的类型或递归类型。该程序甚至适用于同样使用压缩和分块等性能特性的 netCDF-4 经典模型文件。

        【讨论】:

          【解决方案5】:

          参见How do I copy a file in python?:netcdf 文件与任何其他文件没有什么不同,因此它应该满足您的需求

          【讨论】:

          • OP 想要从一种格式的格式复制到另一种格式,这与文件的副本非常不同。更不用说 OpenDAP ...
          • @EliS OP 指定他需要一种简单 方式来复制(而不是压缩、分块、转换)netcdf file 不是 OpenDAP 网址。其他一切都只是猜测。
          猜你喜欢
          • 2016-03-25
          • 2013-12-18
          • 2018-12-31
          • 2016-11-08
          • 2018-05-10
          • 2016-04-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多