One-time snapshot
DOT Airline On-Time Performance 2018–2024
45,968,068 reported flight records across all 84 months, with all 109 BTS source fields, exact delay values and separate cancellation/diversion outcomes.
Records: 45,968,068 flight records across 84 months
Coverage: January 2018–December 2024; all 84 months
Format: CSV + Parquet
Package uploaded: 2026-09-19
Listing reviewed: 2026-09-19
The upload and review dates do not extend the source coverage. This is a dated snapshot; future updates are not included.
$99one time
CSV and Parquet files for the coverage described here. Review the limitations and sample before purchasing.
Buy dated snapshotView 1,000-row sampleNew annual update subscriptions are unavailable. Existing customers can use their purchase download links or contact support.
Known limitations
- Dated snapshot of all 84 official monthly files for January 2018–December 2024, retrieved September 19, 2026. Future updates are not included. BTS can revise historical records.
- BTS Reporting Carrier data covers reported nonstop domestic flights, including required and voluntary reporting carriers. It is not every US flight, international service, passenger totals or the separate Marketing Carrier network table. Carrier participation can change across years.
- Breaking schema repair: all 109 native BTS fields replace the former 47-column reduced table. Parquet adds source_month and source_row. The original monthly CSVs retain agency spelling, formatting, blanks and an empty trailing delimiter column. No rows were deduplicated or dropped. Former route, cancellation_reason and is_delayed fields are removed.
- There are 1,001,102 cancelled records, 108,460 diverted records and 1,109,916 missing ArrDelay values. Missing arrival delay does not mean on time. Use separate Cancelled, Diverted and ArrDel15 fields, and state the denominator. Diverted arrival outcomes use DivReachedDest and DivArrDelay.
- The candidate key FlightDate + Reporting_Airline + Flight_Number_Reporting_Airline + Origin + Dest has 2 excess duplicate rows, all retained. source_month + source_row is unique only within this release and is not a stable flight identity across agency revisions.
- Local HHMM times are strings, preserving leading zeros and the source 2400 convention. They are not UTC timestamps; do not subtract HHMM integers or infer elapsed time without dates/time zones. Negative departure/arrival delays mean early movement and are retained. Delay measures use exact decimal types; blank source values become null in Parquet.
- Delay-cause minutes are conditional reported outcomes, not universal weather observations. Blank causes are not automatically zero. Post-flight fields are not available when making pre-departure predictions. No airport/weather joins, exposure adjustment, predictive model or risk score is supplied.
- Airport and airline codes can be reused. Prefer the supplied DOT/airport identifiers for longitudinal analysis and distinguish airport IDs from time-specific airport sequence IDs. Identifiers and code fields remain strings.
- Every source field and monthly count reconciles to the persisted Parquet with an independent CSV parser. This does not independently certify agency accuracy or flights outside the reporting universe. The 1,000-row sample covers every month but is not statistically representative.
- Source exceptions retained: 354 records marked neither cancelled nor diverted have missing arrival delay; 1 record has at least one missing flight identifier. See the monthly reconciliation for period counts. No missing values were inferred.
Files in this snapshot
Row counts are per table and should not be added as independent events. Expand a file to see its delivered Parquet field names and types.
parquet/*.parquet — 45,968,068 rows · 111 fields
| Field | Type |
|---|---|
| Year | int32 |
| Quarter | int32 |
| Month | int32 |
| DayofMonth | int32 |
| DayOfWeek | int32 |
| FlightDate | date32[day] |
| Reporting_Airline | string |
| DOT_ID_Reporting_Airline | string |
| IATA_CODE_Reporting_Airline | string |
| Tail_Number | string |
| Flight_Number_Reporting_Airline | string |
| OriginAirportID | string |
| OriginAirportSeqID | string |
| OriginCityMarketID | string |
| Origin | string |
| OriginCityName | string |
| OriginState | string |
| OriginStateFips | string |
| OriginStateName | string |
| OriginWac | string |
| DestAirportID | string |
| DestAirportSeqID | string |
| DestCityMarketID | string |
| Dest | string |
| DestCityName | string |
| DestState | string |
| DestStateFips | string |
| DestStateName | string |
| DestWac | string |
| CRSDepTime | string |
| DepTime | string |
| DepDelay | decimal128(20, 2) |
| DepDelayMinutes | decimal128(20, 2) |
| DepDel15 | decimal128(20, 2) |
| DepartureDelayGroups | int32 |
| DepTimeBlk | string |
| TaxiOut | decimal128(20, 2) |
| WheelsOff | string |
| WheelsOn | string |
| TaxiIn | decimal128(20, 2) |
| CRSArrTime | string |
| ArrTime | string |
| ArrDelay | decimal128(20, 2) |
| ArrDelayMinutes | decimal128(20, 2) |
| ArrDel15 | decimal128(20, 2) |
| ArrivalDelayGroups | int32 |
| ArrTimeBlk | string |
| Cancelled | decimal128(20, 2) |
| CancellationCode | string |
| Diverted | decimal128(20, 2) |
| CRSElapsedTime | decimal128(20, 2) |
| ActualElapsedTime | decimal128(20, 2) |
| AirTime | decimal128(20, 2) |
| Flights | decimal128(20, 2) |
| Distance | decimal128(20, 2) |
| DistanceGroup | int32 |
| CarrierDelay | decimal128(20, 2) |
| WeatherDelay | decimal128(20, 2) |
| NASDelay | decimal128(20, 2) |
| SecurityDelay | decimal128(20, 2) |
| LateAircraftDelay | decimal128(20, 2) |
| FirstDepTime | string |
| TotalAddGTime | decimal128(20, 2) |
| LongestAddGTime | decimal128(20, 2) |
| DivAirportLandings | int32 |
| DivReachedDest | decimal128(20, 2) |
| DivActualElapsedTime | decimal128(20, 2) |
| DivArrDelay | decimal128(20, 2) |
| DivDistance | decimal128(20, 2) |
| Div1Airport | string |
| Div1AirportID | string |
| Div1AirportSeqID | string |
| Div1WheelsOn | string |
| Div1TotalGTime | decimal128(20, 2) |
| Div1LongestGTime | decimal128(20, 2) |
| Div1WheelsOff | string |
| Div1TailNum | string |
| Div2Airport | string |
| Div2AirportID | string |
| Div2AirportSeqID | string |
| Div2WheelsOn | string |
| Div2TotalGTime | decimal128(20, 2) |
| Div2LongestGTime | decimal128(20, 2) |
| Div2WheelsOff | string |
| Div2TailNum | string |
| Div3Airport | string |
| Div3AirportID | string |
| Div3AirportSeqID | string |
| Div3WheelsOn | string |
| Div3TotalGTime | decimal128(20, 2) |
| Div3LongestGTime | decimal128(20, 2) |
| Div3WheelsOff | string |
| Div3TailNum | string |
| Div4Airport | string |
| Div4AirportID | string |
| Div4AirportSeqID | string |
| Div4WheelsOn | string |
| Div4TotalGTime | decimal128(20, 2) |
| Div4LongestGTime | decimal128(20, 2) |
| Div4WheelsOff | string |
| Div4TailNum | string |
| Div5Airport | string |
| Div5AirportID | string |
| Div5AirportSeqID | string |
| Div5WheelsOn | string |
| Div5TotalGTime | decimal128(20, 2) |
| Div5LongestGTime | decimal128(20, 2) |
| Div5WheelsOff | string |
| Div5TailNum | string |
| source_month | string |
| source_row | int64 |
Inspect the public CSV
import pandas as pd
df = pd.read_csv(
"https://huggingface.co/datasets/claritystorm/dot-airline-ontime/resolve/main/sample_1000.csv"
)
print(df.shape)
print(df.columns.tolist())
print(df.head())This CSV is a sample, not the full package. It does not establish complete historical coverage or represent every field’s missingness. License details are on the Hugging Face card.
Source: government source portal · Dataset changelog