23
23
os .mkdir (f"{ CURRENT_DIR } /covidcast_result" )
24
24
25
25
26
- def _parse_datetimes (df : pd .DataFrame , col : str , time_type : str , date_format : str = "%Y%m%d" ) -> pd .DataFrame :
26
+ def _parse_datetimes (df : pd .DataFrame , col : str , date_format : str = "%Y%m%d" ) -> pd .Series :
27
27
"""Convert a DataFrame date or epiweek column into datetimes.
28
28
29
29
Assumes the column is string type. Dates are assumed to be in the YYYYMMDD
30
30
format by default. Weeks are assumed to be in the epiweek CDC format YYYYWW
31
31
format and return the date of the first day of the week.
32
32
"""
33
- if time_type == "day" :
34
- df [col ] = pd .to_datetime (df [col ], format = date_format )
35
- return df
36
- if time_type == "week" :
37
- df [col ] = df [col ].apply (lambda x : Week (int (x [:4 ]), int (x [- 2 :])).startdate ())
38
- df [col ] = pd .to_datetime (df [col ])
39
- return df
40
- raise ValueError (f"Unknown time_type: { time_type } " )
41
-
33
+ df [col ] = df [col ].astype ("str" )
34
+ def parse_row (row ):
35
+ if row ["time_type" ] == "day" :
36
+ return pd .to_datetime (row [col ], format = date_format )
37
+ if row ["time_type" ] == "week" :
38
+ return pd .to_datetime (Week (int (row [col ][:4 ]), int (row [col ][- 2 :])).startdate ())
39
+ return row [col ]
40
+ return df .apply (parse_row , axis = 1 )
42
41
43
42
44
43
def ported_metadata () -> Union [pd .DataFrame , None ]:
@@ -56,9 +55,8 @@ def ported_metadata() -> Union[pd.DataFrame, None]:
56
55
raise RuntimeError ("Error when fetching metadata from the API" , response ["message" ])
57
56
58
57
df = pd .DataFrame .from_dict (response ["epidata" ])
59
- time_type = df ["time_type" ].values [0 ]
60
- df = _parse_datetimes (df , "time_value" , time_type )
61
- df = _parse_datetimes (df , "issue" , time_type )
58
+ df ["min_time" ] = _parse_datetimes (df , "min_time" )
59
+ df ["max_time" ] = _parse_datetimes (df , "max_time" )
62
60
df ["last_update" ] = pd .to_datetime (df ["last_update" ], unit = "s" )
63
61
return df
64
62
@@ -139,8 +137,8 @@ def ported_signal(
139
137
api_df = pd .DataFrame .from_dict (response ["epidata" ])
140
138
if not api_df .empty :
141
139
time_type = api_df ["time_type" ].values [0 ]
142
- api_df = _parse_datetimes (api_df , "time_value" , time_type )
143
- api_df = _parse_datetimes (api_df , "issue" , time_type )
140
+ api_df [ "time_value" ] = _parse_datetimes (api_df , "time_value" )
141
+ api_df [ "issue" ] = _parse_datetimes (api_df , "issue" )
144
142
api_df .drop ("direction" , axis = 1 , inplace = True )
145
143
api_df ["data_source" ] = data_source
146
144
api_df ["signal" ] = signal
0 commit comments