Skip to contents

This vignette provides more details on how the noaastormevents package interacts with the online NOAA Storm Events database to pull storm event listings based on user queries.

Structure of NOAA Storm Events data

The NOAA Storm Events data is available online at https://www.ncdc.noaa.gov/stormevents/. That website includes documentation on the data, as well as a page that allows bulk data download of yearly csv files either through ftp or http (https://www.ncdc.noaa.gov/stormevents/ftp.jsp). Data is available from January 1950 and tends to be updated to within a few months of present.

Data is stored in bulk by year in compressed comma-separated files (.csv.gz files). Each year has three compressed files available:

  • StormEvents_details file
  • StormEvents_fatalities file
  • StormEvents_loations file

File names for each file include both the year of the data (e.g., “1950”) and the date the file was last modified (e.g., “20170120”). Files are given regular names other than these two specifications. This regular naming scheme allows us to use regular expressions in code within the noaastormevents package on all listed file names to identify the exact name of a file for a specific year, as explained in the next section.

The size of all three file types has increased with time (see figure below; note that the y-axis is log 10). The largest file for any given year is the “Details” file. Most file sizes increased substantially in 1996 (dotted vertical line), when the database dramatically expanded the types of events it included. Before 1996, the database covered tornadoes and, for some years, a few other types of events. From 1996, the database expanded to include events like floods, tropical storms, snow storms, etc. While “Locations” files exist in the database for early years, they contain no information until 1996. See the documentation at the NOAA Storm Events database website for more information on the coverage of the database at different times across its history.

Downloading NOAA Storm Events data for a year

The database data is stored in files separated by year, so the file for an entire year is identified and downloaded when a user asks for event listings from any time or any type of event that year. For example, if a user wants to list flood events from the week of Hurricane Floyd in 1999, functions in the noaastormevents package would first identify and download the full “Details” data file for 1999 and then filter down to flood events starting in the correct week.

To identify the online file path for a specific year, the find_file_name function in the noaastormevents package uses the htmltab function (from the package of the same name) to create a dataframe listing all files available for download from the NOAA Storm Events database. The function then uses regular expressions to identify the file name in that listing for the requested year. For example, the name of the file with “Details” information for 1999 can be determined with:

find_file_name(year = "1999", file_type = "detail")
## [1] "StormEvents_details-ftp_v1.0_d1999_c20220425.csv.gz"

Here is the full definition of the find_file_name function:

find_file_name
## function (year = NULL, file_type = "details") 
## {
##     url <- paste0("https://www1.ncdc.noaa.gov/pub/data/swdi/", 
##         "stormevents/csvfiles/")
##     page <- readLines(curl::curl(url))
##     all_file_names <- XML::getHTMLLinks(page)
##     file_year <- paste0("_d", year, "_")
##     file_name <- grep(file_type, grep(file_year, all_file_names, 
##         value = TRUE), value = TRUE)
##     if (length(file_name) == 0) {
##         stop("No file found for that year and / or file type.")
##     }
##     return(file_name)
## }
## <bytecode: 0x7fb8a2e30c28>
## <environment: namespace:noaastormevents>

Typically, this function will only be used internally rather than called directly by a user.

Once the file name has been determined, a function in the package then downloads that file to the user’s computer. For some years, files are very large, so this download can take a little while. To avoid downloading data from the same year more than once within an R session, the downloading function stores the downloaded data for that year in a temporary environment in the R user’s session. In later requests for the same year, the function will first check for data from this year in the temporary environment and only download the data from the online database if it is not already available on the user’s computer.

This environment is created to be temporary, which means that it is deleted at the end of the current R session. While some packages that access online databases cache any downloaded data in a way that persists between R sessions, we chose not to do that and instead only cache within an R session, but delete all data at the close of the R session. This is because some of the Storm Event files are very large, and most users will likely only want to keep a small subset of the data for a given year (e.g., only flood events during the week of Hurricane Floyd). It would be wasteful of memory to cache all the 1999 data indefinitely on the user’s computer in this case; instead, the user should use our package to create the desired subset of the data and then explicitly store that subset locally to use in future analysis.

The function for downloading the file for a year is called download_storm_data. Here is it’s full definition:

noaastormevents:::download_storm_data
## function (year, file_type = "details") 
## {
##     file_name <- find_file_name(year = year, file_type = file_type)
##     path_name <- paste0("https://www1.ncdc.noaa.gov/pub/data/swdi/stormevents/", 
##         "csvfiles/", file_name)
##     if (!exists("noaastormevents_package_env")) {
##         temp <- tempfile()
##         utils::download.file(path_name, temp)
##         noaastormevents_package_env <<- new.env()
##         noaastormevents_package_env$lst <- list()
##         noaastormevents_package_env$lst[[as.character(year)]] <- suppressWarnings(utils::read.csv(gzfile(temp), 
##             as.is = TRUE))
##         unlink(temp)
##     }
##     else if (is.null(noaastormevents_package_env$lst[[as.character(year)]])) {
##         temp <- tempfile()
##         utils::download.file(path_name, temp)
##         noaastormevents_package_env$lst[[as.character(year)]] <- suppressWarnings(utils::read.csv(gzfile(temp), 
##             as.is = TRUE))
##         unlink(temp)
##     }
##     return(NULL)
## }
## <bytecode: 0x7fb8a122c998>
## <environment: namespace:noaastormevents>

Finally, the noaastormevents package allows a user to query storm events either by a date range or by a named historical tropical storm, rather than a year. The create_storm_data function inputs either a date range or a storm name, as well as the requested file type, and downloads data for the appropriate year or years. If the user requests a date range, the function will download yearly data files for all years included in that range. If the user requests a tropical storm, the function will pull the data for that particular year. Here is the full definition of create_storm_data:

create_storm_data
## function (date_range = NULL, storm = NULL, file_type = "details") 
## {
##     if (!is.null(date_range)) {
##         date_range_years <- lubridate::year(date_range)
##         requested_years <- seq(from = date_range_years[1], to = date_range_years[2])
##         lapply(requested_years, download_storm_data)
##         for (i in 1:length(requested_years)) {
##             requested_year <- as.character(requested_years[i])
##             if (i == 1) {
##                 storm_data <- noaastormevents_package_env$lst[[requested_year]]
##             }
##             else {
##                 storm_data <- rbind(storm_data, noaastormevents_package_env$lst[[requested_year]])
##             }
##         }
##     }
##     else if (!is.null(storm)) {
##         storm_year <- stringr::str_extract(storm, "\\-[0-9].+") %>% 
##             stringr::str_remove("\\-")
##         download_storm_data(year = storm_year, file_type = file_type)
##         storm_data <- noaastormevents_package_env$lst[[as.character(storm_year)]]
##     }
##     else {
##         stop("You must specify either `date_range` or `storm`.")
##     }
##     storm_data <- tibble::as_tibble(storm_data)
##     return(storm_data)
## }
## <bytecode: 0x7fb8a297e730>
## <environment: namespace:noaastormevents>

As a note, many of the functions in the noaastormevents package that allow linking events with tropical storms rely on historical data for the storms, including storm tracks, estimated distances to eastern U.S. counties, and dates when the storm was closest to each county. The package pulls this historical data from the hurricaneexposuredata package, through the interfacing package hurricaneexposure. The hurricane data goes from 1988 to (currently) 2015 and includes all Atlantic basin tropical storms that came within 250 km of at least one U.S. county. The following storms are included in that package and so available to be used for functions in noaastormevents:

