извлечение данных станции из заархивированных файлов NetCDF

#netcdf #cdo-climate #nco

#netcdf #cdo-климат #сержант

Вопрос:

Я создал пространственный набор данных с разрешением 3 дня в течение некоторого периода (2018-2021 гг.) в формате NetCDF, что означает, что у меня есть ~300 файлов, из которых я хочу извлечь данные.

К сожалению, из-за проблем с размером мне пришлось заархивировать набор данных с опцией zip_1 с помощью cdo, и теперь мне нужно извлечь данные станции по нескольким точкам (примерно 20 станций), а для извлечения даже одной точки из одного файла требуется много времени.

Мой вопрос в том, есть ли возможность ускорить этот процесс с помощью какой-либо команды, использующей nco или cdo? Я имею в виду во время одного цикла по 3-дневному файлу, чтобы извлечь все станции, которые мне нужны.

В данный момент я просто перебираю станции, а затем файлы, но так как cdo требуется XX секунд для извлечения 3-х дней для одной станции, общее количество будет 20 раз по 300 раз по XX секундам (несколько дней).

До сих пор это мой код:

 #!/usr/bin/env ipython # ----------------------- import numpy as np from netCDF4 import Dataset,date2num,num2date import os, glob, subprocess # ------------------------ stations={'S01':[25.0 1./60,59.0 43/60.0],'S02':[21.0 5.0/60,59.0 2/60.0]} # list of stations # ---------------------------------------------------------------------------------------- pathin = os.getcwd()   '/' # the location of data tmpdir = os.getcwd()   '/tmp/' # some temporary folder where to write temporary files files = sorted(glob.glob(pathin '/*/*mean_*nc4')); # files containing data (my large dataset) # ------------------------- dum=[stations[key].extend(mygrid.get_locid(*stations[key])) for key in stations.keys()]; # append the indices from where I want to have output (station coordinates as indices) # ------------------------- for statname in stations.keys(): # loop over the stations  iiout=stations[statname][-1];jjout=stations[statname][-2]; # use the indices  indexbox=[str(iiout 1),str(iiout 1),str(jjout 1),str(jjout 1)];boxstr = ','.join(indexbox) # make the index box  for fname in files: # loop over all the files  fin = fname # input file  fout = tmpdir   '/'   'stat_' statname '_' os.path.basename(fname) # write to some temporary file  # ---------------------------------------------------  cstr = 'cdo -selindexbox,' boxstr ' ' fin ' ' fout; # use cdo to extract data  if os.path.exists(fout)==False: subprocess.call(cstr,shell=True); # call cdo   # -------------------------------------------------------  # let us merge temporaray files of the station:  tmpfiles = tmpdir   '/*' statname '*'  mainfile = 'statdata_' staname '.nc'  cstr = 'cdo -mergetime ' tmpfiles   ' ' mainfile;  subprocess.call(cstr,shell=True);  # -------------------------------------------------------  

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

1. Если вы покажете свой существующий код, это прояснит, какие данные вы пытаетесь извлечь.