################################################## # Written by John Kazimierz Farey, Sep 2012 # # Port of Matlab code of James Harle # # # # # # Init with source directory for netcdf files # # Method to generates time/file list information # # for a particular grid # ################################################## from os import listdir from netCDF4 import Dataset, netcdftime import logging class SourceTime: def __init__(self, src_dir): self.src_dir = src_dir self.logger = logging.getLogger(__name__) # returns a list of all the relevant netcdf files def _get_dir_list(self, grid): fend = 'd05%s.nc' %grid.upper() dir_list = listdir(self.src_dir) for i in range(len(dir_list)): if dir_list[i][-7:] != fend: dir_list[i] = '' else: dir_list[i] = self.src_dir + dir_list[i] dir_list.sort() return [_f for _f in dir_list if _f] # Returns list of dicts of date/time info # I assume there is only one date per file # Each date is datetime instance. to get day etc use x.day # They should be in order # Matlab var dir_list is incorporated into src_time def get_source_time(self, grid, t_adjust): dir_list = self._get_dir_list(grid) src_time = [] for f in range(len(dir_list)): self.logger.debug('get_source_time: %s', dir_list[f]) nc = Dataset(dir_list[f], 'r') varid = nc.variables['time_counter'] f_time = {} f_time['fname'] = dir_list[f] # First 2 values are in unicode. Pray. f_time['units'] = varid.units f_time['calendar'] = varid.calendar raw_date = varid[0] + t_adjust f_time['date'] = netcdftime.num2date(raw_date, f_time['units'], f_time['calendar']) src_time.append(f_time) return src_time