Year Storms
1988 Alberto, Beryl, Chris, Florence, Gilbert, Keith, AL13, AL14, AL17
1989 Allison, Chantal, Hugo, Jerry
1990 AL01, Bertha, Marco
1991 Ana, Bob, Fabian, AL12
1992 AL02, Andrew, Danielle, Earl
1993 AL01, Arlene, Emily
1994 Alberto, AL02, Beryl, Gordon
1995 Allison, Dean, Erin, Gabrielle, Jerry, Opal
1996 Arthur, Bertha, Edouard, Fran, Josephine
1997 AL01, Ana, Danny
1998 Bonnie, Charley, Earl, Frances, Georges, Hermine, Mitch
1999 Bret, Dennis, AL07, Floyd, Harvey, Irene
2000 AL04, Beryl, AL09, Gordon, Helene, Leslie
2001 Allison, Barry, Gabrielle, Karen, Michelle
2002 Arthur, Bertha, Cristobal, Edouard, Fay, Gustav, Hanna, Isidore, Kyle, Lili
2003 Bill, Claudette, AL07, Erika, Grace, Henri, Isabel
2004 Alex, Bonnie, Charley, Frances, Gaston, Hermine, Ivan, Jeanne, Matthew
2005 Arlene, Cindy, Dennis, Emily, Katrina, Ophelia, Rita, Tammy, Twenty-Two, Wilma
2006 Alberto, Beryl, Chris, Ernesto
2007 Andrea, Barry, Erin, Gabrielle, Humberto, Ten, Noel
2008 Cristobal, Dolly, Edouard, Fay, Gustav, Hanna, Ike, Kyle, Paloma
2009 One, Claudette, Ida
2010 Alex, Two, Bonnie, Five, Earl, Hermine, Nicole, Paula
2011 Bret, Don, Emily, Irene, Lee
2012 Alberto, Beryl, Debby, Isaac, Sandy
2013 Andrea, Dorian, Karen
2014 Arthur
2015 Ana, Bill, Claudette
2016 Bonnie, Colin, Eight, Hermine, Julia, Matthew
2017 Cindy, Emily, Harvey, Irma, Jose, Nate, Philippe
2018 Alberto, Chris, Florence, Gordon, Michael
2019 Barry, Three, Dorian, Fernand, Imelda, Melissa, Nestor, Olga
2020 Arthur, Bertha, Cristobal, Fay, Hanna, Isaias, Kyle, Laura, Marco, Omar, Sally, Beta, Delta, Zeta, Eta
2021 Bill, Claudette, Danny, Elsa, Fred, Henri, Ida, Mindy, Nicholas, Odette, Wanda

Structure of “Details” data files

While the noaastormevent package focuses on higher-level functions, which result in a simplified and cleaned version of this storm events data, a user can use the create_storm_data function to pull the full dataset for a year into R and work with the raw, uncleaned version. For example, here is a call that pulls the raw data for 2015 into an R object called events_2015.

events_2015 <- create_storm_data(date_range = c("2015-01-01", "2015-12-31"))
slice(events_2015, 1:3)
## # A tibble: 3 × 51
##   BEGIN_YEARMONTH BEGIN_DAY BEGIN_TIME END_YEARMONTH END_DAY END_TIME EPISODE_ID
##             <int>     <int>      <int>         <int>   <int>    <int>      <int>
## 1          201501        27       1200        201501      28      400      92561
## 2          201501        24        700        201501      24     2100      92625
## 3          201501        27        600        201501      27     1200      92561
## # ℹ 44 more variables: EVENT_ID <int>, STATE <chr>, STATE_FIPS <int>,
## #   YEAR <int>, MONTH_NAME <chr>, EVENT_TYPE <chr>, CZ_TYPE <chr>,
## #   CZ_FIPS <int>, CZ_NAME <chr>, WFO <chr>, BEGIN_DATE_TIME <chr>,
## #   CZ_TIMEZONE <chr>, END_DATE_TIME <chr>, INJURIES_DIRECT <int>,
## #   INJURIES_INDIRECT <int>, DEATHS_DIRECT <int>, DEATHS_INDIRECT <int>,
## #   DAMAGE_PROPERTY <chr>, DAMAGE_CROPS <chr>, SOURCE <chr>, MAGNITUDE <dbl>,
## #   MAGNITUDE_TYPE <chr>, FLOOD_CAUSE <chr>, CATEGORY <int>, …

This raw data has 51 columns. This includes:

  • the date and time of the beginning and end of the event (BEGIN_YEARMONTH, BEGIN_DAY, BEGIN_TIME, BEGIN_DATE_TIME, END_YEARMONTH, END_DAY, END_TIME, END_DATE_TIME)
  • unique IDs for the event and the episode, which can be used to link listings for events and episodes across the three types of files (“details”, “locations”, and “fatalities”) (EPISODE_ID, EVENT_ID). Note that there are more unique event IDs (57,779 for the 2015 events data) than unique episode IDs (9,511 for the 2015 events data)
  • the type of event (EVENT_TYPE)
  • the location of the event (CZ_TYPE, CZ_FIPS, CZ_NAME, BEGIN_AZIMUTH, BEGIN_LOCATION, END_LOCATION, END_AZIMUTH, BEGIN_LAT, BEGIN_LON, END_LAT, END_LON)
  • description and impacts of the event (EPISODE_NARRATIVE, EVENT_NARRATIVE, INJURIES_DIRECT, INJURIES_INDIRECT, DEATHS_DIRECT, DEATHS_INDIRECT, DAMAGE_PROPERTY, DAMAGE_CROPS)
  • information on how the event was reported (SOURCE)
  • some metrics that are specific to event types (e.g., FLOOD_CAUSE, CATEGORY, TOR_F_SCALE, TOR_LENGTH, TOR_WIDTH)

Event types

The following sections provide some summary statistics for data from this database for a single year (2015), to help users better understand the available data. Users may want to conduct similar data analysis themselves with the set of data they pull from the NOAA Storm Events database relevant to a particular research project. The code from this vignette (available at the package’s GitHub repository) can serve as a starting point for that.

In the 2015 event listings, here are the types of events and the number of reported events for each:

Event type Number of events in 2015
Thunderstorm Wind 14,400
Hail 9,398
Flash Flood 5,063
Winter Weather 4,242
Winter Storm 3,605
Flood 2,587
Heavy Snow 2,557
High Wind 2,192
Marine Thunderstorm Wind 1,880
Heavy Rain 1,518
Drought 1,397
Tornado 1,320
Cold/Wind Chill 925
Extreme Cold/Wind Chill 853
Dense Fog 819
Strong Wind 711
High Surf 561
Lightning 403
Heat 397
Funnel Cloud 362
Blizzard 349
Frost/Freeze 345
Ice Storm 327
Excessive Heat 325
Wildfire 284
Coastal Flood 270
Waterspout 240
Sleet 95
Astronomical Low Tide 80
Rip Current 68
Lake-Effect Snow 63
Debris Flow 54
Tropical Storm 49
Dust Storm 41
Avalanche 27
Marine High Wind 24
Marine Hail 19
Dust Devil 10
Freezing Fog 10
Marine Strong Wind 9
Hurricane (Typhoon) 7
Seiche 6
Storm Surge/Tide 4
Tropical Depression 4
Dense Smoke 2
Marine Dense Fog 2
Sneakerwave 1
Tsunami 1

