Как предварительно обработать набор данных для назначения координат перед открытием с помощью xarray.open_mfdataset?Python

Программы на Python
Anonymous
Как предварительно обработать набор данных для назначения координат перед открытием с помощью xarray.open_mfdataset?

Сообщение Anonymous »

В документации xarray для функции open_mfdataset указано, что вы можете использовать аргумент preprocess, чтобы применить функцию к каждому набору данных перед объединением. Наборы данных NetCDF, которые у меня есть, не имеют назначенных координат, когда вы открываете их один за другим, поэтому я пытался назначить их перед объединением с помощью join='by_coords' в функции open_mfdataset.
Вот как выглядит один из наборов данных, если вы его откроете:
path = 'path/to/my/file/file.nc'
ds = xr.open_dataset(path, decode_times=False)
ds

# Size: 1GB
# Dimensions: (comid: 2677612, time_mn: 120, time_yr: 10)
# Dimensions without coordinates: comid, time_mn, time_yr
#Data variables:
# COMID (comid) int32 11MB ...
# Time_mn (time_mn) int32 480B ...
# Time_yr (time_yr) int32 40B ...
# RAPID_mn_cfs (comid, time_mn) float32 1GB ...
# RAPID_yr_cfs (comid, time_yr) float32 107MB ...

Чтобы использовать open_mfdataset, мой код выглядит следующим образом. Функция AssignCoordinates работает должным образом, но ей по-прежнему не удается открыть наборы данных.
def assignCoordinates(df):
df = df.assign_coords({
"comid": df['COMID'],
"time_mn": fd.calcDatetimes(df, 'Time_mn', df.sizes['time_mn']), #this just calculates datetimes for the weird time units used in these files, the function works properly
"time_yr": fd.calcDatetimes(df, 'Time_yr', df.sizes['time_yr'])
})
return df

path = "path/to/files/*.nc"
ds = xr.open_mfdataset(path, preprocess=assignCoordinates, combine='by_coords', decode_times=False)

ds

Вот какую ошибку я получаю:
ValueError: Could not find any dimension coordinates to use to order the datasets for concatenation

Я предполагаю, что предварительно обработанные файлы на самом деле не используются open_mfdataset, но тогда я не совсем понимаю, в чем смысл этого аргумента. Мое подозрение, что он не использует предварительно обработанные наборы данных, подкрепляется тем фактом, что если бы это было так, я мог бы удалить decode_times=False, потому что время теперь рассчитывается таким образом, который имеет смысл и может быть декодируется после выполнения функции AssignCoordinates, но если я удалю ее, я получу ошибку о том, что время невозможно декодировать.
Есть ли способ сделать то, что я мне нужно или мне действительно нужно открывать каждый набор данных индивидуально?
Минимальный воспроизводимый пример
Скопируйте этот код и заполните путь экспорта. В указанном вами каталоге будут созданы три файла .nc.
import xarray as xr
import numpy as np

np.random.seed(0)
temperature = 15 + 8 * np.random.randn(2, 3, 4)
precipitation = 10 * np.random.rand(2, 3, 4)
lon = [-99.83, -99.32]
lat = [42.25, 42.21]
instruments = ["manufac1", "manufac2", "manufac3"]
time = pd.date_range("2014-09-06", periods=4)
reference_time = pd.Timestamp("2014-09-05")
ds = xr.Dataset(
data_vars=dict(
temperature=(["loc", "instrument", "time"], temperature),
precipitation=(["loc", "instrument", "time"], precipitation),
),
attrs=dict(description="Weather related data."),
)
for i in range(1,4):
ds.to_netcdf(f'yourdirectory/test{i}.nc') #### EDIT HERE #####

После выполнения вышеописанного запустите этот код (не забудьте изменить каталог, в котором вы сохранили файлы, созданные выше):
def assignCoordinates(df):
df = df.assign_coords({
"loc": df['loc'],
"instrument": df['instrument'],
"time": df['time']
})
return df

ds = xarr.open_mfdataset('yourdirectory/*.nc', preprocess=assignCoordinates, combine='by_coords') #### EDIT HERE #####
ds


Подробнее здесь: https://stackoverflow.com/questions/786 ... array-open

Вернуться в «Python»