Skip to content

Instantly share code, notes, and snippets.

@alessandrofelder
Last active November 2, 2022 19:56
Show Gist options
  • Save alessandrofelder/f3d431964c9cf1a6d4d9c06f821214a9 to your computer and use it in GitHub Desktop.
Save alessandrofelder/f3d431964c9cf1a6d4d9c06f821214a9 to your computer and use it in GitHub Desktop.
Sample solution: move data to YAML fixture
- generic:
time_range_1: ["2010-01-12 10:00:00", "2010-01-12 12:00:00"]
time_range_2: ["2010-01-12 10:30:00", "2010-01-12 10:45:00", 2, 60]
expected:
- ["2010-01-12 10:30:00","2010-01-12 10:37:00"]
- ["2010-01-12 10:38:00", "2010-01-12 10:45:00"]
- no_overlap:
time_range_1: ["2010-01-12 10:00:00", "2010-01-12 11:00:00"]
time_range_2: ["2010-01-12 12:30:00", "2010-01-12 12:45:00", 2, 60]
expected: []
- multiple_overlaps:
time_range_1: ["2010-01-12 10:00:00", "2010-01-12 13:00:00", 3, 900]
time_range_2: ["2010-01-12 10:40:00", "2010-01-12 11:20:00", 2, 120]
expected:
- ["2010-01-12 10:40:00","2010-01-12 10:50:00"]
- ["2010-01-12 11:05:00", "2010-01-12 11:20:00"]
- touching:
time_range_1: ["2010-01-12 10:00:00", "2010-01-12 11:00:00"]
time_range_2: ["2010-01-12 11:00:00", "2010-01-12 12:45:00"]
expected: []
import pytest
import yaml
from times import compute_overlap_time, time_range
with open("fixture.yaml", 'r') as yamlfile:
fixture = yaml.safe_load(yamlfile)
print(fixture)
@pytest.mark.parametrize("test_name", fixture)
# fixture is a list of dictionaries [{'generic':...}, {'no_overlap':...}, ...]
def test_time_range_overlap(test_name):
# test_name will be a dictionary, e.g. for the first case: {'generic': {'time_range_1':..., 'time_range2':..., 'expected':...}
properties = list(test_name.values())[0]
first_range = time_range(*properties['time_range_1'])
second_range = time_range(*properties['time_range_2'])
expected_overlap = [(start, stop) for start, stop in properties['expected']]
assert compute_overlap_time(first_range, second_range) == expected_overlap
def test_negative_time_range():
with pytest.raises(ValueError) as e:
time_range("2010-01-12 10:00:00", "2010-01-12 09:30:00")
assert e.match('The end of the time range has to come strictly after its start.')
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")
if(start_time_s>=end_time_s):
raise ValueError('The end of the time range has to come strictly after its start.')
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