Here are how the start dates for listings for each event type are distributed over the year (event types are ordered by decreasing total count during the year; note that the y-axes vary depending on the range of events by date for each event type):

## `summarise()` has grouped output by 'date'. You can override using the
## `.groups` argument.

Many event types are clearly seasonal (e.g., winter weather, winter storms, heavy snow, cold, extreme cold, blizzards, ice storms, lake-effect snow, and avalanches are all much more common during winter months, while tropical depressions and tropical storms are all limited to the hurricane season). However, for some events, reporting seasonal patterns might be based not just on the true pattern of events but also on the timing of important exposures and impacts of the events. For example, rip currents have many more listings during the spring and summer, which may be related to events being more likely to be listed when more people are swimming. Frost event listings are particularly high at the start and end of the frost season, rather than in the middle of winter, which may be related to the impacts of frost on crops being higher in spring and fall than during the winter. If working with this data, it important to keep in mind that the data are based on reporting, and there may be related influences on the probability of an event being reported and included in the data that differ from using data from something like a weather station.

Episodes versus events

“Episodes” seem to collect related “events”, where events can vary in the type or location of the event, while an “episode” collects events that belong to the same large system. The following graph shows, for each episode listed in 2015, the number of events listed for the episode (x-axis) and the size (in days) of the range of begin dates across events in the episode.

An episode will never include events in more than one state, so a large weather system could potentially be described by multiple episodes in different states:

events_2015 %>% 
  select(EPISODE_ID, STATE) %>% 
  group_by(EPISODE_ID) %>% 
  summarize(n_states = length(unique(STATE))) %>% 
  ungroup() %>% 
  summarize(max_n_states = max(n_states))
## # A tibble: 1 × 1
##   max_n_states
##          <int>
## 1            1

Here are maps with the beginning locations of events in the episodes with the most events in 2015. Note that the beginning latitude and longitude are not listed for every event, resulting in one of the episodes not having any points on the map. From the other maps, it is clear that events within the episode were fairly close together.

For these episodes with the most events in 2015, the following graph shows the number of events reported for the episode. One of the episodes was a winter storm, another was heavy rains and floods, while the rest of the episodes included high winds, hail, tornadoes, rain, and / or flooding.

Once we removed event types with less that 50 listings in 2015, we did a cluster analysis of event types, to group events that are more likely to occur together within an episode. The following plot shows the resulting cluster structure of these event types.

The next graph shows the number of events of each event type (excluding event types with less than 50 total listings in 2015). Each row represents an episode.

How events are reported

The SOURCE column of the raw data gives information on how each event was reported.

Source of event report Number of events reported in 2015
Trained Spotter 9,904
Public 6,967
Law Enforcement 5,318
Emergency Manager 5,236
Mesonet 3,386
COOP Observer 2,952
911 Call Center 2,439
Broadcast Media 2,132
ASOS 1,918
Department of Highways 1,894
Amateur Radio 1,422
Social Media 1,356
AWOS 1,312
Official NWS Observations 1,102
State Official 1,065
NWS Storm Survey 1,058
Drought Monitor 1,034
CoCoRaHS 987
NWS Employee 840
Newspaper 715
Fire Department/Rescue 682
River/Stream Gage 643
Storm Chaser 528
Other Federal Agency 494
C-MAN Station 360
County Official 295
RAWS 282
SNOTEL 266
SHAVE Project 241
Park/Forest Service 229
Utility Company 171
Buoy 149
WLON 134
Unknown 93
AWSS 72
Local Official 58
Post Office 48
Lifeguard 38
Coast Guard 28
Airplane Pilot 24
Mariner 23
Insurance Company 7
Tribal Official 4

The majority of events in this database, at least for 2015, were reported by either a trained spotter or the public.

The following graph shows, for each type of event in 2015, the percent reported by each source. For some types of events, reporting is dominated by a specific source. For example, most high surf reports come from trained spotters, while most drought reports come from drought monitors and most tornado reports come from the NWS Storm Survey. For other types of events, reporting sources are more diversified. Both axes of the plot are ordered by overall frequency (i.e., overall number of each type of event and overall number of reports from each source).

Event locations

Each event has a state listed for the event (STATE). The following graph gives the number of reported events in each state for 2015:

Note that “states” include bodies of water (e.g., specific Great Lakes, the Hawaii waters, the Gulf of Mexico) and territories (American Samoa, Guam, Puerto Rico, Virgin Islands).

For some event types, the latitude and longitude of the beginning of the event is included with the event listing.


Table continues below
With latitude / longitude
Without latitude / longitude
Event types
Debris Flow, Dust Devil, Flash Flood, Flood, Funnel Cloud, Hail, Heavy Rain, Lightning, Marine Hail, Marine High Wind, Marine Strong Wind, Marine Thunderstorm Wind, Thunderstorm Wind, Tornado, Waterspout
Astronomical Low Tide, Avalanche, Blizzard, Coastal Flood, Cold/Wind Chill, Dense Fog, Dense Smoke, Drought, Dust Storm, Excessive Heat, Extreme Cold/Wind Chill, Freezing Fog, Frost/Freeze, Heat, Heavy Snow, High Surf, High Wind, Hurricane (Typhoon), Ice Storm, Lake-Effect Snow, Marine Dense Fog, Rip Current, Seiche, Sleet, Sneakerwave, Storm Surge/Tide, Strong Wind, Tropical Depression, Tropical Storm, Tsunami, Wildfire, Winter Storm, Winter Weather

Of the 2015 events with a latitude and longitude listed for the beginning of the event and that are in the continental U.S., here are those locations by month:

Here are those locations by event type:

Some events have different latitudes and longitudes for the beginning and ending locations. For example, here are maps for one state (Arkansas) of events with different starting and ending locations:

Some events are reported by forecast zone (CZTYPE of “Z”) rather than county (CZTYPE of “C”). Specific types of events are typically either always reported for a county or always reported for a forecast zone (see table below). Events typically reported by county include floods (“Flash Flood”, “Flood”, “Debris Flow”), tornado-like events (“Tornado”, “Funnel Cloud”, “Dust Devil”), and a few other events often related to thunderstorms (“Thunderstorm Wind”, “Hail”, “Heavy Rain”, “Lightning”). Events typically reported by forecast zone include severe winter weather (“Winter Weather”, “Winter Storm”, “Heavy Snow”, “Cold/Wind Chill”, “Extreme Cold/Wind Chill”, “Blizzard”, “Frost/Freeze”, “Ice Storm”, “Sleet”, “Lake-Effect Snow”, “Avalanche”, “Freezing Fog”), extreme heat (“Heat”, “Excessive Heat”, “Drought”), events related to the water or coast (“Marine Thunderstorm Wind”, “High Surf”, “Coastal Flood”, “Waterspout”, “Astronomical Low Tide”, “Rip Current”, “Tropical Storm”, “Marine High Wind”, “Marine Hail”, “Marine Strong Wind”, “Hurricane”, “Seiche”, “Storm Surge/Tide”, “Tropical Depression”, “Marine Dense Fog”, “Sneakerwave”, “Tsunami”), and a few others (“High Wind”, “Dense Fog”, “Strong Wind”, “Wildfire”, “Dust Storm”, “Dense Smoke”).

