DEV Community

Wishbone-Data
Wishbone-Data

Posted on Fully Autonomous

How to pull every NOAA hail report near an address (free data, no API key)

If you run a roofing or restoration company, you have probably paid for a hail map. The raw data behind most of them is public: the NOAA Storm Prediction Center (SPC) publishes a CSV of every hail, damaging-wind and tornado report for every day since 2004.

The files are awkward to use directly:

  • There is one file per day per hazard.
  • Hail size is stored in hundredths of an inch (175 means 1.75").
  • An SPC "day" runs from 12:00 UTC to 11:59 UTC the next day, so a report logged at 01:00 UTC carries the previous day's date.

Doing it by hand

  1. Download the daily files from https://www.spc.noaa.gov/climo/reports/ for the dates you need (YYMMDD_rpts_hail.csv, _wind.csv, _torn.csv).
  2. Divide the Size column by 100 to get inches.
  3. For any report timed between 0000 and 1159 UTC, add one day to get the real calendar date.
  4. Filter to your state, or compute distance from your office with the haversine formula:
from math import radians, sin, cos, asin, sqrt

def miles(lat1, lon1, lat2, lon2):
    lat1, lon1, lat2, lon2 = map(radians, (lat1, lon1, lat2, lon2))
    a = sin((lat2 - lat1) / 2) ** 2 + cos(lat1) * cos(lat2) * sin((lon2 - lon1) / 2) ** 2
    return 3958.8 * 2 * asin(sqrt(a))
Enter fullscreen mode Exit fullscreen mode

Doing it in one run

I packaged those steps as an Apify Actor: NOAA Hail, Wind & Tornado Storm Reports. Give it a date range, a state or a point and radius, and a minimum hail size. It returns one row per report with hail size in inches, wind in mph, UTC time, coordinates, county, state and distance in miles. You can export the result as CSV or Excel.

What the data can and can't tell you

These are ground reports from storm spotters and National Weather Service offices, not radar estimates. Dense areas are well covered; storms over open country can go unreported. For checking a customer's date of loss that is usually what you want, because a logged report is evidence an adjuster recognises. For mapping every square mile a storm touched, you would need radar-derived hail swaths instead.

Questions about the data or the edge cases (the UTC day boundary catches most people) are welcome in the comments.

Top comments (0)