【问题标题】:Convert ASCII File to netCDF using Python (selective columns from ASCII file)使用 Python 将 ASCII 文件转换为 netCDF(来自 ASCII 文件的选择性列)
【发布时间】:2016-05-18 20:17:59
【问题描述】:

首先我是这个论坛的新手,所以请原谅我在这里发帖时所犯的任何错误。如果您能指出我的错误,我会很高兴,并且我会确保在发布其他任何内容时不会重复它们。

任务:使用 Python 将 ASCII 数据文件(UCAC 4 星目录)转换为 netCDF 格式。只将一些固定数量的列从 ASCII 文件输出到 netCDF 文件。

问题: 回溯(最近一次通话最后): 文件“D:\Work 1\FINAL\New Try\txt2nc.py”,第 51 行,在 vic_runoff[ra,spd,:,:] = 输出; 文件“netCDF4.pyx”,第 2821 行,在 netCDF4.Variable.setitem 中 (netCDF4.c:35204) 文件“C:\Python27\lib\site-packages\netCDF4_utils.py”,第 187 行,在 _StartCountStride ee = 范围(开始、停止、步骤) 文件“C:\Python27\lib\site-packages\numpy\ma\core.py”,第 4102 行,在 int raise MaskError('无法将掩码元素转换为 Python int。') MaskError:无法将被屏蔽的元素转换为 Python int。**

提前致谢。任何帮助表示赞赏!

    from __future__ import division
    from netCDF4 import Dataset
    import numpy as np
    import os

    PATH = 'D:\\Internship Work 1\\Alok Data\\ASCII'
    LL = np.loadtxt('%s\\4uc001.txt' %PATH, delimiter='|', usecols = 
     (0,1,2,3), skiprows=0);
    LL = LL[:,:]

    # NC file setup
    root_grp = Dataset('%s\\4uc001.nc' %PATH, 'w', format='NETCDF4')
    root_grp.description = 'Star Catalog UCAC Data'

    # dimensions
    ra = root_grp.createDimension('ra', 32)
    spd = root_grp.createDimension('spd', 80)
    magm = root_grp.createDimension('magm', 96)
    maga = root_grp.createDimension('maga', 120)


    # variables
    ra = root_grp.createVariable('ra', np.byte, ('ra',))
    spd = root_grp.createVariable('spd', np.byte, ('spd',))
    magm = root_grp.createVariable('magm', np.byte, ('magm'),)
    maga = root_grp.createVariable('maga', np.byte, ('maga'),)
    vic_runoff = root_grp.createVariable('vic_runoff', np.byte, ('ra',
     'spd', 'magm', 'maga',))

    ra.units = 'mas'
    spd.units = 'mas'
    magm.units = 'millimag'
    maga.units = 'millimag'

    for ra in enumerate(ra):
      tempstore = np.zeros((206,4),int)


    output_filename = 'D:\\Internship Work 1\\Alok Data\\ASCII\\4uc001.txt'

    output = np.loadtxt(output_filename,delimiter='|',usecols = (0,1,2,3))

    tempstore[:,:] = output # ensembles x months
    vic_runoff[ra,spd,:,:] = tempstore[:,:] # write all ensembles to netcdf

    print('work done')

【问题讨论】:

    标签: python numpy ascii netcdf


    【解决方案1】:

    一些希望对您有所帮助的 cmets:

    vic_runoff[ra,spd,:,:] 中,spd 是一个 netCDF4 变量。它不能用作索引器。试试vic_runoff[ra,0,:,:] = tempstore[:,:] 看看是否能解决您的问题。

    另外,您应该考虑使用pandas.read_csvread_table 来读取您的ASCII 文件。这里有一个 SO 帖子记录了 numpy.loadtxt 的性能改进

    最后,如果你走 pandas 路线,你可以考虑使用xarray 写入 netCDF。 xarray 可以轻松地让您从 pandas 转换为 xarray.Dataset,然后您的整个 netCDF 文件都是通过快速的 Dataset.to_netcdf() 调用编写的。

    【讨论】:

    • 感谢您的帮助!我一定会尝试让你知道
    • 非常感谢!我尝试使用 pandasxarray 并且它现在可以工作了,我会尽快在这里为其他人发布解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多