Event type County Forecast Zone Total % county
Thunderstorm Wind 14,400 0 14,400 100%
Hail 9,398 0 9,398 100%
Flash Flood 5,063 0 5,063 100%
Flood 2,587 0 2,587 100%
Heavy Rain 1,518 0 1,518 100%
Tornado 1,320 0 1,320 100%
Lightning 403 0 403 100%
Funnel Cloud 362 0 362 100%
Debris Flow 54 0 54 100%
Dust Devil 10 0 10 100%
Heat 1 396 397 0%
Winter Weather 0 4,242 4,242 0%
Winter Storm 0 3,605 3,605 0%
Heavy Snow 0 2,557 2,557 0%
High Wind 0 2,192 2,192 0%
Marine Thunderstorm Wind 0 1,880 1,880 0%
Drought 0 1,397 1,397 0%
Cold/Wind Chill 0 925 925 0%
Extreme Cold/Wind Chill 0 853 853 0%
Dense Fog 0 819 819 0%
Strong Wind 0 711 711 0%
High Surf 0 561 561 0%
Blizzard 0 349 349 0%
Frost/Freeze 0 345 345 0%
Ice Storm 0 327 327 0%
Excessive Heat 0 325 325 0%
Wildfire 0 284 284 0%
Coastal Flood 0 270 270 0%
Waterspout 0 240 240 0%
Sleet 0 95 95 0%
Astronomical Low Tide 0 80 80 0%
Rip Current 0 68 68 0%
Lake-Effect Snow 0 63 63 0%
Tropical Storm 0 49 49 0%
Dust Storm 0 41 41 0%
Avalanche 0 27 27 0%
Marine High Wind 0 24 24 0%
Marine Hail 0 19 19 0%
Freezing Fog 0 10 10 0%
Marine Strong Wind 0 9 9 0%
Hurricane (Typhoon) 0 7 7 0%
Seiche 0 6 6 0%
Storm Surge/Tide 0 4 4 0%
Tropical Depression 0 4 4 0%
Dense Smoke 0 2 2 0%
Marine Dense Fog 0 2 2 0%
Sneakerwave 0 1 1 0%
Tsunami 0 1 1 0%

For events reported by county, here are maps showing distributions in the number of events reported in 2015:

Here is a sample of events that are instead reported by forecast zone, with the state, CZ_NAME, and event narrative included. Note that the county name is often provided by the CZ_NAME column, although the CZ_FIPS value is the forecast zone for any event listed by forecast zone. We use code to try to match STATE and CZ_NAME listings to a table of U.S. county names and associated county FIPS for each event listed by forecast zone, to allow these events to be included in event listings and maps created by functions in noaastormevents.

Table continues below
STATE CZ_NAME
Virginia Carroll
Minnesota Lincoln
Wyoming Natrona County Lower Elevations
Wyoming South Laramie Range Foothills
Alabama Colbert
Tennessee Shelby
Missouri Caldwell
Michigan Ontonagon
EVENT_NARRATIVE
Ice accretion ranged from one to two tenths of an inch along and near the crest of the Blue Ridge and long the Interstate 77 corridor. The remainder of the county generally received less than one-tenth inch ice accretion.
Freezing drizzle was quickly followed by snow. The snow accumulated 5 to 9 inches over a 24 to 30 hour period that began on November 30th, including 9.0 inches at Lake Benton. The storm resulted in cancellations or cutbacks of school classes.
There were numerous wind gusts past 60 mph along Outer Drive in Casper including a maximum of 71 mph shortly after 0500MST.
The UPR sensor at Emkay measured wind gusts of 58 mph or higher, with a peak gust of 79 mph at 01/0451 MST.
A combination of light snow and sleet resulted in a dusting to a half of an inch of snow across the county. The wintry precipitation became freezing rain as low level temperatures warmed, with a quarter of an inch of freezing rain reported.
The Memphis ASOS reported heat index values above 105 during the afternoon hours on July 28th while values were greater than 110 during the afternoon on July 29th. Two deaths occurred as a result.
Several areas across northeast Kansas and northwest Missouri saw ice accumulations approaching a quarter inch as well as sleet ranging from a quarter to a half inch in most locations, with some locations reporting over an inch of sleet. Once the sleet ended another 3 to 4 inches of snow fell before the system moved out.
There was a public report of an estimated six inches of snow at White Pine for the |22-hour period ending early evening on the 4th. Northwest winds gusting over 25 mph also caused some blowing of snow reducing visibility to one half mile or less at times. Wind chills by early morning on the 5th fell as low as 35 below zero closing schools throughout the county.

Within the code in noaastormevents, the match_forecast_county is used to try to match a county FIPS to each of the events listed by forecast zone. To get the full code for that function, you can run match_forecast_county (i.e., the function name, without parentheses after). To match an events listed by forecast zone to a county, this function tries the following to try to match all or part of the state_name and cz_name columns in the storm events data to the state and county names in the county.fips dataframe that comes with the maps package:

  1. Tries to match cz_name to the county name in county.fips after removing any periods or apostrophes in cz_name.
  2. Next, for county names with ‘county’ in them, try to match the word before ‘county’ to county name in county.fips. Then check the two words before ‘county’, then the one and two words before ‘counties’.
  3. Next, pull out the last word in cz_name and try to match it to the county name in county.fips. Then check the last two words in cz_name, then check the last three words in cz_name.
  4. Next, pull any words right before a slash and check that against the county name.
  5. Finally, try removing anything in parentheses in cz_name before matching.

In addition, there are a few final steps in cleaning the data. First, all listings with “Utah” in the cz_name are set to missing– while there is a Utah County, Utah, from inspection of event listings in 2015, events in Utah with “Utah” in cz_name often referred to parts of the state, rather than to the county. Further, any event with “National Park” listed in cz_name is set to not match with a county FIPS. In Wyoming, Park County was being matched to a cz_name for Yellowstone National Park, and this could be a problem in other states, so this extra check was included.

## Warning: `filter_()` was deprecated in dplyr 0.7.0.
##  Please use `filter()` instead.
##  See vignette('programming') for more help
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: `select_()` was deprecated in dplyr 0.7.0.
##  Please use `select()` instead.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

In the 2015 events data, there are 22,664 events listed by forecast zone rather than county. Once the match_forecast_county function is applied to these events, 16,405 events were linked to a county (72%) while 6,259 events (28%) could not be matched to a county.

Of the events not matched to a county, 2,997 events were outside the continental U.S. (i.e., in Hawaii, Alaska, U.S. territories, or waters):

State Number of events listed by forecast zone
Gulf Of Mexico 839
Atlantic North 632
Hawaii 567
Atlantic South 448
Alaska 204
Lake Michigan 115
Lake Huron 58
Guam 25
Lake Erie 25
Lake Ontario 17
Lake St Clair 16
Lake Superior 16
Puerto Rico 16
American Samoa 11
E Pacific 5
Hawaii Waters 3

This left 3,262 events in the continental U.S. that were listed by forecast zone but could not be linked to a county by the match_forecast_county function. Most of these events had a value for cz_name with words related to mountains, water, adjacency (e.g., “area of”, “vicinity of”), or a few other word types (e.g., “desert”, “hwy”). The following table gives the number of these remaining unmatched events with words from each of these categories (note: the cz_name for an event may have words from more than one of these categories, in which case it would be counted in this table under both categories).

Word type Words # events
Mountain mountains, mountain, valley, valleys, divide, range, ridge, ridges, gap, front, cascades, foothills, plateau, highlands, mtns, hills, mesa, mesas, vly, peak, gorge, rim, arches, hole, canyon 2,392
Water beaches, beach, river, basin, coast, delta, lake, shoreline, bay 637
Adjacent area, region, vicinity, country 282
Other desert, hwy, panhandle, corridor, nation, plains, lowlands, prarie 223

