summaryrefslogtreecommitdiff
path: root/date_calculator.py
diff options
context:
space:
mode:
Diffstat (limited to 'date_calculator.py')
-rw-r--r--date_calculator.py31
1 files changed, 26 insertions, 5 deletions
diff --git a/date_calculator.py b/date_calculator.py
index befccfc..fe74827 100644
--- a/date_calculator.py
+++ b/date_calculator.py
@@ -34,6 +34,27 @@ class DateCalculator:
return rounded_periods, total_months
@staticmethod
+ def merge_periods(periods):
+ if not periods:
+ return []
+
+ periods.sort()
+ merged_periods = []
+
+ current_start, current_end, current_id = periods[0]
+
+ for start, end, id in periods[1:]:
+ if start <= current_end + timedelta(days=1):
+ current_end = max(current_end, end)
+ else:
+ merged_periods.append((current_start, current_end, current_id))
+ current_start, current_end, current_id = start, end, id
+
+ merged_periods.append((current_start, current_end, current_id))
+
+ return merged_periods
+
+ @staticmethod
def adjust_periods(periods):
"""Adjust overlapping periods without merging.
- Later periods overlapping with a previous one have their start moved to the previous end + 1 day.
@@ -123,9 +144,9 @@ class DateCalculator:
considered_full_projects = self.truncate_periods(full_projects, launch_date, prediction)
considered_half_projects = self.truncate_periods(half_projects, launch_date, prediction)
- considered_full_projects_merged = self.adjust_periods(considered_full_projects)
+ considered_full_projects_merged = self.merge_periods(considered_full_projects)
considered_full_projects_rounded, months = self.round_periods(considered_full_projects_merged)
- considered_full_projects_merged2 = self.adjust_periods(considered_full_projects_rounded)
+ considered_full_projects_merged2 = self.merge_periods(considered_full_projects_rounded)
considered_full_projects_rounded2, months = self.round_periods(considered_full_projects_merged2)
non_overlapping_half_projects = []
@@ -134,12 +155,12 @@ class DateCalculator:
self.find_non_overlapping_periods(considered_full_projects_rounded2, test_interval)
)
- considered_half_projects_merged = self.adjust_periods(non_overlapping_half_projects)
+ considered_half_projects_merged = self.merge_periods(non_overlapping_half_projects)
considered_half_projects_rounded, months2 = self.round_periods(considered_half_projects_merged)
- considered_half_projects_merged2 = self.adjust_periods(considered_half_projects_rounded)
+ considered_half_projects_merged2 = self.merge_periods(considered_half_projects_rounded)
considered_half_projects_rounded2, months2 = self.round_periods(considered_half_projects_merged2)
- all_projects_merged = self.adjust_periods(
+ all_projects_merged = self.merge_periods(
considered_full_projects_rounded2 + considered_half_projects_rounded2
)
merged_event_periods = self.adjust_periods(considered_events)