Skip to content
Closed
12 changes: 6 additions & 6 deletions src/hsp2/hsp2/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -704,23 +704,23 @@ def get_flows(
t = data_frame[smemn].astype(float64).to_numpy()[0:steps]

if MFname in ts and AFname in ts:
t *= ts[MFname][:steps] * ts[AFname][0:steps]
t = t * ts[MFname][:steps] * ts[AFname][0:steps]
msg(4, f"MFACTOR modified by timeseries {MFname}")
msg(4, f"AFACTR modified by timeseries {AFname}")
elif MFname in ts:
t *= afactr * ts[MFname][0:steps]
t = t * afactr * ts[MFname][0:steps]
msg(4, f"MFACTOR modified by timeseries {MFname}")
elif AFname in ts:
t *= mfactor * ts[AFname][0:steps]
t = t * mfactor * ts[AFname][0:steps]
msg(4, f"AFACTR modified by timeseries {AFname}")
else:
t *= factor
t = t * factor

# if poht to iheat, imprecision in hspf conversion factor requires a slight adjustment
if (smemn == "POHT" or smemn == "SOHT") and tmemn == "IHEAT":
t *= 0.998553
t = t * 0.998553
if (smemn == "PODOXM" or smemn == "SODOXM") and tmemn == "OXIF1":
t *= 1.000565
t = t * 1.000565

# ??? ISSUE: can fetched data be at different frequency - don't know how to transform.
if tmemn in ts:
Expand Down
80 changes: 44 additions & 36 deletions src/hsp2/hsp2/utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from numba import types
from numba.typed import Dict
from numpy import float64, full, tile, zeros
from pandas import Series, date_range
from pandas import Series, date_range, Timedelta
from pandas.tseries.offsets import Minute

from hsp2.hsp2io.protocols import Category, SupportsReadTS, SupportsWriteTS
Expand Down Expand Up @@ -213,8 +213,9 @@ def transform(ts, name, how, siminfo):
NOTE: these routines work for both regular and sparse timeseries input
"""

tsfreq = ts.index.freq
freq = Minute(siminfo["delt"])
tsfreq = Timedelta("1 " + ts.index.freqstr)
fmins = Minute(siminfo["delt"])
freq = Timedelta(fmins).to_timedelta64()
stop = siminfo["stop"]

# append duplicate of last point to force processing last full interval
Expand All @@ -226,7 +227,7 @@ def transform(ts, name, how, siminfo):
elif tsfreq is None: # Sparse time base, frequency not defined
ts = ts.reindex(siminfo["tbase"]).ffill().bfill()
elif how == "SAME":
ts = ts.resample(freq).ffill() # tsfreq >= freq assumed, or bad user choice
ts = ts.resample(fmins).ffill() # tsfreq >= freq assumed, or bad user choice
elif not how:
if name in flowtype:
if "Y" in str(tsfreq) or "M" in str(tsfreq) or tsfreq > freq:
Expand All @@ -236,24 +237,24 @@ def transform(ts, name, how, siminfo):
ratio = 1.0 / 8766.0
else:
ratio = freq / tsfreq
ts = (ratio * ts).resample(freq).ffill() # HSP2 how = div
ts = (ratio * ts).resample(fmins).ffill() # HSP2 how = div
else:
ts = ts.resample(freq).sum()
ts = ts.resample(fmins).sum()
else:
if "Y" in str(tsfreq) or "M" in str(tsfreq) or tsfreq > freq:
ts = ts.resample(freq).ffill()
ts = ts.resample(fmins).ffiio_managerll()
else:
ts = ts.resample(freq).mean()
ts = ts.resample(fmins).mean()
elif how == "MEAN":
ts = ts.resample(freq).mean()
ts = ts.resample(fmins).mean()
elif how == "SUM":
ts = ts.resample(freq).sum()
ts = ts.resample(fmins).sum()
elif how == "MAX":
ts = ts.resample(freq).max()
ts = ts.resample(fmins).max()
elif how == "MIN":
ts = ts.resample(freq).min()
ts = ts.resample(fmins).min()
elif how == "LAST":
ts = ts.resample(freq).ffill()
ts = ts.resample(fmins).ffill()
elif how == "DIV":
if "Y" in str(tsfreq) or "M" in str(tsfreq):
mult = 1
Expand All @@ -268,13 +269,13 @@ def transform(ts, name, how, siminfo):
ratio = 1.0 / (8766.0 * mult)
else:
ratio = freq / tsfreq
ts = (ratio * ts).resample(freq).ffill() # HSP2 how = div
ts = (ratio * ts).resample(fmins).ffill() # HSP2 how = div
else:
ts = (ts * (freq / ts.index.freq)).resample(freq).ffill()
ts = (ts * (freq / tsfreq)).resample(fmins).ffill()
elif how == "ZEROFILL":
ts = ts.resample(freq).fillna(0.0)
ts = ts.resample(fmins).fillna(0.0)
elif how == "INTERPOLATE":
ts = ts.resample(freq).interpolate()
ts = ts.resample(fmins).interpolate()
else:
print(f"UNKNOWN method in TRANS, {how}")
return zeros(1)
Expand All @@ -287,7 +288,8 @@ def hoursval(siminfo, hours24, dofirst=False, lapselike=False):
"""create hours flags, flag on the hour or lapse table over full simulation"""
start = siminfo["start"]
stop = siminfo["stop"]
freq = Minute(siminfo["delt"])
fmins = Minute(siminfo["delt"])
freq = Timedelta(fmins).to_timedelta64()

dr = date_range(
start=f"{start.year}-01-01", end=f"{stop.year}-12-31", freq=Minute(60)
Expand All @@ -297,16 +299,17 @@ def hoursval(siminfo, hours24, dofirst=False, lapselike=False):
hours[0] = 1

ts = Series(hours[0 : len(dr)], dr)
tsfreq = Timedelta("1 " + ts.index.freqstr)
if lapselike:
if ts.index.freq > freq: # upsample
ts = ts.resample(freq).asfreq().ffill()
elif ts.index.freq < freq: # downsample
ts = ts.resample(freq).mean()
if tsfreq > freq: # upsample
ts = ts.resample(fmins).asfreq().ffill()
elif tsfreq < freq: # downsample
ts = ts.resample(fmins).mean()
else:
if ts.index.freq > freq: # upsample
ts = ts.resample(freq).asfreq().fillna(0.0)
elif ts.index.freq < freq: # downsample
ts = ts.resample(freq).max()
if tsfreq > freq: # upsample
ts = ts.resample(fmins).asfreq().fillna(0.0)
elif tsfreq < freq: # downsample
ts = ts.resample(fmins).max()
return ts.truncate(start, stop).to_numpy()


Expand All @@ -321,16 +324,18 @@ def monthval(siminfo, monthly):
"""returns value at start of month for all times within the month"""
start = siminfo["start"]
stop = siminfo["stop"]
freq = Minute(siminfo["delt"])
fmins = Minute(siminfo["delt"])
freq = Timedelta(fmins).to_timedelta64()

months = tile(monthly, stop.year - start.year + 1).astype(float)
dr = date_range(start=f"{start.year}-01-01", end=f"{stop.year}-12-31", freq="MS")
ts = Series(months, index=dr).resample("D").ffill()
tsfreq = Timedelta("1 " + ts.index.freqstr)

if ts.index.freq > freq: # upsample
ts = ts.resample(freq).asfreq().ffill()
elif ts.index.freq < freq: # downsample
ts = ts.resample(freq).mean()
if tsfreq > freq: # upsample
ts = ts.resample(fmins).asfreq().ffill()
elif tsfreq < freq: # downsample
ts = ts.resample(fmins).mean()
return ts.truncate(start, stop).to_numpy()


Expand All @@ -339,16 +344,19 @@ def dayval(siminfo, monthly):
interpolation to day, but constant within day"""
start = siminfo["start"]
stop = siminfo["stop"]
freq = Minute(siminfo["delt"])
fmins = Minute(siminfo["delt"])
freq = Timedelta(fmins).to_timedelta64()

months = tile(monthly, stop.year - start.year + 1).astype(float)
dr = date_range(start=f"{start.year}-01-01", end=f"{stop.year}-12-31", freq="MS")
ts = Series(months, index=dr).resample("D").interpolate("time")
tsfreq = Timedelta("1 " + ts.index.freqstr)

if ts.index.freq > freq: # upsample
ts = ts.resample(freq).ffill()
elif ts.index.freq < freq: # downsample
ts = ts.resample(freq).mean()

if tsfreq > freq: # upsample
ts = ts.resample(fmins).ffill()
elif tsfreq < freq: # downsample
ts = ts.resample(fmins).mean()
return ts.truncate(start, stop).to_numpy()


Expand Down
5 changes: 4 additions & 1 deletion src/hsp2/hsp2io/hdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,12 @@ def __init__(self, file_path: str) -> None:
self._store = pd.HDFStore(file_path)
None

def __del__(self):
def close(self):
self._store.close()

def __del__(self):
self.close()

def __enter__(self):
return self

Expand Down
1 change: 1 addition & 0 deletions src/hsp2/hsp2tools/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def run(h5file, saveall=True, compress=True):
hdf5_instance = HDF5(h5file)
io_manager = IOManager(hdf5_instance)
main(io_manager, saveall=saveall, jupyterlab=compress)
hdf5_instance.close()


def import_uci(ucifile, h5file):
Expand Down
Loading