The following table summarizes the number of events that could not be linked to a county that contained at least one of each of these types of words:

Event type Mountain words Water words Adjacent words Other words
High Wind 646 166 75 47
Winter Storm 416 46 29 10
Heavy Snow 401 94 75 66
Drought 266 52 0 14
Winter Weather 240 70 27 35
Dense Fog 117 47 2 7
Wildfire 104 15 14 15
Frost/Freeze 67 35 4 4
Strong Wind 41 44 22 4
Blizzard 16 0 1 3
Heat 16 3 7 3
Ice Storm 13 5 7 0
Avalanche 12 3 3 0
Cold/Wind Chill 12 5 0 0
Extreme Cold/Wind Chill 10 2 0 0
Dust Storm 6 12 10 13
Excessive Heat 5 0 4 1
Astronomical Low Tide 3 1 2 0
Freezing Fog 1 1 0 0
Coastal Flood 0 17 0 0
Dense Smoke 0 1 0 0
High Surf 0 7 0 1
Rip Current 0 10 0 0
Sneakerwave 0 1 0 0

For 2015, here are the cz_name values for the events that could not be matched to a county and did not include the words listed above:

cz_name state
Block Island Rhode Island
South Central Utah Utah
Southwest Utah Utah
Southwest Interior Washington
West Central Utah Utah
Rapid City South Dakota
Oglala Lakota South Dakota
Southeast Utah Utah
Washington Palouse Washington
Idaho Palouse Idaho
Dekalb Tennessee
Mendocino Interior California
Motherlode/Camptonville To Groveland California
Central Oregon Oregon
North Central Oregon Oregon
Rollette North Dakota
Olympics Washington
Camas Prairie Idaho

For the events listed by forecast zone that could be successfully matched to a county, here are the geographic distributions in event counts in 2015:

When using this function, and for event listings generated using this function, the user may want to hand-check that event listings with names like “Lake” and “Mountain” in the cz_name column are not erroneously matched to counties with names like “Lake County” and “Mountain County”. Code like the following can be used for these checks (in this case, checking a dataframe of event listings named z_events_2015 that is output from match_forecast_county and so has fips added for each event listing, if a match could be found):

z_events_2015 %>% 
  filter(cz_type == "Z") %>% 
  select(cz_name, state, fips) %>% 
  mutate(cz_name = str_to_title(cz_name)) %>% 
  filter(str_detect(cz_name, "Lake") & !is.na(fips))  %>% 
  distinct()

Impact measurements

The “Details” datasets for each year include six measurements of the impacts of each event:

  • DEATHS_DIRECT
  • DEATHS_INDIRECT
  • INJURIES_DIRECT
  • INJURIES_INDIRECT
  • DAMAGE_PROPERTY
  • DAMAGE_CROPS
## Warning: `mutate_()` was deprecated in dplyr 0.7.0.
##  Please use `mutate()` instead.
##  See vignette('programming') for more help
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: `filter_()` was deprecated in dplyr 0.7.0.
##  Please use `filter()` instead.
##  See vignette('programming') for more help
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: `select_()` was deprecated in dplyr 0.7.0.
##  Please use `select()` instead.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Many of the impact values are given using abbreviations for amounts. For example, this listing for a tornado gives the property damage as “5.00K”:

county_events_2015 %>% filter(event_id == "582970")
## # A tibble: 1 × 22
##   begin_yearmonth begin_day end_yearmonth end_day episode_id event_id state     
##             <int>     <int>         <int>   <int>      <int>    <int> <chr>     
## 1          201506        13        201506      13      96906   582970 NORTH CAR…
## # ℹ 15 more variables: cz_type <chr>, cz_name <chr>, deaths_direct <int>,
## #   deaths_indirect <int>, injuries_direct <int>, injuries_indirect <int>,
## #   damage_property <chr>, damage_crops <chr>, event_type <chr>,
## #   state_fips <int>, cz_fips <int>, source <chr>, episode_narrative <chr>,
## #   event_narrative <chr>, fips <dbl>

Therefore, the noaastormevents package uses a function to pull out these abbreviations and convert associated impact values to numeric values (e.g., 5000 for “5.00K”). The conversions conducted are:

  • “K” = 1,000
  • “M” = 1,000,000
  • “B” = 1,000,000,000
  • “T” = 1,000,000,000,000

This is done by the function parse_damage:

parse_damage
## function (damage_vector) 
## {
##     value_table <- dplyr::tibble(letter_damage = c(NA, "K", "M", 
##         "B", "T"), value_damage = 10^c(0, 3, 6, 9, 12))
##     out <- dplyr::tibble(damage_vector) %>% dplyr::mutate(num_damage = stringr::str_extract(.data$damage_vector, 
##         "[0-9.]+"), num_damage = as.numeric(.data$num_damage), 
##         letter_damage = stringr::str_extract(.data$damage_vector, 
##             "[A-Z]+"), letter_damage = stringr::str_to_upper(.data$letter_damage)) %>% 
##         dplyr::left_join(value_table, by = "letter_damage") %>% 
##         dplyr::mutate(damage_vector = .data$num_damage * .data$value_damage, 
##             damage_vector = ifelse(is.na(.data$damage_vector), 
##                 0, .data$damage_vector))
##     return(out$damage_vector)
## }
## <bytecode: 0x7fb886ba7f58>
## <environment: namespace:noaastormevents>

Usually, it seems that the cost per events within an episode do not overlap, so that the costs from all events in an episode can be summed to generate a total damage cost. While in some cases, different event listings within the same county in the same episode have the same damage cost, it often seems that the total cost was divided in these cases across events, as in this case, where the total estimated cost of $6,186,909 in the county (see the narratives) was spread evenly over the two event listings:

