From d87af2537e28f9e0cfbebc518686331ea2cc0f2f Mon Sep 17 00:00:00 2001 From: Thibault Hallouin <thibault.hallouin@inrae.fr> Date: Tue, 5 Sep 2023 12:31:18 +0200 Subject: [PATCH] add support for minute and hourly time step for bootstrapping fixes https://gitlab.irstea.fr/HYCAR-Hydro/evalhyd/evalhyd-cpp/-/issues/9 --- changelog.rst | 12 ++++++--- include/evalhyd/detail/uncertainty.hpp | 37 ++++++++++++++++++++++++-- include/evalhyd/evald.hpp | 4 ++- include/evalhyd/evalp.hpp | 4 ++- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/changelog.rst b/changelog.rst index d47ce60..bbe328e 100644 --- a/changelog.rst +++ b/changelog.rst @@ -1,10 +1,14 @@ .. default-role:: obj -.. - latest - ------ +latest +------ + +Yet to be versioned and released. Only available from *dev* branch until then. + +.. rubric:: Scope changes - Yet to be versioned and released. Only available from *dev* branch until then. +* add support for minute and hourly time steps in bootstrapping functionality + (`CPP#9 <https://gitlab.irstea.fr/HYCAR-Hydro/evalhyd/evalhyd-cpp/-/issues/9>`_) v0.1.1 diff --git a/include/evalhyd/detail/uncertainty.hpp b/include/evalhyd/detail/uncertainty.hpp index af55fc2..3ea64e7 100644 --- a/include/evalhyd/detail/uncertainty.hpp +++ b/include/evalhyd/detail/uncertainty.hpp @@ -105,8 +105,41 @@ namespace evalhyd (x_timepoints >= start) && (x_timepoints < end); // check that year is complete (without a rigorous leap year check) - int n_days = xt::sum(wdw)(); - if ((n_days != 365) && (n_days != 366)) + bool complete_yr = true; + if (std::chrono::minutes(ti).count() == 1) + { + // minute timestep + int n_minutes = xt::sum(wdw)(); + if ((n_minutes != 60 * 24 * 365) && (n_minutes != 60 * 24 * 366)) + { + complete_yr = false; + } + } + else if (std::chrono::minutes(ti).count() == 60) + { + // hourly timestep + int n_hours = xt::sum(wdw)(); + if ((n_hours != 24 * 365) && (n_hours != 24 * 366)) + { + complete_yr = false; + } + } + else if (std::chrono::minutes(ti).count() == 60 * 24) + { + // daily timestep + int n_days = xt::sum(wdw)(); + if ((n_days != 365) && (n_days != 366)) + { + complete_yr = false; + } + } + else + { + throw std::runtime_error( + "time step must be minute, hourly, or daily" + ); + } + if (!complete_yr) { throw std::runtime_error( "year starting in " + std::to_string(y - 400) diff --git a/include/evalhyd/evald.hpp b/include/evalhyd/evald.hpp index 9ddeead..580b4f0 100644 --- a/include/evalhyd/evald.hpp +++ b/include/evalhyd/evald.hpp @@ -132,7 +132,9 @@ namespace evalhyd /// The date and time must be specified in a string following the /// ISO 8601-1:2019 standard, i.e. "YYYY-MM-DD hh:mm:ss" (e.g. the /// 21st of May 2007 at 4 in the afternoon is "2007-05-21 16:00:00"). - /// If provided, it is only used if *bootstrap* is also provided. + /// The time series must feature complete years. Only minute, hourly, + /// and daily time steps are supported. If provided, it is only used + /// if *bootstrap* is also provided. /// /// seed: ``int``, optional /// A value for the seed used by random generators. This parameter diff --git a/include/evalhyd/evalp.hpp b/include/evalhyd/evalp.hpp index c044120..3b5f831 100644 --- a/include/evalhyd/evalp.hpp +++ b/include/evalhyd/evalp.hpp @@ -123,7 +123,9 @@ namespace evalhyd /// The date and time must be specified in a string following the /// ISO 8601-1:2019 standard, i.e. "YYYY-MM-DD hh:mm:ss" (e.g. the /// 21st of May 2007 at 4 in the afternoon is "2007-05-21 16:00:00"). - /// If provided, it is only used if *bootstrap* is also provided. + /// The time series must feature complete years. Only minute, hourly, + /// and daily time steps are supported. If provided, it is only used + /// if *bootstrap* is also provided. /// /// seed: ``int``, optional /// A value for the seed used by random generators. This parameter -- GitLab