Source code for oasislmf.pytools.converters.csvtobin.utils.occurrence
import numpy as np
from oasislmf.pytools.common.data import generate_output_metadata, occurrence_dtype, occurrence_granular_dtype
from oasislmf.pytools.converters.csvtobin.utils.common import iter_csv_as_ndarray
from oasislmf.pytools.converters.data import TOOL_INFO
[docs]
def occurrence_tobin(stack, file_in, file_out, file_type, no_of_periods, no_date_alg=False, granular=False):
if no_date_alg and granular:
raise RuntimeError("Cannot have an occurrence file with granular dates and no date algorithm. Use at most one of -D, -G, but not both")
date_opts = granular << 1 | (not no_date_alg)
np.array([date_opts], dtype="i4").tofile(file_out)
np.array([no_of_periods], dtype="i4").tofile(file_out)
if no_date_alg:
dtype = TOOL_INFO[file_type]["dtype"]
for chunk in iter_csv_as_ndarray(stack, file_in, dtype):
if np.any(chunk["period_no"] > no_of_periods):
raise RuntimeError("FATAL: Period number exceeds maximum supplied")
chunk.tofile(file_out)
else:
occ_csv_output = [
("event_id", 'i4', "%d"),
("period_no", 'i4', "%d"),
("occ_year", 'i4', "%d"),
("occ_month", 'i4', "%d"),
("occ_day", 'i4', "%d"),
]
if granular:
occ_csv_output += [
("occ_hour", 'i4', "%d"),
("occ_minute", 'i4', "%d"),
]
_headers, csv_dtype, _fmt = generate_output_metadata(occ_csv_output)
out_dtype = occurrence_granular_dtype if granular else occurrence_dtype
for chunk in iter_csv_as_ndarray(stack, file_in, csv_dtype):
out = np.empty(len(chunk), dtype=out_dtype)
out["event_id"] = chunk["event_id"]
out["period_no"] = chunk["period_no"]
m = (chunk["occ_month"].astype(np.int64) + 9) % 12
y = chunk["occ_year"].astype(np.int64) - m // 10
date_id = 365 * y + y // 4 - y // 100 + y // 400 + (m * 306 + 5) // 10 + (chunk["occ_day"].astype(np.int64) - 1)
if granular:
date_id = date_id * 1440 + 60 * chunk["occ_hour"].astype(np.int64) + chunk["occ_minute"].astype(np.int64)
out["occ_date_id"] = date_id
if np.any(out["period_no"] > no_of_periods):
raise RuntimeError("FATAL: Period number exceeds maximum supplied")
out.tofile(file_out)