Table continues below
event_type damage_property damage_crops cz_name state
Flash Flood 3093.45K 0.00K DORCHESTER SOUTH CAROLINA
Flash Flood 3093.45K 0.00K DORCHESTER SOUTH CAROLINA
event_narrative episode_narrative
Law enforcement, media and social media posts indicated widespread flooding around Summerville and Wescott Plantation. Roads closed included Orangeburg Road at the intersection of Greenwave Boulevard, Ashley River Road at the intersection of Bacons Bridge Road and Wescott Boulevard between Ballantine Drive and Patriot Boulevard. The Dorchester SPCA building was also flooded with dogs standing in water inside their kennels. Dogs and other animals were being moved to safe locations. An off duty NWS employee also reported a tree down along South Main Street with damage to a structure and a vehicle. A historic flooding event affected the Carolinas from October 1-7, 2015. A stalled front offshore combined with deep tropical moisture streaming northwest into the area ahead of a strong upper level low pressure system to the west and Hurricane Joaquin well to the east. This led to historic 4-day rainfall totals with widespread amounts of 15-20 inches and localized amounts over 25 inches, mainly in the Charleston Tri-County area. Flash flooding was prevalent for several days and eventually led to Flash Flood Emergencies for Charleston, Berkeley, Dorchester and Colleton counties during the morning hours of October 4, 2015. Many people had to be rescued by emergency personnel while significant damage occurred to numerous properties and roads. Tides were also historically high due to the recent perigean spring tide and persistent onshore winds, exacerbating and prolonging flooding across the area and along the coast, especially in downtown Charleston. ||The most significant flooding occurred in areas along and near smaller creeks and streams, especially those that were tributaries to larger rivers such as the Edisto, Ashley, Cooper, and Santee. In addition to impacting thousands of homes and businesses, flood waters also damaged many roads and bridges in the area, causing significant travel disruptions that lasted for multiple days. Furthermore, some roads and bridges were so badly damaged that it will likely take weeks to months to repair.||As of 12/31/15, a SCEMD report indicated an estimated total monetary damage of $4,533,337 in Berkeley County, $18,213,860 in Charleston County, $2,030,879 in Colleton County and $6,186,909 in Dorchester County for the flood event. Total costs for each county have been divided equally to each flash flood report within that particular county for this flood event and are considered estimates only.
An emergency manager for Dorchester County reported widespread flooding around Summerville, Ladson and Wescott Plantation. Widespread road closures, damage to homes and water rescues were made. Roads closed due to flooding included the 100 and 300 block of Dorchester Manor Boulevard, the 400 block of Trade Street, Hodge Road between Deming Way and Short Street, Azalea Drive near the intersection with OT Wallace Drive, Parson Road, Dorchester Road at the intersection with Sawmill Branch Creek, Mallard Road between Hill Street and the Habitat for Humanity, West Butternut Road, the 200 block of Lawrence Drive, Aberdeen Circle, Arbors Oak Drive, Renau Boulevard near the intersection with Industrial Road, Stratton Drive, Green Wave Boulevard, Old Trolley Road from Miles Jamison Road to Dorchester Road and Orangeburg Road at the intersection with Mallard Road. ||Eagle Creek was also overflowing its banks and flooding multiple residences in Summerwood and Tranquil Estates. Water backed up a drainage canal, resulting in waist deep water in the middle of Arbor Oaks Drive. Approximately 2 feet of water was in 40 to 50 homes along Arbor Oaks Drive. Around 100 people were rescued from flooded areas along Old Trolley Road, Ladson Road and Miles Jamison Road. A historic flooding event affected the Carolinas from October 1-7, 2015. A stalled front offshore combined with deep tropical moisture streaming northwest into the area ahead of a strong upper level low pressure system to the west and Hurricane Joaquin well to the east. This led to historic 4-day rainfall totals with widespread amounts of 15-20 inches and localized amounts over 25 inches, mainly in the Charleston Tri-County area. Flash flooding was prevalent for several days and eventually led to Flash Flood Emergencies for Charleston, Berkeley, Dorchester and Colleton counties during the morning hours of October 4, 2015. Many people had to be rescued by emergency personnel while significant damage occurred to numerous properties and roads. Tides were also historically high due to the recent perigean spring tide and persistent onshore winds, exacerbating and prolonging flooding across the area and along the coast, especially in downtown Charleston. ||The most significant flooding occurred in areas along and near smaller creeks and streams, especially those that were tributaries to larger rivers such as the Edisto, Ashley, Cooper, and Santee. In addition to impacting thousands of homes and businesses, flood waters also damaged many roads and bridges in the area, causing significant travel disruptions that lasted for multiple days. Furthermore, some roads and bridges were so badly damaged that it will likely take weeks to months to repair.||As of 12/31/15, a SCEMD report indicated an estimated total monetary damage of $4,533,337 in Berkeley County, $18,213,860 in Charleston County, $2,030,879 in Colleton County and $6,186,909 in Dorchester County for the flood event. Total costs for each county have been divided equally to each flash flood report within that particular county for this flood event and are considered estimates only.

However, there are a few cases where it appears that costs might be duplicated over different events within the same episode in a county. For example, in the following listing, it looks like the total estimated damage cost of $1.7 million (see that narrative) is repeated over the two listed events, which would mean that adding damages across events in the episode would lead to a county damage cost of twice the true amount.

Table continues below
event_type damage_property damage_crops cz_name state
Flash Flood 1.70M 0.00K SITKA COASTAL ALASKA
Debris Flow 1.70M 0.00K SITKA COASTAL ALASKA
event_narrative episode_narrative
A strong cold front with sub-tropical moisture moved into the eastern gulf and moved over the coastal areas of Southeast Alaska. As the front approached the coastal area of Sitka very high rain rates were being reported across the area in the early morning hours which lasted less than 6 hours. In three hours the Sitka airport reported one point seven inches which was a 25 year rainfall intensity return period. The Sitka Magnetic Observatory Climate Reference Station (CRN), which is closer to steep terrain, reported two point zero one inches was a 45 year rainfall intensity return period. Along with the very high rain rates there was also very strong winds of thirty-three mile per hour with much high wind gusts at higher elevations. The combination of the heavy rain and strong winds caused catastrophic debris flows across the Sitka area on the morning of August 18th. Multiple roads were blocked along with homes damaged or destroyed and there was 3 fatalities in Cramer Ave slide. A state of emergency was declared and as one point seven million dollars worth of damage was done. A strong front moved through the Panhandle on the morning of Tuesday August 18th. This system had abundant amount of moisture associated with the cold front as the system originated from the North Pacific and was able to tap into tropical moisture. The front produced very heavy precipitation along coastal locations and prolonged moderate rain further inland. The heavy rain produced flooding over the Sitka area and in the Taiya River basin along the Chilkoot trail near Skagway. The strong winds that accompanied the front along with the very high rain fall rates caused several landslides along the central outer coast with three fatalities in Sitka. As the front moved through the inner channels there was a brief strong wind that occurred near Skagway.
A strong cold front with sub-tropical moisture moved into the eastern gulf and moved over the coastal areas of Southeast Alaska. As the front approached the coastal area of Sitka very high rain rates were being reported across the area in the early morning hours which lasted less than 6 hours. In three hours the Sitka airport reported one point seven inches which was a 25 year rainfall intensity return period. The Sitka Magnetic Observatory Climate Reference Station (CRN), which is closer to steep terrain, reported two point zero one inches was a 45 year rainfall intensity return period. Along with the very high rain rates there was also very strong winds of thirty-three mile per hour with much high wind gusts at higher elevations. The combination of the heavy rain and strong winds caused catastrophic debris flows across the Sitka area on the morning of August 18th. Multiple roads were blocked along with homes damaged or destroyed and there was 3 fatalities in Cramer Ave slide. A state of emergency was declared and as one point seven million dollars worth of damage was done. A strong front moved through the Panhandle on the morning of Tuesday August 18th. This system had abundant amount of moisture associated with the cold front as the system originated from the North Pacific and was able to tap into tropical moisture. The front produced very heavy precipitation along coastal locations and prolonged moderate rain further inland. The heavy rain produced flooding over the Sitka area and in the Taiya River basin along the Chilkoot trail near Skagway. The strong winds that accompanied the front along with the very high rain fall rates caused several landslides along the central outer coast with three fatalities in Sitka. As the front moved through the inner channels there was a brief strong wind that occurred near Skagway.

Of the times when a county had two or more events as part of the same episode in 2015, in 3,136 (87%) cases the damage costs were not identical across the event listings for the county and episode, while in 452 cases (13%) the cost listings were identical across event listings (as shown in the cases just given). If using damage cost estimates for research, it may be wise to hand-check for cases where damage cost estimates are duplicated across different events in a way that prevents summing across events to get the cumulative episode total cost.

When costs were summed over all event and county listings in an episode, here are the ten episodes in the 2015 dataset with the highest total damage costs (combining property and crop damage):

