Создайте цикл для ncks для извлечения данных NetCDF из Hycom с помощью Python
Я уже написал код ncks для извлечения данных из базы данных Hycom, однако из-за проблем с сервером я могу загружать только один временной шаг за раз. Мне нужен цикл, который позволяет мне загружать единичные данные временного шага за период времени в один месяц.
ncks -d time,2015-12-01T00:00:00Z -d depth,0.00,1000.00,1 -v water_temp,salinity,water_u,water_v,surf_el -d lon,161.45,171.28 -d lat,-4.75,3.43 'http://tds.hycom.org/thredds/dodsC/GLBv0.08/expt_53.X/data/2015' test.nc
4D-переменные, которые я хочу загрузить: water_temp,salinity,water_u,water_v (их размеры: время, широта, долгота, глубина)
3D-переменные, которые я хочу загрузить: surf_el (размеры: время, широта и долгота)
Для переменных 4D я хочу, чтобы глубина была от 0 до 1000 м. Этот код предназначен для особого случая, я хочу охватить период с 2015/12/01 по 2015/12/31. Весь декабрь 2015 года.
Вот рабочий код Python:
import netCDF4
from netCDF4 import Dataset
dec = Dataset('http://tds.hycom.org/thredds/dodsC/GLBv0.08/expt_53.X/data/2015')
print(dec.variables.keys()) #odict_keys(['depth', 'lat', 'lon', 'time', 'tau', 'water_u', 'water_u_bottom', 'water_v', 'water_v_bottom', 'water_temp', 'water_temp_bottom', 'salinity', 'salinity_bottom', 'surf_el'])
long = dec.variables['lon']
lati = dec.variables['lat']
time = dec.variables['time']
for d in dec.dimensions.items():
print(d)
#('depth', <class 'netCDF4._netCDF4.Dimension'>: name = 'depth', size = 40)
#('lat', <class 'netCDF4._netCDF4.Dimension'>: name = 'lat', size = 3251)
#('lon', <class 'netCDF4._netCDF4.Dimension'>: name = 'lon', size = 4500)
#('time', <class 'netCDF4._netCDF4.Dimension'>: name = 'time', size = 2861)
2 ответа
Руководство NCO имеет примеры цикла по измерению времени здесь:
for idx in {1..12}; do # Bash Shell (version 3.0+)
idx=`printf "%02d" ${idx}` # Zero-pad to preserve order
ncks -F -d time,${idx},,12 t_anm_8501_8912.nc foo.${idx}
ncra foo.${idx} t_anm_8589_${idx}.nc
done
Что-то подобное должно сработать для вас, если вы замените двухзначный месяц в гиперлаботе даты на
${idx}
переменная, как указано выше.
У меня была такая же проблема с использованием python netCDF4 для этих данных, он очень медленный для временного диапазона менее 1 года (я понял, что он собирает полный набор данных за 1 год, расположенный в http://tds.hycom.org/thredds/dodsC/GLBv0.08/expt_53.X/data/2015 и только после этого применяет фильтры). Я решил проблему, загрузив отдельные почасовые файлы с сервера и объединив их с помощью xarray. Таким образом, загружается только необходимый временной диапазон, что намного быстрее. Я написал библиотеку Python, которая загружает данные Hycom GLBv0.08/expt_53.X, используя этот метод, я оставляю здесь ссылку на мой репозиторий, если она может быть вам полезна!