1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
##################################################
# 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