Разделите один ежемесячный файл NetCDF на несколько усредненных ежедневных файлов NetCDF, используя xarray - PullRequest
0 голосов
/ 26 января 2019

У меня есть 1 файл NetCDF за сентябрь 2007 года. Он содержит 6 часовых данных для определенного широты / долготы с переменными ветра и влажности. Каждая переменная имеет форму (120, 45, 93): 120 раз (4 раза в день), 45 широт и 93 долготы. С помощью следующего кода я могу получить среднесуточные данные для всех переменных. Теперь каждая переменная имеет форму (30, 45, 93). Время является целым числом и имеет единицу измерения 'hours since 1900-01-01 00:00:00.0'.

Из этих усредненных данных за день, как я могу разделить на 30 различных файлов NetCDF для каждого дня, с именем файла, содержащим YYYY:MM:DD формат времени?

import xarray as xr
monthly_data = xr.open_dataset('interim_2007-09-01to2007-09-31.nc') 
daily_data = ds.resample(time='1D').mean()

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Xarray имеет функцию верхнего уровня для таких времен - xarray.save_mfdataset. В вашем случае вы хотели бы использовать groupby, чтобы разбить ваш набор данных на логические порции, а затем создать список соответствующих имен файлов. Оттуда просто позвольте save_mfdataset сделать все остальное.

dates, datasets = zip(*ds.resample(time='1D').mean('time').groupby('time'))
filenames = [pd.to_datetime(date).strftime('%Y.%m.%d') + '.nc' for date in dates]
xr.save_mfdataset(datasets, filenames)
0 голосов
/ 26 января 2019

После просмотра документации вы можете использовать num2date в NetCDF4 для преобразования целого числа в дату. Также вы можете индексировать xarray.dataset используя isel():

from netCDF4 import num2date
for i in range(30):
    day = daily_data.isel(time=i)
    the_date = num2date(day.time.data, units='hours since 1900-01-01 00:00:00')
    day.to_netcdf(str(the_date.date())+'.nc', format='NETCDF4')
...