diff --git a/energyplus_calibrator/__pycache__/__init__.cpython-310.pyc b/energyplus_calibrator/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index cc656954d093f4c5933f27c989dd3fa3c11b6f1c..0000000000000000000000000000000000000000 Binary files a/energyplus_calibrator/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/energyplus_calibrator/__pycache__/calibration_class.cpython-310.pyc b/energyplus_calibrator/__pycache__/calibration_class.cpython-310.pyc deleted file mode 100644 index a06ba46d2fd037c5de118254a50a2126fe8a3f69..0000000000000000000000000000000000000000 Binary files a/energyplus_calibrator/__pycache__/calibration_class.cpython-310.pyc and /dev/null differ diff --git a/energyplus_calibrator/__pycache__/energy_plus_api.cpython-310.pyc b/energyplus_calibrator/__pycache__/energy_plus_api.cpython-310.pyc deleted file mode 100644 index 62f438879a721f3c291cee585ba7cb6b7f901289..0000000000000000000000000000000000000000 Binary files a/energyplus_calibrator/__pycache__/energy_plus_api.cpython-310.pyc and /dev/null differ diff --git a/energyplus_calibrator/__pycache__/utils.cpython-310.pyc b/energyplus_calibrator/__pycache__/utils.cpython-310.pyc deleted file mode 100644 index 31985f0c4c5f92099425d6221cbe3d778021570e..0000000000000000000000000000000000000000 Binary files a/energyplus_calibrator/__pycache__/utils.cpython-310.pyc and /dev/null differ diff --git a/energyplus_calibrator/energy_plus_api.py b/energyplus_calibrator/energy_plus_api.py index 85427064dfda371278458a16fcc64fd7ecb230e7..bc08172b79b0674ace34d9b80a7145ff6c56f096 100644 --- a/energyplus_calibrator/energy_plus_api.py +++ b/energyplus_calibrator/energy_plus_api.py @@ -34,13 +34,13 @@ class EPlusSimulationSetup(SimulationSetup): _default_solver: Default solver setting _allowed_solvers: List of allowed solver options """ - sim_intervals: List[str] = Field( + sim_intervals: List[Union[str, Tuple[datetime, datetime]]] = Field( default=['2024-01-01 to 2024-01-02'], description='One or many simulation intervals in format "YYYY-MM-DD to YYYY-MM-DD"', title='sim_intervals' ) - evaluation_intervals: List[str] = Field( + evaluation_intervals: List[Union[str, Tuple[datetime, datetime]]] = Field( default=['2024-01-01 to 2024-01-02'], description='One or many evaluation intervals in format "YYYY-MM-DD to YYYY-MM-DD"', title='evaluation_intervals' @@ -50,7 +50,7 @@ class EPlusSimulationSetup(SimulationSetup): default='Timestep', description='Interval of the resulting dataframe ("Hourly" or "Timestep")', title='dataframe_interval' - ), + ) n_steps_per_hour: int = Field( default=6, @@ -63,42 +63,55 @@ class EPlusSimulationSetup(SimulationSetup): @field_validator('sim_intervals', 'evaluation_intervals') @classmethod - def check_intervals(cls, - intervals: List[str]) -> List[Tuple[datetime, datetime]]: + def check_intervals( + cls, + intervals: List[Union[str, Tuple[datetime, datetime]]]) -> List[Tuple[datetime, datetime]]: """ - Validate and convert interval strings to datetime tuples. + Validate and convert interval strings or datetime tuples. Args: - intervals: List of interval strings in format "YYYY-MM-DD to YYYY-MM-DD" + intervals: List of either: + - interval strings in format "YYYY-MM-DD to YYYY-MM-DD" + - tuples of (start_datetime, stop_datetime) Returns: - List of (start, stop) datetime tuples + List of (start_datetime, stop_datetime) tuples Raises: ValueError: If intervals are invalid or not chronologically ordered """ + if intervals is None: return intervals + _intervals = [] - for sim_interval in intervals: - if not isinstance(sim_interval, str): - return intervals - start, stop = sim_interval.split(' to ') - start = datetime.strptime(start, "%Y-%m-%d") - stop = datetime.strptime(stop, "%Y-%m-%d") + for interval in intervals: + # If already a datetime tuple, validate and add directly + if isinstance(interval, tuple): + start, stop = interval + if not (isinstance(start, datetime) and isinstance(stop, datetime)): + raise ValueError('Tuple intervals must contain datetime objects') + # If string, parse to datetime tuple + elif isinstance(interval, str): + start, stop = interval.split(' to ') + start = datetime.strptime(start, "%Y-%m-%d") + stop = datetime.strptime(stop, "%Y-%m-%d") + else: + raise ValueError('Intervals must be either strings or datetime tuples') if stop <= start: - raise ValueError('Start must be before stop in sim intervals') - + raise ValueError('Start must be before stop in intervals') + _intervals.append((start, stop)) + # Check chronological order for n in range(len(_intervals) - 1): if _intervals[n][1] > _intervals[n + 1][0]: raise ValueError( - 'When specifying sim intervals, they must be increasing in time, meaning the first' - 'simulation interval is the "oldest" interval') + 'Intervals must be increasing in time, meaning the first ' + 'interval is the "oldest" interval') - return intervals + return _intervals @field_validator('dataframe_interval') @classmethod @@ -192,8 +205,7 @@ class EnergyPlusAPI(SimulationAPI): model_name=str(model_path), n_cpu=n_cpu ) - - # set via the sim_intervals in the simulation setup + # will be set via the intervals in the simulation setup self._start_date = None self._stop_date = None @@ -299,10 +311,7 @@ class EnergyPlusAPI(SimulationAPI): _dfs = [] - for interval in self.sim_setup.sim_intervals: - start, stop = interval.split(' to ') - start = datetime.strptime(start, "%Y-%m-%d") - stop = datetime.strptime(stop, "%Y-%m-%d") + for start, stop in self.sim_setup.sim_intervals: self._start_date = start self._stop_date = stop @@ -521,10 +530,7 @@ class EnergyPlusAPI(SimulationAPI): """ _df_list = [] - for interval in self.sim_setup.evaluation_intervals: - start, stop = interval.split(' to ') - start = datetime.strptime(start, "%Y-%m-%d") - stop = datetime.strptime(stop, "%Y-%m-%d") + for start, stop in self.sim_setup.evaluation_intervals: _df = df.loc[(df.index > start) & (df.index <= stop + pd.Timedelta(days=1))].copy() _df_list.append(_df) diff --git a/examples/e1_run_energyplus_simulation.py b/examples/e1_run_energyplus_simulation.py index 2a158615a8e6756bddd9c17e7171b82661611db5..d696ab74749aa93d15f3ca90a26810935e8ef55c 100644 --- a/examples/e1_run_energyplus_simulation.py +++ b/examples/e1_run_energyplus_simulation.py @@ -18,6 +18,15 @@ def main(): '2015-01-01 to 2015-02-01' ]} + simulation_setup = {"output_interval": 600, + "sim_intervals": [ + '2015-01-01 to 2015-02-01' + ], + "evaluation_intervals": [ + '2015-01-01 to 2015-02-01' + ], + "dataframe_interval": "Hourly"} + parameters = None EP_API = EnergyPlusAPI(