1
- from datetime import datetime , date , timedelta
1
+ from datetime import date , timedelta
2
2
from typing import List , Tuple , Union , Iterable
3
3
4
+ import numpy as np
4
5
import pandas as pd
5
6
6
7
from delphi_epidata import Epidata
8
+ from epiweeks import Week
7
9
8
10
def date_generator (startdate , enddate ):
9
11
while startdate <= enddate :
10
12
yield startdate .strftime ('%Y-%m-%d' )
11
13
startdate = startdate + timedelta (days = 1 )
12
14
13
15
16
+ def _parse_datetimes (date_int : int ,
17
+ time_type : str ,
18
+ date_format : str = "%Y%m%d" ) -> Union [pd .Timestamp ]: # annotating nan errors
19
+ """Convert a date or epiweeks string into timestamp objects.
20
+
21
+ Datetimes (length 8) are converted to their corresponding date, while epiweeks (length 6)
22
+ are converted to the date of the start of the week. Returns nan otherwise
23
+
24
+ Epiweeks use the CDC format.
25
+
26
+ :param date_int: Int representation of date.
27
+ :param date_format: String of the date format to parse.
28
+ :returns: Timestamp.
29
+ """
30
+ date_str = str (date_int )
31
+ if time_type == "day" :
32
+ return pd .to_datetime (date_str , format = date_format )
33
+ if time_type == "week" :
34
+ epiwk = Week (int (date_str [:4 ]), int (date_str [- 2 :]))
35
+ return pd .to_datetime (epiwk .startdate ())
36
+ return np .nan
14
37
15
38
def metadata ():
16
39
response = Epidata ._request ("covidcast_meta" )
@@ -21,6 +44,9 @@ def metadata():
21
44
response ["message" ])
22
45
23
46
df = pd .DataFrame .from_dict (response ["epidata" ])
47
+ df ["min_time" ] = df .apply (lambda x : _parse_datetimes (x .min_time , x .time_type ), axis = 1 )
48
+ df ["max_time" ] = df .apply (lambda x : _parse_datetimes (x .max_time , x .time_type ), axis = 1 )
49
+ df ["last_update" ] = pd .to_datetime (df ["last_update" ], unit = "s" )
24
50
return df
25
51
26
52
@@ -182,7 +208,7 @@ def signal(
182
208
)
183
209
184
210
time_values = list (date_generator (start_day , end_day ))
185
- issues = list (date_generator (start_day , end_day )) #TODO placesholder
211
+ issues = list (date_generator (start_day , end_day )) #TODO placesholder need to see how the issues params are coming in
186
212
response = Epidata .covidcast (data_source , signal , time_type = time_type ,
187
213
geo_type = geo_type , time_values = time_values ,
188
214
geo_value = geo_values , as_of = as_of ,
0 commit comments