3 Created on Tue May 5 09:20:29 2020
14 from datetime
import timedelta
15 from scipy.interpolate
import interp1d
36 if cls
is LkupTblBase:
38 if set(cls.__abstractmethods__) <= attrs:
54 super().
__init__(name, idxVals, lkupVals)
61 iLkup = np.where(self.
idxValsidxVals <= valLkup)[0]
62 if iLkup.size == 0: iLkup = np.array([0])
63 return self.
lkupValslkupVals[iLkup[-1]].item()
70 def __init__(self, name, hypso, xElev, lkupVals):
73 xStor = hypso.elev2stor(xElev)
75 super().
__init__(name, xStor, lkupVals)
83 super().
__init__(name, idxVals, lkupVals)
85 fill_value=(min(lkupVals),max(lkupVals)), bounds_error=
False)
140 def __init__(self, name, time, monthDayHr, tblVals, *, typ='interp', timeUnit=None):
145 if timeUnit
is not None:
150 elif timeUnit ==
'D':
151 self.
tDeltatDelta = timedelta(days=1)
153 self.
tDeltatDelta = timedelta(hours=1)
155 self.
timeUnittimeUnit = time.timeUnit
156 self.
tDeltatDelta = time.tDelta
158 if np.isscalar(tblVals): tblVals = np.array([tblVals], dtype=float)
159 tblVals = tblVals.reshape(len(tblVals), tblVals.ndim)
if tblVals.ndim == 1
else tblVals
160 monthDayHr = monthDayHr.reshape(
161 monthDayHr.ndim, monthDayHr.shape[0])
if monthDayHr.ndim == 1
else monthDayHr
162 xDateTime = np.empty(monthDayHr.shape[0] + 1)
163 yVals = np.empty([monthDayHr.shape[0] + 1, tblVals.shape[1]])
165 for i
in range(0, monthDayHr.shape[0]):
166 curDateTime = dt.datetime(2020,
169 monthDayHr[i, 2], tzinfo=dt.timezone.utc)
170 xDateTime[i] = cl.timegm(curDateTime.timetuple())
171 yVals[i, :] = tblVals[i, :]
173 xDateTime[-1] = cl.timegm(dt.datetime(2021, 1, 1, 0, tzinfo=dt.timezone.utc).timetuple())
174 yVals[-1, :] = tblVals[-1, :]
177 xInterpDates = np.empty(12)
178 for curMonth
in range(1, 13):
179 xInterpDates[curMonth-1] = cl.timegm(
180 dt.datetime(2020, curMonth, 1, 0).timetuple())
182 dtBgn = dt.datetime(2020, 1, 1, 0)
183 dtEnd = dt.datetime(2021, 1, 1, 0) - time.tDelta
184 xInterpDates = np.linspace(
185 cl.timegm(dtBgn.timetuple()),
186 cl.timegm(dtEnd.timetuple()),
187 int(366*24/(self.
tDeltatDelta.total_seconds()/3600)))
188 lkupVals = np.empty([len(xInterpDates), len(yVals[0, :])])
189 if self.
typtyp ==
'interp':
190 for i
in range(len(yVals[0, :])):
191 lkupVals[:, i] = np.interp(xInterpDates, xDateTime, yVals[:, i])
193 for i
in range(1, len(xDateTime)):
194 iCurPer = (xInterpDates >= xDateTime[i-1]) & (xInterpDates < xDateTime[i])
195 lkupVals[iCurPer, :] = yVals[i-1]
196 self.
vDatevDate = np.empty([len(xInterpDates), 3])
197 for i, curDt
in enumerate(xInterpDates):
200 self.
vDatevDate[i, 0] = dt.datetime.fromtimestamp(curDt, dt.timezone.utc).month
201 self.
vDatevDate[i, 1] = dt.datetime.fromtimestamp(curDt, dt.timezone.utc).day
202 self.
vDatevDate[i, 2] = dt.datetime.fromtimestamp(curDt, dt.timezone.utc).hour
203 super().
__init__(name, -1, lkupVals)
209 iTime = self.
vDatevDate[:, 0] == dateTime.month
211 iTime = iTime & (self.
vDatevDate[:, 1] == dateTime.day)
213 iTime = iTime & (self.
vDatevDate[:, 2] == dateTime.hour)
214 rowLkup = np.where(iTime)[0][0]
215 return self.
lkupValslkupVals[rowLkup, col].item()
def get_val(self, dateTime, col=0)
def __init__(self, name, time, monthDayHr, tblVals, *typ='interp', timeUnit=None)
def __subclasshook__(cls, C)
def __init__(self, name, idxVals, lkupVals)
def get_val(self, idxVal)
def __init__(self, name, hypso, xElev, lkupVals)
def __init__(self, name, idxVals, lkupVals)
def get_val(self, valLkup)
def __init__(self, name, idxVals, lkupVals)