From 7f212e209df0abf599c041a585353c7e08f683a6 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Tue, 26 Oct 2021 19:35:10 +0800 Subject: [PATCH 1/6] Added the time scale of weekly to meterenergy --- myems-api/core/utilities.py | 68 +++++++++++++++++++++++++++++++- myems-api/reports/meterenergy.py | 6 ++- 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/myems-api/core/utilities.py b/myems-api/core/utilities.py index 66aa209d..1fa01ae0 100644 --- a/myems-api/core/utilities.py +++ b/myems-api/core/utilities.py @@ -19,7 +19,7 @@ def aggregate_hourly_data_by_period(rows_hourly, start_datetime_utc, end_datetim if start_datetime_utc is None or \ end_datetime_utc is None or \ start_datetime_utc >= end_datetime_utc or \ - period_type not in ('hourly', 'daily', 'monthly', 'yearly'): + period_type not in ('hourly', 'daily', 'weekly', 'monthly', 'yearly'): return list() start_datetime_utc = start_datetime_utc.replace(tzinfo=None) @@ -45,7 +45,7 @@ def aggregate_hourly_data_by_period(rows_hourly, start_datetime_utc, end_datetim result_rows_daily = list() # todo: add config.working_day_start_time_local # todo: add config.minutes_to_count - # calculate the start datetime in utc of the first day in local + # calculate the start datetime in utc of the first day in the first month in local start_datetime_local = start_datetime_utc + timedelta(hours=int(config.utc_offset[1:3])) current_datetime_utc = start_datetime_local.replace(hour=0) - timedelta(hours=int(config.utc_offset[1:3])) while current_datetime_utc <= end_datetime_utc: @@ -58,6 +58,70 @@ def aggregate_hourly_data_by_period(rows_hourly, start_datetime_utc, end_datetim return result_rows_daily + elif period_type == 'weekly': + result_rows_weekly = list() + # todo: add config.working_day_start_time_local + # todo: add config.minutes_to_count + # calculate the start datetime in utc of the first day in the first month in local + start_datetime_local = start_datetime_utc + timedelta(hours=int(config.utc_offset[1:3])) + weekday = start_datetime_local.weekday() + current_datetime_utc = \ + start_datetime_local.replace(hour=0) - timedelta(days=weekday, hours=int(config.utc_offset[1:3])) + while current_datetime_utc <= end_datetime_utc: + # calculate the next datetime in utc + current_year = 0 + current_month = 0 + current_day = 0 + if current_datetime_utc.day <= 21: + current_day = current_datetime_utc.day + 7 + else: + if current_datetime_utc.month in [1, 3, 5, 7, 8, 10]: + if current_datetime_utc.day <= 24: + current_day = current_datetime_utc.day + 7 + else: + current_month = current_datetime_utc.month + 1 + current_day = 7 - (31 - current_datetime_utc.day) + elif current_datetime_utc.month == 2: + temp_day = 28 + ny = current_datetime_utc.year + if (ny % 100 != 0 and ny % 4 == 0) or (ny % 100 == 0 and ny % 400 == 0): + temp_day = 29 + if current_datetime_utc.day <= (temp_day - 7): + current_day = current_datetime_utc.day + 7 + else: + current_month = current_datetime_utc.month + 1 + current_day = 7 - (30 - current_datetime_utc.day) + elif current_datetime_utc.month in [4, 6, 9, 11]: + if current_datetime_utc.day <= 23: + current_day = current_datetime_utc.day + 7 + else: + current_month = current_datetime_utc.month + 1 + current_day = 7 - (30 - current_datetime_utc.day) + elif current_datetime_utc.month == 12: + if current_datetime_utc.day <= 24: + current_day = current_datetime_utc.day + 7 + else: + current_year = current_datetime_utc.year + 1 + current_month = 1 + current_day = 7 - (31 - current_datetime_utc.day) + + next_datetime_utc = datetime(year=current_year if current_year != 0 else current_datetime_utc.year, + month=current_month if current_month != 0 else current_datetime_utc.month, + day=current_day if current_day != 0 else current_datetime_utc.day, + hour=current_datetime_utc.hour, + minute=current_datetime_utc.minute, + second=0, + microsecond=0, + tzinfo=None) + subtotal = Decimal(0.0) + for row in rows_hourly: + if current_datetime_utc <= row[0] < next_datetime_utc: + subtotal += row[1] + result_rows_weekly.append((current_datetime_utc, subtotal)) + current_datetime_utc = next_datetime_utc + + return result_rows_weekly + elif period_type == "monthly": result_rows_monthly = list() # todo: add config.working_day_start_time_local diff --git a/myems-api/reports/meterenergy.py b/myems-api/reports/meterenergy.py index 4c6625d0..681beb7e 100644 --- a/myems-api/reports/meterenergy.py +++ b/myems-api/reports/meterenergy.py @@ -53,7 +53,7 @@ class Reporting: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_PERIOD_TYPE') else: period_type = str.strip(period_type) - if period_type not in ['hourly', 'daily', 'monthly', 'yearly']: + if period_type not in ['hourly', 'daily', 'weekly', 'monthly', 'yearly']: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_PERIOD_TYPE') timezone_offset = int(config.utc_offset[1:3]) * 60 + int(config.utc_offset[4:6]) @@ -208,6 +208,8 @@ class Reporting: current_datetime = current_datetime_local.strftime('%Y-%m-%dT%H:%M:%S') elif period_type == 'daily': current_datetime = current_datetime_local.strftime('%Y-%m-%d') + elif period_type == 'weekly': + current_datetime = current_datetime_local.strftime('%Y-%m-%d') elif period_type == 'monthly': current_datetime = current_datetime_local.strftime('%Y-%m') elif period_type == 'yearly': @@ -250,6 +252,8 @@ class Reporting: current_datetime = current_datetime_local.strftime('%Y-%m-%dT%H:%M:%S') elif period_type == 'daily': current_datetime = current_datetime_local.strftime('%Y-%m-%d') + elif period_type == 'weekly': + current_datetime = current_datetime_local.strftime('%Y-%m-%d') elif period_type == 'monthly': current_datetime = current_datetime_local.strftime('%Y-%m') elif period_type == 'yearly': From 88eb2dfc07cbafb2f98ccdfb68e208bf68e0aba9 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Wed, 27 Oct 2021 09:29:33 +0800 Subject: [PATCH 2/6] simplified code --- myems-api/core/utilities.py | 61 ++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/myems-api/core/utilities.py b/myems-api/core/utilities.py index 1fa01ae0..9224343c 100644 --- a/myems-api/core/utilities.py +++ b/myems-api/core/utilities.py @@ -72,38 +72,37 @@ def aggregate_hourly_data_by_period(rows_hourly, start_datetime_utc, end_datetim current_year = 0 current_month = 0 current_day = 0 - if current_datetime_utc.day <= 21: - current_day = current_datetime_utc.day + 7 + + # Calculate the number of days per month + if current_datetime_utc.month in [1, 3, 5, 7, 8, 10, 12]: + temp_day = 31 + elif current_datetime_utc.month in [4, 6, 9, 11]: + temp_day = 30 + elif current_datetime_utc.month == 2: + temp_day = 28 + ny = current_datetime_utc.year + if (ny % 100 != 0 and ny % 4 == 0) or (ny % 100 == 0 and ny % 400 == 0): + temp_day = 29 else: - if current_datetime_utc.month in [1, 3, 5, 7, 8, 10]: - if current_datetime_utc.day <= 24: - current_day = current_datetime_utc.day + 7 - else: - current_month = current_datetime_utc.month + 1 - current_day = 7 - (31 - current_datetime_utc.day) - elif current_datetime_utc.month == 2: - temp_day = 28 - ny = current_datetime_utc.year - if (ny % 100 != 0 and ny % 4 == 0) or (ny % 100 == 0 and ny % 400 == 0): - temp_day = 29 - if current_datetime_utc.day <= (temp_day - 7): - current_day = current_datetime_utc.day + 7 - else: - current_month = current_datetime_utc.month + 1 - current_day = 7 - (30 - current_datetime_utc.day) - elif current_datetime_utc.month in [4, 6, 9, 11]: - if current_datetime_utc.day <= 23: - current_day = current_datetime_utc.day + 7 - else: - current_month = current_datetime_utc.month + 1 - current_day = 7 - (30 - current_datetime_utc.day) - elif current_datetime_utc.month == 12: - if current_datetime_utc.day <= 24: - current_day = current_datetime_utc.day + 7 - else: - current_year = current_datetime_utc.year + 1 - current_month = 1 - current_day = 7 - (31 - current_datetime_utc.day) + temp_day = 0 + + # Avoid incorrect month parameter + try: + if temp_day == 0: + raise ValueError("wrong month") + except ValueError: + print("current_datetime_utc is incorrect") + + # Calculate year, month and day parameters + if current_datetime_utc.day <= temp_day - 7: + current_day = current_datetime_utc.day + 7 + elif current_datetime_utc.month == 12: + current_year = current_datetime_utc.year + 1 + current_month = 1 + current_day = 7 - (temp_day - current_datetime_utc.day) + else: + current_month = current_datetime_utc.month + 1 + current_day = 7 - (temp_day - current_datetime_utc.day) next_datetime_utc = datetime(year=current_year if current_year != 0 else current_datetime_utc.year, month=current_month if current_month != 0 else current_datetime_utc.month, From 21901667cba6d38b010597bb640da171fec335a2 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Wed, 27 Oct 2021 09:51:34 +0800 Subject: [PATCH 3/6] simplified code --- myems-api/core/utilities.py | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/myems-api/core/utilities.py b/myems-api/core/utilities.py index 9224343c..e8123547 100644 --- a/myems-api/core/utilities.py +++ b/myems-api/core/utilities.py @@ -1,3 +1,4 @@ +import calendar from datetime import datetime, timedelta import mysql.connector import collections @@ -71,27 +72,9 @@ def aggregate_hourly_data_by_period(rows_hourly, start_datetime_utc, end_datetim # calculate the next datetime in utc current_year = 0 current_month = 0 - current_day = 0 # Calculate the number of days per month - if current_datetime_utc.month in [1, 3, 5, 7, 8, 10, 12]: - temp_day = 31 - elif current_datetime_utc.month in [4, 6, 9, 11]: - temp_day = 30 - elif current_datetime_utc.month == 2: - temp_day = 28 - ny = current_datetime_utc.year - if (ny % 100 != 0 and ny % 4 == 0) or (ny % 100 == 0 and ny % 400 == 0): - temp_day = 29 - else: - temp_day = 0 - - # Avoid incorrect month parameter - try: - if temp_day == 0: - raise ValueError("wrong month") - except ValueError: - print("current_datetime_utc is incorrect") + temp_day = calendar.monthrange(current_datetime_utc.year, current_datetime_utc.month)[1] # Calculate year, month and day parameters if current_datetime_utc.day <= temp_day - 7: @@ -106,7 +89,7 @@ def aggregate_hourly_data_by_period(rows_hourly, start_datetime_utc, end_datetim next_datetime_utc = datetime(year=current_year if current_year != 0 else current_datetime_utc.year, month=current_month if current_month != 0 else current_datetime_utc.month, - day=current_day if current_day != 0 else current_datetime_utc.day, + day=current_day, hour=current_datetime_utc.hour, minute=current_datetime_utc.minute, second=0, From fedcb71d3f503c41a4950f550cf79c072665a3ea Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Wed, 27 Oct 2021 09:54:59 +0800 Subject: [PATCH 4/6] Modified comments --- myems-api/core/utilities.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/myems-api/core/utilities.py b/myems-api/core/utilities.py index e8123547..1baba551 100644 --- a/myems-api/core/utilities.py +++ b/myems-api/core/utilities.py @@ -46,7 +46,7 @@ def aggregate_hourly_data_by_period(rows_hourly, start_datetime_utc, end_datetim result_rows_daily = list() # todo: add config.working_day_start_time_local # todo: add config.minutes_to_count - # calculate the start datetime in utc of the first day in the first month in local + # calculate the start datetime in utc of the first day in local start_datetime_local = start_datetime_utc + timedelta(hours=int(config.utc_offset[1:3])) current_datetime_utc = start_datetime_local.replace(hour=0) - timedelta(hours=int(config.utc_offset[1:3])) while current_datetime_utc <= end_datetime_utc: From 0c1a2d9ab8e554a7bfb818103ed317272ec10596 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Wed, 27 Oct 2021 10:05:35 +0800 Subject: [PATCH 5/6] Modified comments --- myems-api/core/utilities.py | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/myems-api/core/utilities.py b/myems-api/core/utilities.py index 1baba551..96f0b4d6 100644 --- a/myems-api/core/utilities.py +++ b/myems-api/core/utilities.py @@ -69,32 +69,9 @@ def aggregate_hourly_data_by_period(rows_hourly, start_datetime_utc, end_datetim current_datetime_utc = \ start_datetime_local.replace(hour=0) - timedelta(days=weekday, hours=int(config.utc_offset[1:3])) while current_datetime_utc <= end_datetime_utc: - # calculate the next datetime in utc - current_year = 0 - current_month = 0 - # Calculate the number of days per month - temp_day = calendar.monthrange(current_datetime_utc.year, current_datetime_utc.month)[1] + next_datetime_utc = current_datetime_utc + timedelta(days=7) - # Calculate year, month and day parameters - if current_datetime_utc.day <= temp_day - 7: - current_day = current_datetime_utc.day + 7 - elif current_datetime_utc.month == 12: - current_year = current_datetime_utc.year + 1 - current_month = 1 - current_day = 7 - (temp_day - current_datetime_utc.day) - else: - current_month = current_datetime_utc.month + 1 - current_day = 7 - (temp_day - current_datetime_utc.day) - - next_datetime_utc = datetime(year=current_year if current_year != 0 else current_datetime_utc.year, - month=current_month if current_month != 0 else current_datetime_utc.month, - day=current_day, - hour=current_datetime_utc.hour, - minute=current_datetime_utc.minute, - second=0, - microsecond=0, - tzinfo=None) subtotal = Decimal(0.0) for row in rows_hourly: if current_datetime_utc <= row[0] < next_datetime_utc: From 5f285d79391d20aeb3d46785099109dc6be8d2d7 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 28 Oct 2021 21:53:24 +0800 Subject: [PATCH 6/6] updated commments in aggregate_hourly_data_by_period of API --- myems-api/core/utilities.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/myems-api/core/utilities.py b/myems-api/core/utilities.py index 96f0b4d6..01305856 100644 --- a/myems-api/core/utilities.py +++ b/myems-api/core/utilities.py @@ -12,7 +12,7 @@ import statistics # rows_hourly: list of (start_datetime_utc, actual_value), should belong to one energy_category_id # start_datetime_utc: start datetime in utc # end_datetime_utc: end datetime in utc -# period_type: one of the following period types, 'hourly', 'daily', 'monthly' and 'yearly' +# period_type: one of the following period types, 'hourly', 'daily', 'weekly', 'monthly' and 'yearly' # Note: this procedure doesn't work with multiple energy categories ######################################################################################################################## def aggregate_hourly_data_by_period(rows_hourly, start_datetime_utc, end_datetime_utc, period_type): @@ -63,7 +63,7 @@ def aggregate_hourly_data_by_period(rows_hourly, start_datetime_utc, end_datetim result_rows_weekly = list() # todo: add config.working_day_start_time_local # todo: add config.minutes_to_count - # calculate the start datetime in utc of the first day in the first month in local + # calculate the start datetime in utc of the monday in the first week in local start_datetime_local = start_datetime_utc + timedelta(hours=int(config.utc_offset[1:3])) weekday = start_datetime_local.weekday() current_datetime_utc = \ @@ -166,7 +166,7 @@ def aggregate_hourly_data_by_period(rows_hourly, start_datetime_utc, end_datetim result_rows_yearly = list() # todo: add config.working_day_start_time_local # todo: add config.minutes_to_count - # calculate the start datetime in utc of the first day in the first month in local + # calculate the start datetime in utc of the first day in the first year in local start_datetime_local = start_datetime_utc + timedelta(hours=int(config.utc_offset[1:3])) current_datetime_utc = start_datetime_local.replace(month=1, day=1, hour=0) - timedelta( hours=int(config.utc_offset[1:3]))