@@ -205,6 +205,38 @@ def get_dim_filenames(cls, filenames, dim):
205205 else :
206206 return filenames
207207
208+ @classmethod
209+ def collect_timeslices (cls , timestamps , data_filenames , _grid_fb_class , dimensions , indices , netcdf_engine ):
210+ if timestamps is not None :
211+ dataFiles = []
212+ for findex in range (len (data_filenames )):
213+ for f in [data_filenames [findex ], ] * len (timestamps [findex ]):
214+ dataFiles .append (f )
215+ timeslices = np .array ([stamp for file in timestamps for stamp in file ])
216+ time = timeslices
217+ else :
218+ timeslices = []
219+ dataFiles = []
220+ for fname in data_filenames :
221+ with _grid_fb_class (fname , dimensions , indices , netcdf_engine = netcdf_engine ) as filebuffer :
222+ ftime = filebuffer .time
223+ timeslices .append (ftime )
224+ dataFiles .append ([fname ] * len (ftime ))
225+ timeslices = np .array (timeslices )
226+ time = np .concatenate (timeslices )
227+ dataFiles = np .concatenate (np .array (dataFiles ))
228+ if time .size == 1 and time [0 ] is None :
229+ time [0 ] = 0
230+ time_origin = TimeConverter (time [0 ])
231+ time = time_origin .reltime (time )
232+
233+ if not np .all ((time [1 :] - time [:- 1 ]) > 0 ):
234+ id_not_ordered = np .where (time [1 :] < time [:- 1 ])[0 ][0 ]
235+ raise AssertionError (
236+ 'Please make sure your netCDF files are ordered in time. First pair of non-ordered files: %s, %s'
237+ % (dataFiles [id_not_ordered ], dataFiles [id_not_ordered + 1 ]))
238+ return time , time_origin , timeslices , dataFiles
239+
208240 @classmethod
209241 def from_netcdf (cls , filenames , variable , dimensions , indices = None , grid = None ,
210242 mesh = 'spherical' , timestamps = None , allow_time_extrapolation = None , time_periodic = False ,
@@ -317,48 +349,20 @@ def from_netcdf(cls, filenames, variable, dimensions, indices=None, grid=None,
317349 if len (data_filenames ) > 1 and 'time' not in dimensions and timestamps is None :
318350 raise RuntimeError ('Multiple files given but no time dimension specified' )
319351
320- def collect_timeslices ():
321- if timestamps is not None :
322- dataFiles = []
323- for findex in range (len (data_filenames )):
324- for f in [data_filenames [findex ], ] * len (timestamps [findex ]):
325- dataFiles .append (f )
326- timeslices = np .array ([stamp for file in timestamps for stamp in file ])
327- time = timeslices
328- else :
329- timeslices = []
330- dataFiles = []
331- for fname in data_filenames :
332- with _grid_fb_class (fname , dimensions , indices , netcdf_engine = netcdf_engine ) as filebuffer :
333- ftime = filebuffer .time
334- timeslices .append (ftime )
335- dataFiles .append ([fname ] * len (ftime ))
336- timeslices = np .array (timeslices )
337- time = np .concatenate (timeslices )
338- dataFiles = np .concatenate (np .array (dataFiles ))
339- if time .size == 1 and time [0 ] is None :
340- time [0 ] = 0
341- time_origin = TimeConverter (time [0 ])
342- time = time_origin .reltime (time )
343-
344- if not np .all ((time [1 :] - time [:- 1 ]) > 0 ):
345- id_not_ordered = np .where (time [1 :] < time [:- 1 ])[0 ][0 ]
346- raise AssertionError (
347- 'Please make sure your netCDF files are ordered in time. First pair of non-ordered files: %s, %s'
348- % (dataFiles [id_not_ordered ], dataFiles [id_not_ordered + 1 ]))
349- return time , time_origin , timeslices , dataFiles
350-
351352 if grid is None :
352353 # Concatenate time variable to determine overall dimension
353354 # across multiple files
354- time , time_origin , timeslices , dataFiles = collect_timeslices ()
355+ time , time_origin , timeslices , dataFiles = cls .collect_timeslices (timestamps , data_filenames ,
356+ _grid_fb_class , dimensions ,
357+ indices , netcdf_engine )
355358 grid = Grid .create_grid (lon , lat , depth , time , time_origin = time_origin , mesh = mesh )
356359 grid .timeslices = timeslices
357360 kwargs ['dataFiles' ] = dataFiles
358361 elif grid is not None and ('dataFiles' not in kwargs or kwargs ['dataFiles' ] is None ):
359362 # ==== means: the field has a shared grid, but may have different data files, so we need to collect the
360363 # ==== correct file time series again.
361- _ , _ , _ , dataFiles = collect_timeslices ()
364+ _ , _ , _ , dataFiles = cls .collect_timeslices (timestamps , data_filenames , _grid_fb_class ,
365+ dimensions , indices , netcdf_engine )
362366 kwargs ['dataFiles' ] = dataFiles
363367
364368 field_chunksize = kwargs .get ('field_chunksize' , None )
0 commit comments