Xray не может загрузить данные ascii в файл netcdf

Я использую библиотеку xray python для добавления всех данных из файла ascii в файл netcdf. Файл ascii содержит данные для каждой ячейки с шагом 0,25 градуса на Земле.

Я могу создать все размеры широты и долготы, но не могу добавить данные. Файл ascii находится здесь: https://www.dropbox.com/s/lybu6yvm4ph7pcr/tmp.txt?dl=0

Может ли кто-нибудь диагностировать код и посмотреть, что происходит не так?

import numpy, os, pdb, errno, sys, xray

NUM_LATS = 180.0
NUM_LONS = 360.0

inp_dir  = 'C:\\Input\\'
out_dir  = 'C:\\Output\\nc\\'

def make_dir_if_missing(d):
    try:
        os.makedirs(d)
    except OSError as exception:
        if exception.errno != errno.EEXIST:
            raise

make_dir_if_missing(out_dir)

# Read ASCII File
fl_name  = inp_dir+'tmp.txt'
ascii_fl = numpy.loadtxt(fl_name, delimiter=' ')

# Compute dimensions of nc file based on # rows/cols in ascii file
fl_res   = NUM_LATS/ascii_fl.shape[0]
if fl_res != NUM_LONS/ascii_fl.shape[1]:
    print 'Incorrect dimensions in ascii file'
    sys.exit(0)

lon = numpy.arange(0.5, 360.5, fl_res)
lat = numpy.arange(-90.5, 89.5, fl_res)

lons, lats = numpy.meshgrid(lon,lat)

d = {}
d['latitudes'] = ('latitudes',lat)
d['longitudes'] = ('longitudes', lon)
d['data'] = (['latitudes','longitudes'], ascii_fl)
dset = xray.Dataset(d)
dset
out_nc   = out_dir+os.path.basename(inp_dir+'tmp.txt')[:-4]+'.nc'

dset.to_netcdf(out_nc)

person user308827    schedule 26.07.2015    source источник
comment
Привет AF7, это не идентичные вопросы. Один использует библиотеку netCDF4, а другой использует библиотеку xray. Код в обоих совершенно разный   -  person user308827    schedule 26.07.2015
comment
Можете ли вы описать, где на самом деле возникает проблема, вы получаете какие-либо ошибки или это просто неверный вывод? Также, глядя на код, я не совсем понимаю, как xray разделяет координаты и переменные, если они просто находятся в одном словаре?   -  person kakk11    schedule 28.07.2015


Ответы (1)


Используя более чистую форму представленной вами логики, я смог загрузить ваши данные ascii и сохранить их в файле netCDF следующим образом:

import numpy as np
import xray

# This was logic from the OP
NUM_LATS = 180.0
NUM_LONS = 360.0

ascii_data = np.loadtxt('tmp.txt', delimiter=' ')

fl_res = NUM_LATS / ascii_data.shape[0]

if fl_res != NUM_LONS / ascii_data.shape[1]:
    raise ValueError('Incorrect dimensions in ascii file')

lon = np.arange(0.5, 360.5, fl_res)
lat = np.arange(-90.5, 89.5, fl_res)

# Create an empty Dataset
ds = xray.Dataset()
# Add coordinate variables
ds['lon'] = ('lon', lon)
ds['lat'] = ('lat', lat)
# Add data (coordinates are automatically mapped)
ds['ascii_data'] = (('lat', 'lon'), ascii_data)

# Write to a netcdf
ds.to_netcdf('tmp.nc')

Это возвращает новый файл netCDF в следующем формате:

ncdump -h tmp.nc
netcdf tmp {
dimensions:
    lat = 720 ;
    lon = 1440 ;
variables:
    double lat(lat) ;
    double lon(lon) ;
    double ascii_data(lat, lon) ;
}
person jhamman    schedule 30.07.2015