首先,我是这个论坛的新手,所以请原谅我在这里发帖时犯的任何错误。如果您能指出我的错误,我会很高兴,并且我将确保在发布其他内容时不会重复这些错误。
任务:使用 Python 将 ASCII 数据文件(UCAC 4 Star Catalog)转换为 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 行,位于 整数 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')
最佳答案
一些评论希望对您有所帮助:
在 vic_runoff[ra,spd,:,:]
中,spd
是一个 netCDF4 变量。它不能用作索引器。尝试 vic_runoff[ra,0,:,:] = tempstore[:,:]
看看是否能解决您的问题。
此外,您还应该考虑使用 pandas.read_csv
或 read_table
来读取 ASCII 文件。这里有一篇文章记录了 numpy.loadtxt
最后,如果您选择 pandas 路线,您可以考虑使用 xarray
写入 netCDF。 xarray
可以轻松地将 pandas 转换为 xarray.Dataset
,然后使用快速的 Dataset.to_netcdf()
即可编写整个 netCDF 文件> 打电话。
关于python - 使用 Python 将 ASCII 文件转换为 netCDF(ASCII 文件中的选择性列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35282014/