diff --git a/stormevents/nhc/track.py b/stormevents/nhc/track.py index 0bb2dc6..b75e007 100644 --- a/stormevents/nhc/track.py +++ b/stormevents/nhc/track.py @@ -922,6 +922,29 @@ def wind_swaths(self, wind_speed: int, segments: int = 91) -> Dict[str, Polygon] return wind_swaths + @property + def forecasts(self) -> Dict[str, Dict[str, DataFrame]]: + data = self.data + + forecast_advisories = ( + advisory for advisory in pandas.unique(data['advisory']) if advisory != 'BEST' + ) + + forecasts = {} + for advisory in forecast_advisories: + advisory_data = data[data['advisory'] == advisory] + + initial_times = pandas.unique(advisory_data['datetime']) + + forecasts[advisory] = {} + for initial_time in initial_times: + forecast_data = advisory_data[advisory_data['datetime'] == initial_time] + forecasts[advisory][ + f'{pandas.to_datetime(initial_time):%Y%m%dT%H%M%S}' + ] = forecast_data.sort_values('forecast_hours') + + return forecasts + @property def duration(self) -> pandas.Timedelta: """ diff --git a/tests/test_nhc.py b/tests/test_nhc.py index b6fa49d..31c61b7 100644 --- a/tests/test_nhc.py +++ b/tests/test_nhc.py @@ -97,6 +97,16 @@ def test_vortex_track_properties(): assert len(track) == 175 +def test_vortex_track_forecasts(): + track = VortexTrack.from_storm_name('florence', 2018, file_deck='a') + + forecasts = track.forecasts + + assert len(forecasts) == 4 + assert len(forecasts['OFCL']) == 77 + assert len(forecasts['OFCL']['20180830T120000']) == 13 + + @pytest.mark.disable_socket def test_vortex_track_from_file(): input_directory = INPUT_DIRECTORY / 'test_vortex_track_from_file'