pynhts
Typed, survey-weight-aware Python access to US National Household Travel Survey (NHTS) microdata.
Scope and status (0.2.1, alpha). Only the 2017 wave is supported; other waves come after this one is solid. The API may still change. Results are validated against FHWA's published tables: 20 of 24 figures reproduce completely and 4 gaps are reported openly (tours: 21 of 33, see the validation page) in docs/validation.md.
Install
pip install pynhts
pynhts fetch --replicates # download, verify (SHA-256) and convert; about 0.4 GB of Parquet, plus 1.8 GB of raw CSV that you may delete afterwards
Already have the NHTS 2017 CSV files? pynhts register <folder> adopts them after checking
their hashes.
What it does
import pynhts
data = pynhts.load(2017)
# lazy, validated tables: columns are joined from the table that owns them
trips = data.trips(["TRPMILES", "TRPTRANS", "HHFAMINC", "R_AGE"])
# weighted statistics with jackknife (JKn) standard errors and 95 % margins of error
s = data.survey("person", ["R_AGE_IMP", "DRIVER"])
s.total(domain=s.rows["DRIVER"] == "01") # 223,277 thousand drivers, MOE 827 thousand
data.survey("trip", ["TRPMILES"]).mean("TRPMILES") # 10.70 miles, MOE 0.40
# replicate a published table and see every gap
from pynhts import recipes
print(recipes.to_markdown(recipes.run("stt2017", data)))
# machine-learning bridge
from pynhts import ml
arr = ml.to_arrays(trips, ["TRPMILES", "R_AGE"], target="TRPTRANS", weight="WTTRDFIN")
| Module | Purpose |
|---|---|
pynhts.io |
verified download, offline mode, deterministic Parquet cache |
pynhts.core |
codebook-derived schema, NHTSData loader, missing-code handling |
pynhts.stats |
JKn totals, means, proportions, ratios; margins of error |
pynhts.recipes |
replication of published tables with honest status per figure |
pynhts.tours |
tour formation (HBW/HBO/NHB, work-tour patterns), FHWA-style chains; flexible home/work rules |
pynhts.ml |
NumPy / PyTorch / graph export (PyTorch optional) |
Why a library
Correct NHTS analysis has many silent traps (a data server that returns HTTP 200 for missing
files, string codes with leading zeros, -1 skips that are not missing data, 107 copied
parent columns in the child tables, a vehicle PERSONID that is not the person key, ...).
They are documented in docs/data_notes.md and each is covered by a test.
Validation
- All 3,807 coded values of the official codebook (counts and weighted totals) reproduce.
- 24 figures from Tables 1 and 3 of FHWA's Summary of Travel Trends: 2017 NHTS, with margins of error: 20 reproduce completely, 2 reproduce the estimate but not the margin of error, 2 do not reproduce.
- The transit-user sample of McNally & Rafiq's tour study (4,994 persons, 20,222 trips, 10,011
transit trips) exactly, plus 33 of their figures in all: 21 reproduce, 12 gaps are documented
(
pynhts.tours). See docs/validation.md.
Documentation
Methods · Data notes · Validation · Roadmap · Contributing · Changelog
Data
The NHTS microdata are public data of the US Federal Highway Administration (https://nhts.ornl.gov). They are never bundled with or committed to this repository.
Development
uv venv && uv pip install -e ".[dev]"
pytest # unit tests, no data needed
pytest -m data # real-data tests (files registered in the pynhts cache)
pytest -m network -o addopts=-ra # live ORNL download, manual only
Citation
See CITATION.cff. License: BSD-3-Clause.
Metadata
Release files for pynhts 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pynhts-0.2.1.tar.gz | 1.2 MB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pynhts-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.4 MB
Release files / pynhts-0.2.1.tar.gz
| Download URL | pynhts-0.2.1.tar.gz |
|---|---|
| Size | 1.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9a82a6c5c6ce234e214011712b7e91425b79f086ed3150316d588c0581263562
|
|
BLAKE2b-256 checksum How to use checksums |
fe9d17492b3f79c859dafac1abd89eabde5174f9d5f6f762ae2fde4dba4b1d77
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / pynhts-0.2.1-py3-none-any.whl
| Download URL | pynhts-0.2.1-py3-none-any.whl |
|---|---|
| Size | 156.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
15cfdb82a7afc2d2218091565ee74c59a7ee3d90a53d3a8db369345fa36fa737
|
|
BLAKE2b-256 checksum How to use checksums |
c0f1469036cb5d8aa720b1d4c8841fd97b129beb699291de40db01079ec7e785
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logSecurity for pynhts 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for pynhts-0.2.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.