HURDAT2 best tracks
Available since v0.12.0 as noaa:hurdat2. The National
Hurricane Center publishes its complete best-track database as two anonymous
plain-text files, one for the Atlantic basin and one for the northeast and
north-central Pacific. There is no query interface of any kind: no records API,
no per-storm files, no server-side subsetting. The only sensible asset is one
whole file per basin, so HURDAT2 is the first usdata dataset whose value lives
in the reader rather than the query.
Selecting a basin
basin is atlantic (the default) or pacific, matched case-insensitively.
revision optionally names one revision by its date, such as 2026-02-27; see
below. Any other parameter, a location or bbox, variables, and
text queries are rejected with an error rather than silently ignored, because
none of them can change which bytes are downloaded.
Dates are rejected too. Every revision contains the complete record for its
basin, so a start/end pair would select nothing; recording a requested window
as the asset's time bounds would misdescribe the cached file in the lockfile and
provenance sidecar. Asset time bounds instead report the data span named in the
filename (1851 through the last completed Atlantic season, 1949 onward for the
Pacific). Filter the parsed time column locally. capabilities are all false.
Revisions and filenames
The data directory keeps past
revisions, not only the current pair: it listed 41 HURDAT2 data files on 2026-09-12, the
oldest a Pacific file revised 2017-04-13. How far back it reaches is the NHC's
choice, so treat it as an archive that happens to be deep rather than a complete
history. Filenames embed the data span and a revision date, such as
hurdat2-1851-2025-02272026.txt and hurdat2-nepac-1949-2025-02272026.txt.
The basin token is nepac for the Pacific and either atl or absent for the
Atlantic. Revision dates are MMDDYY or MMDDYYYY — never YYYYMMDD — and one
Pacific name carries a trailing disambiguating letter, so resolution parses the
date rather than sorting filenames as text. Text order genuinely disagrees with
revision order: within the 1851-2020 span, 020922 is 2022-02-09 and 052921 is
2021-05-29, so the newer file sorts below the one it supersedes. The newest data
span wins first, then the newest revision of that span; names that are not real
dates, files for the other basin, and non-local links are ignored.
revision replaces "newest" with one revision date, compared after parsing, so
2026-02-27 selects hurdat2-1851-2025-02272026.txt for the Atlantic basin. A
date that no listed file of the basin carries is an error naming the newest
revisions, never a fallback to another file. Name a revision when the newest one
cannot be read (see opening the file), or to make a first
pull choose the same file every time; after that the lockfile pins it anyway.
The complete filename is the stable asset ID, and the URL, original bytes,
size, and checksum are preserved. The directory reports approximate sizes
(6.8M), so asset size is left unknown rather than guessed. A lockfile restores
its pinned URL without listing current revisions, so pull --force is what
moves to a newer revision once the NHC publishes one.
Upstream revisions
Agencies revise files in place. A locked restore downloads each pinned URL
and fails with a checksum mismatch when the bytes have changed; accept the
new bytes for chosen entries with pull --update, or re-resolve the whole
manifest with pull --force. A lockfile detects changed data; it does not
archive it. Keep the cache with the manifest and lockfile. See
provenance and drift.
Opening the file
FetchedAsset.open() uses the pandas extra and selects the hurdat2 reader from
the dataset id or the hurdat2-*.txt filename, so it needs no arguments. It
returns one row per best-track point:
| Column | Meaning |
|---|---|
storm_id |
ATCF-style basin, cyclone number, and year, such as AL042021 |
name |
Storm name, or UNNAMED |
time |
Track-point time, UTC |
record_identifier |
L landfall, I intensity peak, P pressure minimum, and the other documented codes; missing on ordinary records |
status |
TD, TS, HU, EX, SD, SS, LO, WV, or DB |
latitude, longitude |
Signed decimal degrees, longitude in [-180, 180]; the source hemisphere letters become signs |
max_wind_kt |
Maximum sustained 1-minute surface wind, knots |
min_pressure_mb |
Minimum central pressure, millibars |
r34_ne_nm … r64_nw_nm |
Twelve wind radii: the 34, 50, and 64 kt maximum extent in each quadrant, nautical miles |
max_wind_radius_nm |
Radius of maximum wind, nautical miles |
The documented missing sentinels become NaN: -999 anywhere, and the -99
maximum wind left unassigned on a non-developing depression. The NHC format
reference ties -99 to 1967; in the current Atlantic file it in fact appears 57
times, all on TD records between 1971 and 1987, and never in the Pacific file.
Wind radii were best-tracked only from 2004 and the radius of maximum wind only
from 2021, so those columns are mostly NaN in earlier decades; revisions published before
2021 omit the radius-of-maximum-wind field entirely and the reader fills it with
NaN. Numeric columns use float dtype so those gaps are representable; units are
in the column names rather than a synthesized units map. Text columns keep source
strings, and a blank record identifier or status becomes missing rather than an
empty string.
Parsing follows the file's own structure: a header line such as
AL011851, UNNAMED, 14, is followed by exactly the number of track-point lines
it declares. A count that does not match, a line with the wrong number of fields,
an unparseable timestamp or coordinate, or text where a measurement belongs
raises Hurdat2FormatError from usdata.readers (a ValueError) naming the
line, rather than returning a partly parsed table.
Archived revisions read the same way, which is what makes a restored lockfile
useful. Two differences show up only in older files. Data lines published before
the 2021 season carry 20 values and a terminating comma instead of 21, so
max_wind_radius_nm is NaN. And some revisions write a position east of
Greenwich in the unwrapped 0-360 west convention, continuing a track from 3.3W
to 358.0W; the reader normalizes that to 2.0, the value the NHC itself
published for the same point in a later revision. Of the 43 files listed on
2026-09-23, 41 parse. The Pacific revision of 2023-04-27 has a date written
C0091018, which the next revision corrects. The newest Atlantic revision,
2026-09-12, has two typos its predecessor did not: a missing comma
(63.3N 7.5E) and a latitude written 38.83, which could be 38.8N or
38.3N. Both raise rather than parse to a guess, and the error names the file
and the revision parameter; revision: 2026-02-27 reads the previous
Atlantic revision, which the examples pin until the NHC corrects the file.
The file takes no reader options, so it is opened with open(), not
open_csv(). Opening is local: it never re-fetches, decompresses into the cache, or
changes provenance, which is copied into frame.attrs["usdata"].
Scientific limits
HURDAT2 is a post-season reanalysis, not an observation archive. Coverage and
accuracy degrade going back in time: storms were missed and intensities
underanalyzed before aircraft reconnaissance (1944 in the western Atlantic) and
before routine satellite imagery (late 1960s), so counting storms per decade
measures observing systems as much as climate. Positions and intensities are
best-track estimates at each time, wind radii are quadrant maxima rather than a
wind field, and record_identifier marks why an asynoptic record exists rather
than enumerating impacts. Continental U.S. landfalls are marked for 1851-1970 and
1991 onward; international landfalls only for 1951-1970 and 1991 onward. Track
points for WV and DB status give a lower-tropospheric vorticity center, not a
surface center. The Pacific file covers the northeast and north-central Pacific
only; it is not a global archive. IBTrACS merges these files
with every other agency's tracks into one worldwide record.
Field meanings, record codes, and era-by-era caveats are documented in the NHC Atlantic format reference and northeast Pacific format reference. The manifest example fetches the Atlantic file and reads it locally. The design decision records the whole-file and reader contract.
See the service research notes for dated upstream probes.
Metadata sources
Every value in the catalog entry's resolution, cadence, citation, terms, variables, and limits comes from one of these pages. A field the agency does not publish is left empty rather than estimated.
- Resolution and variables: the NHC Atlantic and northeast Pacific format references, read through the reader's column table above.
- Updates and citation: the NHC data page, which records the 2026-02-27 revision adding the 2025 season and asks that Landsea and Franklin (2013) be referenced.
- Terms: the NWS disclaimer.
- Latency is empty: HURDAT2 is a post-season reanalysis and the NHC states no lag.
Reference
noaa:hurdat2 · Released · Included since usdata 0.12. HURDAT2 Atlantic and Pacific Best Tracks.
At a glance
- Files: HURDAT2 fixed-format text
- Selection: The newest or a named revision of one whole basin file; filter track points locally
- Required inputs: Optional basin (atlantic or pacific) and revision date; no dates or geographic filters
- Open locally:
usdata[pandas]· Reader guide - On usdata.dev: Tropical cyclone best tracks, with a walkthrough
- Studies: How high was Hurricane Helene's storm surge at Cedar Key?
Parameters
Pass these as --param name=value to the CLI, as params: entries in a manifest, or as keyword arguments to build_query.
| Parameter | Meaning |
|---|---|
basin |
Best-track basin: 'atlantic' (default) or 'pacific'. |
revision |
Revision date of the file to select, such as 2026-02-27; the newest revision by default. |
Variables
| Variable | Units | Meaning |
|---|---|---|
storm_id |
— | ATCF-style basin, cyclone number, and year, such as AL042021 |
name |
— | Storm name, or UNNAMED |
time |
UTC | Track-point time |
record_identifier |
— | Landfall (L), intensity peak (I), pressure minimum (P), and the other codes |
status |
— | TD, TS, HU, EX, SD, SS, LO, WV, or DB |
latitude |
degrees_north | Track-point latitude |
longitude |
degrees_east | Track-point longitude in [-180, 180] |
max_wind_kt |
knots | Maximum sustained 1-minute surface wind |
min_pressure_mb |
millibars | Minimum central pressure |
r34_ne_nm |
nautical miles | 34 kt wind extent, northeast quadrant |
r34_se_nm |
nautical miles | 34 kt wind extent, southeast quadrant |
r34_sw_nm |
nautical miles | 34 kt wind extent, southwest quadrant |
r34_nw_nm |
nautical miles | 34 kt wind extent, northwest quadrant |
r50_ne_nm |
nautical miles | 50 kt wind extent, northeast quadrant |
r50_se_nm |
nautical miles | 50 kt wind extent, southeast quadrant |
r50_sw_nm |
nautical miles | 50 kt wind extent, southwest quadrant |
r50_nw_nm |
nautical miles | 50 kt wind extent, northwest quadrant |
r64_ne_nm |
nautical miles | 64 kt wind extent, northeast quadrant |
r64_se_nm |
nautical miles | 64 kt wind extent, southeast quadrant |
r64_sw_nm |
nautical miles | 64 kt wind extent, southwest quadrant |
r64_nw_nm |
nautical miles | 64 kt wind extent, northwest quadrant |
max_wind_radius_nm |
nautical miles | Radius of maximum wind, best-tracked from 2021 |
Catalog facts
- Availability: since 0.12
- Domain: Tropical cyclones
- Spatial resolution: Best-track positions in tenths of a degree
- Temporal resolution: Six-hourly synoptic times, plus asynoptic records for landfalls and extremes
- Updates: Annually, after each season's post-storm reanalysis; the 2025 season was added on 2026-02-27
- Terms of use: https://www.weather.gov/disclaimer
- Citation: Landsea, C. W. and J. L. Franklin, 2013: Atlantic Hurricane Database Uncertainty and Presentation of a New Database Format. Mon. Wea. Rev., 141, 3576-3592
- Catalog date range: 1851-01-01 to open-ended
- Coverage varies by station, product, and date; the range above does not guarantee observations.
- Upstream documentation
- License: US Government Work (public domain)
- Transport:
http - Adapter:
usdata.providers.noaa.hurdat2:Hurdat2