Table continues below
Event types Total damage Counties
Flood, Flash Flood, Lightning $1,001,850,000 Hopkins, Texas; Hill, Texas; Limestone, Texas; Freestone, Texas; Ellis, Texas; Bosque, Texas; Bell, Texas; Henderson, Texas; Anderson, Texas; Hamilton, Texas; Van Zandt, Texas; Coryell, Texas; Dallas, Texas; Navarro, Texas; Tarrant, Texas; Mclennan, Texas; Hunt, Texas
Hail, Thunderstorm Wind $600,160,000 Lubbock, Texas; Crosby, Texas; Hale, Texas; Motley, Texas; Childress, Texas; Hockley, Texas; Floyd, Texas
Blizzard $401,000,000 Quay County, New Mexico; Southwest Chaves County, New Mexico; Guadalupe County, New Mexico; Harding County, New Mexico; Eastern San Miguel County, New Mexico; Union County, New Mexico; Curry County, New Mexico; Eastern Lincoln County, New Mexico; Roosevelt County, New Mexico; Chaves County Plains, New Mexico; De Baca County, New Mexico
Flood, Flash Flood $310,830,000 Lynn, Texas; Lubbock, Texas; Hockley, Texas; Garza, Texas; Terry, Texas
Flash Flood, Flood $243,750,000 St. Charles, Missouri; Osage, Missouri; Gasconade, Missouri; Lincoln, Missouri; Franklin, Missouri; St. Louis, Missouri; Jefferson, Missouri; Madison, Missouri; Crawford, Missouri; Cole, Missouri; St. Francois, Missouri; Ste. Genevieve, Missouri; Warren, Missouri; Iron, Missouri; St. Louis (C), Missouri; Callaway, Missouri; Reynolds, Missouri; Boone, Missouri; Montgomery, Missouri
Flash Flood, Thunderstorm Wind, Tornado, Lightning $220,010,000 Blanco, Texas; Hays, Texas; Travis, Texas; Guadalupe, Texas; Bastrop, Texas; Real, Texas; Williamson, Texas; Bexar, Texas; Kendall, Texas; Uvalde, Texas; Medina, Texas; Caldwell, Texas; Zavala, Texas; Comal, Texas
Flood $211,830,000 Nemaha, Nebraska; Richardson, Nebraska; Gage, Nebraska; Saline, Nebraska; Jefferson, Nebraska; Seward, Nebraska; Saunders, Nebraska; Lancaster, Nebraska; Cass, Nebraska
Flash Flood, Heavy Rain, Flood $95,150,000 Richland, South Carolina; Chesterfield, South Carolina; Fairfield, South Carolina; Lexington, South Carolina; Calhoun, South Carolina; Clarendon, South Carolina; Orangeburg, South Carolina; Newberry, South Carolina; Kershaw, South Carolina
Hail, Thunderstorm Wind, Lightning $72,170,000 Kalkaska, Michigan; Missaukee, Michigan; Roscommon, Michigan; Leelanau, Michigan; Antrim, Michigan; Manistee, Michigan; Iosco, Michigan; Ogemaw, Michigan; Gladwin, Michigan; Arenac, Michigan; Wexford, Michigan; Grand Traverse, Michigan; Crawford, Michigan; Emmet, Michigan; Presque Isle, Michigan; Cheboygan, Michigan; Otsego, Michigan; Montmorency, Michigan; Alpena, Michigan; Alcona, Michigan
Flood, Winter Storm, Winter Weather $63,345,000 Dickson, Tennessee; Stewart, Tennessee; Williamson, Tennessee; Davidson, Tennessee; Marshall, Tennessee; Wilson, Tennessee; Bedford, Tennessee; Coffee, Tennessee; Smith, Tennessee; Cheatham, Tennessee; Jackson, Tennessee; Overton, Tennessee; Putnam, Tennessee; Sumner, Tennessee; Cumberland, Tennessee; Fentress, Tennessee; White, Tennessee; Maury, Tennessee; Clay, Tennessee; Van Buren, Tennessee; Pickett, Tennessee; Warren, Tennessee; Lewis, Tennessee; Montgomery, Tennessee; Robertson, Tennessee; Grundy, Tennessee; Rutherford, Tennessee
Narrative
Heavy rain led to flash flooding across portions of North Central Texas on the 23rd and 24th, with residual flooding lasting through at least the 25th. Rainfall totals in flood damaged areas ranged from 5 to 21+ inches within a 36 hour period. The highest rainfall totals were in Navarro County which suffered significant damage across the entire county. Flood waters derailed a train north of Corsicana and many county and farm-to-market roads were washed away. The flooding in Navarro County persisted for weeks in areas where the water had a very difficult time draining. Rainfall totals near 20 inches also fell in southern Hill County were many roads were covered with water.
Shortly before 0800 CST, elevated thunderstorms intensified across the western South Plains and far eastern New Mexico in response to a surge of Gulf moisture ahead of a mid-level trough. Unlike the previous day when widespread morning storms contaminated the potential for severe storms later in the day, this day featured multiple rounds of severe storms from mid-morning through late afternoon rumbling over the South Plains, Rolling Plains and the far southeast Texas Panhandle. The majority of these thunderstorms were elevated with large hail and failed to become surface based thanks to a large outflow boundary that surged south from early morning storms. Despite favorable low level wind shear for tornadoes, the fast-moving outflow boundary was a saving grace of sorts in that it quickly undercut supercells and prevented them from becoming tornadic. Nonetheless, the severe storms that did develop proved costly to many residents across the region, especially in and around the cities of Plainview and Slaton where extensive damage to homes, businesses, vehicles, and wheat crops was reported.
A potent upper level storm system developed over Arizona on Christmas Day then moved slowly east along the Mexico border through the 27th. Snow developed quickly from south to north over New Mexico on the 26th while an arctic cold front raced south and west across the state. Wind gusts behind the front averaged 60 to 80 mph across the eastern plains. The combination of heavy snow and high winds created blizzard conditions across nearly the entire eastern half of New Mexico. Travel across all of eastern New Mexico was shut down. The entire stretch of Interstate 40 from Albuquerque to Amarillo was shut down for nearly 36 hours. A Civil Emergency was declared for Quay, Curry, Roosevelt, De Baca, Chaves, and eastern Lincoln counties as dozens of motorists were stranded in their vehicles in 6 to 10 foot snow drifts. Department of Public Safety assisted a total of 455 motorists. Emergency response personnel were even stranded trying to reach these motorists. Residents were blockaded in their homes with drifts up to the top of roofs. Xcel Energy reported power outages in at least 14,200 residences across eastern New Mexico and at least 30,000 residential disruptions during the storm. Numerous trees and power lines were downed as well as several structures due to the weight of heavy snow. Snowfall accumulations of 15 to 30 inches were common from the central mountain chain eastward across much of the plains. Ski Apache reported a whopping 41 inches. Department of Agriculture reported around 12,000 adult milking cows perished in the storm and between 30,000 and 50,000 young livestock died. A couple 1-day snowfall records were broken with this event. One person died from exposure in Albuquerque and another while shoveling snow in Roswell. The New Mexico EOC coordinated with the National Guard to assist several counties with disaster operations.
A deep fetch of Gulf moisture overspread the South Plains this afternoon in advance of a slow-moving trough. Numerous thunderstorms erupted by late afternoon across the western South Plains and spread slowly northeast through the overnight hours under weak upper level winds. The slow nature of these storms resulted in torrential rainfall rates and flooding in many areas, but the most impressive rainfall and flooding bulls-eyed in central and southern Lynn County where between 6 and 12 inches of rain was measured before midnight. Nearly all roads in Lynn County were closed by DPS officials due to standing water in excess of one foot over long stretches. The city of Tahoka became marooned by floodwaters forcing emergency officials to give stranded motorists refuge in area shelters. When these shelters either reached capacity or were threatened by floodwaters, officials transported persons to adjacent counties for safety. To add insult to injury, additional rounds of thunderstorms with heavy rain developed early in the morning on the 5th and prolonged flooding issues over much of the southern South Plains and southern Rolling Plains. Schools in Tahoka were closed on the 5th due to many roads remaining impassable. Dozens of vehicles from Lubbock to Tahoka required rescuing after motorists drove into deep floodwaters and became stranded. Most of these flooded cars were deemed complete losses after the engines became hydrolocked. One small child suffered a head injury after the car they were in hydroplaned abruptly near Southland (Garza County). Combined damage to vehicles, homes and thousands of acres of wheat crops (particularly in Lynn County) could exceed $300M.
A prolonged period of rainfall occurred from the early morning hours of December 26th to the evening of December 28th. The heaviest rainfall occurred in a 50 to 75 mile wide swath from southwest Missouri through the Greater St. Louis Metropolitan Area and into central Illinois. Three day rainfall totals within this swath ranged from 6 to 12 inches, with lighter amounts extending both northwest and southeast to the state border. Some of the precipitation fell as a wintry mix of freezing rain, sleet and snow across northwest portions of the state. All of this rain caused historic river flooding for the many rivers throughout the region. This resulted in floods of record on the Bourbeuse River at Union, the Meramec River at Pacific, Eureka, Valley Park, and Arnold, and major flooding on the Missouri River (at Gasconade and Hermann), the Mississippi River at Winfield Lock and Dam and points downstream, the Cuivre River at Old Monroe, Dardenne Creek, the Gasconade River, the Moreau River, the Illinois River, and the Kaskaskia River at Vandalia. The only location not reporting flooding after this event was the Salt River near New London, where the Clarence Cannon Dam regulates the flow. All other forecast points reported at least minor flooding. Seven flooding deaths were reported in our area due to the heavy rains. Approximately 1500 structures were either damaged or destroyed by the flood waters in the forecast area. At this time dollar amount damages are expected to top $1 billion dollars.
An upper level shortwave trough moved around the longwave low over the Four Corners region. This upper distubance interacted with a surface boundary moving northward as a warm front from South Texas into a very moist airmass. This combination led to thunderstorms that produced heavy rain and isolated severe weather. A historic flash flood occurred on the Blanco River late Saturday night into Sunday. Hundreds of homes were destroyed along the river from the City of Blanco down into Wimberley and San Marcos. The flood wave continued downstream for days affecting residents and homes along the San Marcos and Guadalupe Rivers. Early estimates show damages in excess of 100 million dollars. Several people lost their lives due to flash flooding. A large tornado outbreak occurred this Saturday night producing numerous small brief tornadoes.
Very heavy, and in some cases, record rainfall fell across southeast Nebraska on the evening of the 6th and into the early morning hours of the 7th. This led to flooding on several rivers and creeks across southeast Nebraska on the days to follow. In some cases the flooding reached record levels and resulted in significant damage, and tragically 1 fatality.
Heavy rain in the Midlands…Pee Dee produced flash flooding in across the area. Numerous dams were breached along with numerous bridge and roadways flooded and damaged.
An historic severe weather outbreak in northern Michigan, as multiple waves of severe thunderstorms crossed the region. A passing cold front would finally end the activity during the evening hours. This episode featured widespread straight-line wind damage in parts of northwest lower Michigan, and the largest hail on record in northern Michigan in Ogemaw County.
An historic winter storm struck Middle Tennessee just 2 days after a widespread snowfall and only 4 days after another major winter storm affected the area. Light snow moved into the area during the afternoon hours on February 20. Although temperatures remained near or below freezing, the snow transitioned to sleet and eventually freezing rain across Middle Tennessee through the night as temperatures warmed aloft due to a very powerful 850 mb jet. This low level jet was measured at 86 knots on the 12Z February 21 OHX upper air sounding, the highest known measurement of an 850 mb wind speed at NWS Nashville. Continued strong warm air advection gradually warmed surface temperatures above freezing from southwest to northeast across Middle Tennessee during the morning hours on February 21. ||Due to significant ice remaining on trees and power lines from the previous winter storms earlier in the week, along with gusty south winds from 30 to 50 mph, widespread ice storm damage occurred across eastern Middle Tennessee. The worst damage was on the Cumberland Plateau, where ice accumulations reached up to 1. This icing brought down thousands of trees, power lines, and power poles, blocking numerous roadways and damaging many homes, businesses, and other structures. Many residents of Fentress, eastern Overton, Cumberland, eastern Putnam, eastern White and Van Buren counties were without power for 2 weeks, and some were without power for up to 1 month. Local utilities companies and emergency management described the ice storm damage as one of the worst natural disasters to ever affect the region, comparable to an EF2 tornado striking the entire area. A Presidential disaster declaration was made for the Cumberland Plateau in April 2015.

