Как импортировать файл netCDF4 с помощью xarray, когда имена индексов имеют несколько измерений?

#python #python-xarray #netcdf4

#python #python-xarray #netcdf4

Вопрос:

Когда я пытаюсь импортировать файлы netCDF4 с помощью xarray, я получаю следующую ошибку:

Ошибка MissingDimensionsError: ‘name’ имеет более 1 измерения и то же имя, что и одно из его измерений (‘time’, ‘name’). xarray запрещает такие переменные, поскольку они конфликтуют с координатами, используемыми для обозначения измерений.

Однако я могу успешно импортировать эти данные, используя библиотеку python netCDF4, и получить из нее нужные мне данные. Проблема в том, что этот метод очень медленный, поэтому я искал что-то более быстрое и хотел попробовать xarray. Вот пример файла и код, который выдает мне ошибку, о которой идет речь.

 from netCDF4 import Dataset
#import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np         
#import seaborn as sns
from tkinter import Tk

from tkinter.filedialog import askdirectory
import os
import xarray as xr

#use this function to get a directory name where the files are
def get_dat():
    root = Tk()
    root.withdraw()
    root.focus_force()
    root.attributes("-topmost", True)      #makes the dialog appear on top
    filename = askdirectory()      # Open single file
    root.destroy()
    root.quit()
    return filename

directory=get_dat()

#loop through files in directory and read the netCDF4 files
for filename in os.listdir(directory):     #loop through files in user's dir
    if filename.endswith(".nc"):     #all my files are .nc not .nc4
        runstart=pd.datetime.now()
        #I get the error right here
        rootgrp3 = xr.open_dataset(directory '/' filename)
        #more stuff happens here with the data, but this stuff works
  

Комментарии:

1. Я думаю, что это вряд ли сработает в xarray. Как указывает ошибка, которую вы получаете, у вас есть измерение, имя которого совпадает с 2d координатами. Хотя NetCDF поддерживает это, xarray этого не делает. Вероятно, проще всего переименовать измерение (или координату) в вашем файле netcdf перед открытием с помощью xarray.

2. Я беспокоился, что это так. Это было то, что я прочитал, но я надеялся, что есть обходной путь. Единственная проблема в том, что у меня 383 таких файла, и я не знаю способа быстро переименовать их. Время компиляции становится дорогим, когда вы читаете 383 файла в течение 20 секунд (около 3 часов).

Ответ №1:

Проблема все еще актуальна в настоящее время. Проблема возникает, когда координата имеет несколько измерений и одно и то же имя одного из этих измерений.

В качестве примера, выходные файлы, result.nc выданные моделью GOTM, имеют эту проблему для координат z и zi :

 dimensions:
    time = UNLIMITED ; // (4018 currently)
    lon = 1 ;
    lat = 1 ;
    z = 218 ;
    zi = 219 ;
variables:
    ... 
    float z(time, z, lat, lon) ;
    float zi(time, zi, lat, lon) ;
  

Здесь было предложено реализовать kwarg ‘rename_var’ в xr.open_dataset() в качестве обходного пути, но, насколько мне известно, это еще не реализовано.

Быстрый обходной путь, который я использую, заключается в вызове nco-ncrename из python, где это необходимо.

В моем случае :

  os.system('ncrename -v z,z_coord -v zi,zi_coord result.nc resultxr.nc')
  

Это позволяет

  r2 = xr.open_dataset(testdir 'resultxr.nc')
  

в то время как

  r = xr.open_dataset(testdir 'result.nc')
  

сбой.

Ответ №2:

В ipython это очень простое решение:

 !ncrename -v name,name_matrix filename.nc #renaming variable name to prevent dimension/variable name conflict in xarray, requires nco in linux