Skip to content

Instantly share code, notes, and snippets.

@alessandrofelder
Last active November 2, 2022 19:53
Show Gist options
  • Save alessandrofelder/8c6213e83e89085344ed28da52162097 to your computer and use it in GitHub Desktop.
Save alessandrofelder/8c6213e83e89085344ed28da52162097 to your computer and use it in GitHub Desktop.
Sample solution: Parametrise those tests
from times import compute_overlap_time, time_range
@pytest.mark.parametrize("first_range, second_range, expected_overlap",
[(time_range("2010-01-12 10:00:00", "2010-01-12 12:00:00"),
time_range("2010-01-12 10:30:00", "2010-01-12 10:45:00", 2, 60),
[("2010-01-12 10:30:00","2010-01-12 10:37:00"), ("2010-01-12 10:38:00", "2010-01-12 10:45:00")]),
(time_range("2010-01-12 10:00:00", "2010-01-12 11:00:00"),
time_range("2010-01-12 12:30:00", "2010-01-12 12:45:00", 2, 60),
[]),
(time_range("2010-01-12 10:00:00", "2010-01-12 13:00:00", 3, 900),
time_range("2010-01-12 10:40:00", "2010-01-12 11:20:00", 2, 120),
[("2010-01-12 10:40:00","2010-01-12 10:50:00"), ("2010-01-12 11:05:00", "2010-01-12 11:20:00")]),
(time_range("2010-01-12 10:00:00", "2010-01-12 11:00:00"),
time_range("2010-01-12 11:00:00", "2010-01-12 12:45:00"),
[])
])
def test_time_range_overlap(first_range, second_range, expected_overlap):
assert compute_overlap_time(first_range, second_range) == expected_overlap
import datetime
def time_range(start_time, end_time, number_of_intervals=1, gap_between_intervals_s=0):
start_time_s = datetime.datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S")
end_time_s = datetime.datetime.strptime(end_time, "%Y-%m-%d %H:%M:%S")
d = (end_time_s - start_time_s).total_seconds() / number_of_intervals + gap_between_intervals_s * (1 / number_of_intervals - 1)
sec_range = [(start_time_s + datetime.timedelta(seconds=i * d + i * gap_between_intervals_s),
start_time_s + datetime.timedelta(seconds=(i + 1) * d + i * gap_between_intervals_s))
for i in range(number_of_intervals)]
return [(ta.strftime("%Y-%m-%d %H:%M:%S"), tb.strftime("%Y-%m-%d %H:%M:%S")) for ta, tb in sec_range]
def compute_overlap_time(range1, range2):
overlap_time = []
for start1, end1 in range1:
for start2, end2 in range2:
# both ranges need to start before the other ends, otherwise there is no overlap!
if start1 <= end2 and start2 <= end1:
low = max(start1, start2)
high = min(end1, end2)
if high == low:
continue
overlap_time.append((low, high))
return overlap_time
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment