Skip to content

Commit 78bf7d0

Browse files
committed
fix: timepair for week values not working
1 parent 44ee8b2 commit 78bf7d0

File tree

5 files changed

+43
-5
lines changed

5 files changed

+43
-5
lines changed

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ pandas==1.2.3
77
scipy==1.6.2
88
tenacity==7.0.0
99
newrelic
10+
epiweeks==2.1.2

src/server/_params.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44
from typing import List, Optional, Sequence, Tuple, Union
55

66
from flask import request
7-
from numpy import sign
87

98
from ._exceptions import ValidationFailedException
10-
from .utils import days_in_range
9+
from .utils import days_in_range, weeks_in_range
1110

1211

1312
def _parse_common_multi_arg(key: str) -> List[Tuple[str, Union[bool, Sequence[str]]]]:
@@ -116,6 +115,8 @@ def count(self) -> float:
116115
"""
117116
if isinstance(self.time_values, bool):
118117
return inf if self.time_values else 0
118+
if self.time_type == 'week':
119+
return sum(1 if isinstance(v, int) else weeks_in_range(v) for v in self.time_values)
119120
return sum(1 if isinstance(v, int) else days_in_range(v) for v in self.time_values)
120121

121122

src/server/utils/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
from .dates import shift_time_value, date_to_time_value, time_value_to_iso, time_value_to_date, days_in_range
1+
from .dates import shift_time_value, date_to_time_value, time_value_to_iso, time_value_to_date, days_in_range, weeks_in_range

src/server/utils/dates.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import Tuple
22
from datetime import date, timedelta
3+
from epiweeks import Week, Year
34

45

56
def time_value_to_date(value: int) -> date:
@@ -10,11 +11,21 @@ def time_value_to_date(value: int) -> date:
1011
return date.max
1112
return date(year=year, month=month, day=day)
1213

14+
def week_value_to_week(value: int) -> Week:
15+
year, week = value // 100, value % 100
16+
if year < date.min.year:
17+
return Week(date.min.year, 1)
18+
if year > date.max.year:
19+
return Week(date.max.year, 1)
20+
return Week(year=year, week=week)
1321

1422
def date_to_time_value(d: date) -> int:
1523
return int(d.strftime("%Y%m%d"))
1624

1725

26+
def week_to_time_value(w: Week) -> int:
27+
return w.year * 100 + w.week
28+
1829
def time_value_to_iso(value: int) -> str:
1930
return time_value_to_date(value).strftime("%Y-%m-%d")
2031

@@ -35,4 +46,14 @@ def days_in_range(range: Tuple[int, int]) -> int:
3546
start = time_value_to_date(range[0])
3647
end = time_value_to_date(range[1])
3748
delta = end - start
38-
return delta.days + 1 # same date should lead to 1 day that will be queried
49+
return delta.days + 1 # same date should lead to 1 day that will be queried
50+
51+
def weeks_in_range(week_range: Tuple[int, int]) -> int:
52+
start = week_value_to_week(week_range[0])
53+
end = week_value_to_week(week_range[1])
54+
acc = end.week - start.week
55+
# accumulate the number of weeks in the years between
56+
for y in range(start.year, end.year):
57+
year = Year(y)
58+
acc += year.totalweeks()
59+
return acc + 1 # same week should lead to 1 week that will be queried

tests/server/utils/test_dates.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import unittest
22
from datetime import date
3+
from epiweeks import Week
34

4-
from delphi.epidata.server.utils.dates import time_value_to_date, date_to_time_value, shift_time_value, time_value_to_iso, days_in_range
5+
from delphi.epidata.server.utils.dates import time_value_to_date, date_to_time_value, shift_time_value, time_value_to_iso, days_in_range, weeks_in_range, week_to_time_value, week_value_to_week
56

67

78
class UnitTests(unittest.TestCase):
@@ -25,3 +26,17 @@ def test_days_in_range(self):
2526
self.assertEqual(days_in_range((20201010, 20201010)), 1)
2627
self.assertEqual(days_in_range((20201010, 20201011)), 2)
2728
self.assertEqual(days_in_range((20200130, 20200203)), 5)
29+
30+
def test_weeks_in_range(self):
31+
self.assertEqual(weeks_in_range((202110, 202110)), 1)
32+
self.assertEqual(weeks_in_range((202110, 202112)), 3)
33+
self.assertEqual(weeks_in_range((202001, 202101)), 54) # 2020 has 53 weeks
34+
self.assertEqual(weeks_in_range((202101, 202204)), 56)
35+
36+
def test_week_value_to_week(self):
37+
self.assertEqual(week_value_to_week(202021), Week(2020, 21))
38+
self.assertEqual(week_value_to_week(202101), Week(2021, 1))
39+
40+
def test_week_to_time_value(self):
41+
self.assertEqual(week_to_time_value(Week(2021, 1)), 202101)
42+
self.assertEqual(week_to_time_value(Week(2020, 42)), 202042)

0 commit comments

Comments
 (0)