11from typing import Tuple
22from datetime import date , timedelta
3+ from epiweeks import Week , Year
34
45
56def 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
1422def 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+
1829def 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
0 commit comments