Skip to content

Commit bda7df9

Browse files
author
Zach Burnett
authored
add .status property to check if storm is currently being updated in real-time (#46)
* add `.status` property to check if storm is currently being updated in real-time * fix issues with backwards logic * handle case where the end date of a historical storm is `NaT`
1 parent c0b9cca commit bda7df9

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

stormevents/stormevent.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from datetime import datetime
2+
from datetime import timedelta
3+
from enum import Enum
24
from functools import lru_cache
35
from os import PathLike
46
from typing import List
@@ -24,13 +26,17 @@
2426
from stormevents.nhc import VortexTrack
2527
from stormevents.nhc.atcf import ATCF_Advisory
2628
from stormevents.nhc.atcf import ATCF_FileDeck
27-
from stormevents.nhc.atcf import ATCF_Mode
2829
from stormevents.usgs import usgs_flood_storms
2930
from stormevents.usgs import USGS_StormEvent
3031
from stormevents.utilities import relative_to_time_interval
3132
from stormevents.utilities import subset_time_interval
3233

3334

35+
class StormStatus(Enum):
36+
HISTORICAL = "historical"
37+
REALTIME = "realtime"
38+
39+
3440
class StormEvent:
3541
"""
3642
The ``StormEvent`` class can be used to retrieve data
@@ -250,6 +256,18 @@ def __data_end(self) -> datetime:
250256
data_end = VortexTrack.from_storm_name(self.name, self.year).end_date
251257
return data_end
252258

259+
@property
260+
def status(self) -> StormStatus:
261+
entry = self.__entry
262+
age = datetime.today() - entry["end_date"]
263+
if pandas.isna(entry["end_date"]) or age < timedelta(days=1):
264+
if datetime.today() - entry["start_date"] > timedelta(days=30):
265+
return StormStatus.HISTORICAL
266+
else:
267+
return StormStatus.REALTIME
268+
else:
269+
return StormStatus.HISTORICAL
270+
253271
def track(
254272
self,
255273
start_date: datetime = None,

tests/test_stormevent.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22
from datetime import datetime
33
from datetime import timedelta
44

5+
import pandas
56
import pytest
67
import shapely
78
from shapely.geometry import box
89

10+
from stormevents.nhc import nhc_storms
911
from stormevents.stormevent import StormEvent
12+
from stormevents.stormevent import StormStatus
1013
from tests import check_reference_directory
1114
from tests import OUTPUT_DIRECTORY
1215
from tests import REFERENCE_DIRECTORY
@@ -212,3 +215,27 @@ def test_storm_event_coops_product_within_region(florence2018):
212215

213216
assert null_tidal_data["t"].sizes == {}
214217
assert east_coast_tidal_data.sizes == {"nos_id": 112, "t": 1}
218+
219+
220+
def test_status():
221+
florence2018 = StormEvent("florence", 2018)
222+
paine2016 = StormEvent.from_nhc_code("EP172016")
223+
henri2021 = StormEvent.from_usgs_id(310)
224+
ida2021 = StormEvent("ida", 2021)
225+
226+
assert florence2018.status == StormStatus.HISTORICAL
227+
assert paine2016.status == StormStatus.HISTORICAL
228+
assert henri2021.status == StormStatus.HISTORICAL
229+
assert ida2021.status == StormStatus.HISTORICAL
230+
231+
storms = nhc_storms()
232+
latest_storm_entry = storms.iloc[-1]
233+
latest_storm = StormEvent.from_nhc_code(latest_storm_entry.name)
234+
age = datetime.today() - latest_storm_entry["end_date"]
235+
if pandas.isna(latest_storm_entry["end_date"]) or age < timedelta(days=1):
236+
if datetime.today() - latest_storm_entry["start_date"] > timedelta(days=30):
237+
assert latest_storm.status == StormStatus.HISTORICAL
238+
else:
239+
assert latest_storm.status == StormStatus.REALTIME
240+
else:
241+
assert latest_storm.status == StormStatus.HISTORICAL

0 commit comments

Comments
 (0)