Here is a table of the total number of events with non-zero damage (either for property damage or crop damage), the total damage costs across all events of that type in 2015, and the median and maximum damage per event for events of that type with non-zero damage costs. Event types are ordered by total damage costs summed across all events.

Event type # Events Total damage Median damage Maximum damage
Flash Flood 2,078 $2,130,663,570 $15,000 $1,000,000,000
Flood 995 $866,504,900 $20,000 $235,000,000
Hail 673 $719,494,620 $15,000 $300,000,000
Blizzard 20 $433,695,000 $700,000 $100,000,000
Tornado 632 $321,121,850 $40,000 $50,000,000
Thunderstorm Wind 6,666 $215,773,520 $5,000 $18,800,000
Winter Storm 278 $89,783,000 $50,000 $20,000,000
Ice Storm 93 $59,227,000 $100,000 $8,664,000
Strong Wind 597 $24,814,860 $3,000 $10,000,000
Lightning 336 $16,314,720 $10,000 $2,000,000
High Wind 197 $15,559,500 $15,000 $10,000,000
Heavy Rain 55 $11,381,100 $30,000 $2,098,000
Drought 252 $10,760,100 $1,200 $400,000
Wildfire 32 $10,486,500 $100,000 $5,000,000
Coastal Flood 30 $7,522,500 $30,000 $2,000,000
Debris Flow 17 $3,485,500 $5,000 $1,700,000
Winter Weather 128 $3,247,000 $10,000 $500,000
Lake-Effect Snow 42 $1,519,000 $20,000 $150,000
Storm Surge/Tide 1 $1,300,000 $1,300,000 $1,300,000
Heavy Snow 24 $1,271,500 $25,000 $400,000
Extreme Cold/Wind Chill 8 $850,000 $100,000 $250,000
Cold/Wind Chill 6 $618,000 $100,000 $250,000
Tropical Depression 2 $502,000 $251,000 $500,000
Frost/Freeze 3 $300,000 $100,000 $100,000
Seiche 4 $95,000 $25,000 $30,000
Dust Devil 9 $38,700 $1,000 $25,000
Sleet 4 $33,000 $10,000 $10,000
Dust Storm 1 $25,000 $25,000 $25,000
Dense Fog 1 $5,000 $5,000 $5,000

The following graph shows the distribution of events between those with listed damage costs greater than $0 and those without.

The following figure shows the top 50 episodes in terms of damages (property and crop damage combined) in 2015: