From 171859ecb3ed0d365a9e72d2e644450dd2168ecc Mon Sep 17 00:00:00 2001 From: thodson-usgs Date: Thu, 22 Oct 2026 14:05:18 -0500 Subject: [PATCH 1/9] feat!: remove the deprecated nwis module Remove dataretrieval.nwis ahead of its 2027-05-06 horizon. USGS is decommissioning the waterservices endpoints it called, and every getter has a waterdata (or nwdc) replacement. - Delete dataretrieval/nwis.py, its tests and fixtures, and its reference page. - Remove NoSitesError (only the waterservices path raised it) and the "No sites/data" body check in _querying; remove REMOVALS["nwis"] and the now-unused _validation.require_any_of. - Drop nwis from .importlinter (layers + nwis-quarantine contract), pyproject, pre-commit comments, and the pyscn clone baseline. - Port demos: the defunct hydroshare water-use notebook is rewritten on nwdc.get_wateruse (USGS_NWDC_WaterUse_Examples); the nwqn_data_pull scripts use waterdata.get_monitoring_locations / get_daily; copy-edit notebooks that still described nwis as current. - Docs: add missing nblinks for USGS_WaterUse_Examples and USGS_NLDI_Examples; update README, NEWS, CONTEXT, AGENTS, CONTRIBUTING, the architecture overview, and mark ADR 0005 completed. BREAKING CHANGE: `import dataretrieval.nwis` raises ModuleNotFoundError, and dataretrieval.NoSitesError / exceptions.NoSitesError are removed. --- .importlinter | 27 +- .pre-commit-config.yaml | 10 +- .pyscn-known-clones.json | 29 +- AGENTS.md | 14 +- CONTEXT.md | 25 +- CONTRIBUTING.md | 10 +- NEWS.md | 2 + README.md | 7 - dataretrieval/__init__.py | 11 +- dataretrieval/_deprecation.py | 5 +- dataretrieval/_querying.py | 25 +- dataretrieval/_response_metadata.py | 4 +- dataretrieval/_validation.py | 45 +- dataretrieval/exceptions.py | 37 +- dataretrieval/nwdc.py | 3 +- dataretrieval/nwis.py | 1330 ---------- dataretrieval/ogc/chunking.py | 2 +- dataretrieval/ogc/shaping.py | 3 +- dataretrieval/rdb.py | 13 +- dataretrieval/transport/http.py | 2 +- dataretrieval/wateruse.py | 7 +- demos/R Python Vignette equivalents.ipynb | 4 +- ...USGS_WaterData_Introduction_Examples.ipynb | 7 +- demos/WaterData_demo.ipynb | 4 +- .../USGS_NWDC_WaterUse_Examples.ipynb | 265 ++ .../USGS_NWIS_WaterUse_Examples.ipynb | 186 -- .../USGS_WaterData_Peaks_Examples.ipynb | 2 +- .../USGS_WaterData_Ratings_Examples.ipynb | 2 +- .../USGS_WaterData_Statistics_Examples.ipynb | 2 +- demos/nwqn_data_pull/retrieve_nwqn_samples.py | 25 +- .../retrieve_nwqn_streamflow.py | 63 +- demos/peak_streamflow_trends.ipynb | 2 +- .../decisions/0001-modular-monolith.rst | 12 +- .../decisions/0003-dependency-direction.rst | 6 +- .../decisions/0005-legacy-nwis.rst | 12 +- .../0006-service-neutral-transport.rst | 3 +- .../decisions/0007-adapter-facades.rst | 4 +- .../0010-adapter-scoped-settings.rst | 18 +- .../decisions/0013-core-and-domain-terms.rst | 3 +- docs/source/architecture/index.rst | 15 +- .../source/examples/USGS_NLDI_Examples.nblink | 3 + .../USGS_NWDC_WaterUse_Examples.nblink | 3 + .../USGS_NWIS_WaterUse_Examples.nblink | 3 - .../examples/USGS_WaterUse_Examples.nblink | 3 + docs/source/examples/index.rst | 10 +- docs/source/examples/readme_examples.rst | 3 +- docs/source/reference/index.rst | 1 - docs/source/reference/nwis.rst | 8 - docs/source/userguide/dataportals.rst | 2 - pyproject.toml | 3 +- tests/configuration_test.py | 18 +- tests/data/nwis_iv_empty_mock.json | 5 - tests/data/nwis_iv_mock.json | 84 - tests/data/nwis_sites.txt | 238 -- tests/data/waterservices_dv.txt | 1 - tests/data/waterservices_iv.txt | 1 - tests/data/waterservices_peaks.txt | 94 - tests/data/waterservices_ratings.txt | 47 - tests/data/waterservices_site.txt | 33 - tests/data/waterservices_stats.txt | 2222 ----------------- tests/deprecation_test.py | 6 +- tests/headers_host_scoping_test.py | 2 +- tests/nldi_test.py | 2 +- tests/nwdc_test.py | 2 +- tests/nwis_test.py | 675 ----- tests/utils_test.py | 52 +- tests/validation_test.py | 30 - tests/waterservices_test.py | 418 ---- 68 files changed, 475 insertions(+), 5740 deletions(-) delete mode 100644 dataretrieval/nwis.py create mode 100644 demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb delete mode 100644 demos/hydroshare/USGS_NWIS_WaterUse_Examples.ipynb create mode 100644 docs/source/examples/USGS_NLDI_Examples.nblink create mode 100644 docs/source/examples/USGS_NWDC_WaterUse_Examples.nblink delete mode 100644 docs/source/examples/USGS_NWIS_WaterUse_Examples.nblink create mode 100644 docs/source/examples/USGS_WaterUse_Examples.nblink delete mode 100644 docs/source/reference/nwis.rst delete mode 100644 tests/data/nwis_iv_empty_mock.json delete mode 100644 tests/data/nwis_iv_mock.json delete mode 100755 tests/data/nwis_sites.txt delete mode 100755 tests/data/waterservices_dv.txt delete mode 100644 tests/data/waterservices_iv.txt delete mode 100755 tests/data/waterservices_peaks.txt delete mode 100755 tests/data/waterservices_ratings.txt delete mode 100755 tests/data/waterservices_site.txt delete mode 100755 tests/data/waterservices_stats.txt delete mode 100644 tests/nwis_test.py delete mode 100644 tests/waterservices_test.py diff --git a/.importlinter b/.importlinter index 7dc23e522..2c3efe590 100644 --- a/.importlinter +++ b/.importlinter @@ -25,7 +25,7 @@ layers = ; adapters rather than beside them. A compatibility facade may depend on the ; adapter it forwards to; nothing may depend on the facade. wateruse - ngwmn | nldi | nwdc | nwis | streamstats | waterdata | wqp + ngwmn | nldi | nwdc | streamstats | waterdata | wqp ogc utils _querying @@ -122,31 +122,6 @@ forbidden_modules = dataretrieval._querying dataretrieval.utils -[importlinter:contract:nwis-quarantine] -name = Deprecated NWIS has no dependents (ADR 0005) -type = forbidden -source_modules = - dataretrieval._querying - dataretrieval.codes - dataretrieval.combining - dataretrieval.credentials - dataretrieval.exceptions - dataretrieval.interruptions - dataretrieval.ngwmn - dataretrieval.nldi - dataretrieval.ogc - dataretrieval.progress - dataretrieval.rdb - dataretrieval.streamstats - dataretrieval.transport - dataretrieval.utils - dataretrieval.nwdc - dataretrieval.waterdata - dataretrieval.wateruse - dataretrieval.wqp -forbidden_modules = - dataretrieval.nwis - [importlinter:contract:waterdata-families] name = Water Data collection families do not reach through each other (ADR 0007) type = independence diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 33820d046..2c2206316 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -75,17 +75,17 @@ repos: # Cognitive-complexity ratchet, the counterpart to xenon's cyclomatic one. # The two measure different things: xenon counts branches, complexipy counts # how hard the control flow is to hold in your head, so nesting and early - # exits weigh differently. 25 is the package's current maximum - # (``nwis._read_json``), so this holds the line rather than demanding a - # refactor. Unlike xenon this one is per-function, so scanning only the - # changed files gives the same verdict CI gives for the whole package. + # exits weigh differently. The ceiling is ``max-complexity-allowed`` in + # ``[tool.complexipy]`` (pyproject.toml), which holds the line rather than + # demanding a refactor. Unlike xenon this one is per-function, so scanning + # only the changed files gives the same verdict CI gives for the whole package. - repo: https://github.com/rohaquinlop/complexipy-pre-commit rev: v6.2.0 hooks: - id: complexipy files: ^dataretrieval/.*\.py$ - # Dependency-direction contracts (ADR 0003, 0005, 0006, 0007). Complements + # Dependency-direction contracts (ADR 0003, 0006, 0007). Complements # tests/architecture_test.py, which enforces named pairwise claims by parsing # the AST; this checks the whole layer stack over the *transitive* graph, so # a service reaching transport through OGC fails here. Runs in about a diff --git a/.pyscn-known-clones.json b/.pyscn-known-clones.json index 10cc38b05..6e2235adc 100644 --- a/.pyscn-known-clones.json +++ b/.pyscn-known-clones.json @@ -34,20 +34,11 @@ ] }, "observed": { - "total_fragments": 351, - "cloned_fragments": 13, - "groups": 5 + "total_fragments": 349, + "cloned_fragments": 11, + "groups": 4 }, "groups": [ - { - "members": [ - "dataretrieval/_validation.py::reject_together", - "dataretrieval/_validation.py::require_any_of" - ], - "similarity": 0.85, - "clone_type": 4, - "rationale": "Shared argument checks (AGENTS.md, Error messages): each returns early when the arguments are valid and otherwise raises one message from the same parts. Each check owns its wording, so a common helper would only move the message apart from the check that states it." - }, { "members": [ "dataretrieval/nwdc.py::_validate_county", @@ -90,18 +81,6 @@ ], "sub_threshold_accepted": { "_comment": "Families that pyscn 1.29.0 did NOT report at its defaults (they sat under its min_lines=10 / min_nodes=20) but that a deliberate scan at min_nodes=8 found on 2026-08-09. Not re-scanned with 1.32.4, whose min_lines is 8. Recorded so they are not rediscovered and re-litigated. They are NOT counted in `observed` above.", - "groups": [ - { - "members": [ - "dataretrieval/nwis.py::get_discharge_measurements", - "dataretrieval/nwis.py::get_gwlevels", - "dataretrieval/nwis.py::get_pmcodes", - "dataretrieval/nwis.py::get_qwdata", - "dataretrieval/nwis.py::get_water_use" - ], - "similarity": 0.83, - "rationale": "Deprecated NWIS getters (ADR 0005). The surface is frozen pending removal, so collapsing it buys nothing and churns a public API users are being migrated off." - } - ] + "groups": [] } } diff --git a/AGENTS.md b/AGENTS.md index 38bb76217..ebebe1421 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,8 +9,8 @@ and takes one spelling everywhere *including identifiers*, so a name in the code that conflicts with it is a defect. A **domain** term -- *monitoring location*, *collection* -- is fixed for prose only: each adapter keeps its - own service's spelling in its parameters, so `nwis.get_record(service="dv")` - and WQP's `Station` are that service's vocabulary rather than drift. Each + own service's spelling in its parameters, so WQP's `siteid` and `Station` + are that service's vocabulary rather than drift. Each entry states which kind it is. - Architectural decisions and their rationale: `docs/source/architecture/decisions/` (ADRs, referenced by number throughout the code and by `.importlinter`). @@ -21,8 +21,8 @@ Use `ls`/`grep` for the file list; what follows is the placement logic, so you can predict where a thing is defined. - `dataretrieval/` — the public surface is one *adapter* module per service, - named for the service (`nldi`, `nwdc`, `ngwmn`, `streamstats`, `wqp`, and - legacy `nwis`); each owns that service's URLs, parameters, and response + named for the service (`nldi`, `nwdc`, `ngwmn`, `streamstats`, and `wqp`); + each owns that service's URLs, parameters, and response quirks. `waterdata/` is the one adapter large enough to be a package, split by collection family; its `api.py` is a compatibility facade holding no logic. Everything else in the package is shared code the adapters depend on @@ -112,8 +112,8 @@ raise states the problem and then the action that fixes it, in that order. - Don't invent a phrasing for a check that recurs. `dataretrieval/_validation.py` owns the wording for the shared cases — bad value in a closed vocabulary (`require_one_of`), missing argument (`require_argument`), incomplete group - (`require_together`), no filter at all (`require_any_of`), and conflicting - arguments (`require_exactly_one`, `reject_together`). Use one before + (`require_together`), and conflicting arguments + (`require_exactly_one`, `reject_together`). Use one before hand-writing a message. A service-specific pointer is not a reason to hand-write: every check takes a `remedy=` for the action it cannot derive. Every check raises `ValueError` -- one class for a bad argument value, so a @@ -146,7 +146,7 @@ raise states the problem and then the action that fixes it, in that order. - Public getters return `(DataFrame, metadata)`. - `dataretrieval/__init__.py` imports the service modules by name and lists them in `__all__`; it does not star-import them, so a getter is accessed through its - module (`dataretrieval.nwis.get_record`), never from the top level. `nldi` is + module (`dataretrieval.wqp.get_results`), never from the top level. `nldi` is deliberately absent — it needs `geopandas` at import time, so it is imported on demand. `dataretrieval/waterdata/__init__.py` controls Water Data exports via `__all__`. diff --git a/CONTEXT.md b/CONTEXT.md index 2339dfc37..6ff44eb44 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -106,8 +106,11 @@ what the service offers. **NLDI** — The Network Linked Data Index, which navigates the hydrologic network from an origin to connected features, flowlines, or basins. -**NWIS** — The legacy USGS waterservices interface. Deprecated: it is retained -for compatibility and should receive no new work. +**NWIS** — The legacy USGS waterservices interface. Retired: the +`dataretrieval.nwis` adapter was removed in the next major release (2026-10), +so `import dataretrieval.nwis` raises `ModuleNotFoundError`. The term is kept +because "NWIS" survives as a data-provider name and data value in other services +(WQP `providers=NWIS`, the USGS NWIS time-zone code list) and in this history. **StreamStats** — Basin characteristics and delineation for a point on a stream. @@ -121,14 +124,10 @@ collections. The distinction matters because the OGC code is shared: the same code path retrieves a Water Data collection and an NGWMN one, and only the service differs. -*Domain term.* Water Data and NGWMN say `collection`; legacy NWIS says -`service=` (`'dv'`, `'peaks'`); WQP names its collections as profiles -(`Result`, `Station`, `Activity`). Those parameters are frozen public surface -and keep their spelling. Prose says *collection*, including prose about the -adapters that spell it otherwise — with one exception: deprecated NWIS keeps -`service` in its docstrings as well as its parameters. Describing a parameter -in a term its own module never uses helps nobody, and a module being retired is -not where new vocabulary should be introduced. +*Domain term.* Water Data and NGWMN say `collection`; WQP names its collections +as profiles (`Result`, `Station`, `Activity`). Those parameters are frozen +public surface and keep their spelling. Prose says *collection*, including prose +about the adapters that spell it otherwise. **Collection family** — A group of collections sharing a shape and therefore a getter signature. Their getters deliberately resemble one another; the @@ -137,8 +136,8 @@ resemblance is the public contract, not duplication to be removed. **Monitoring location** — A place where measurements are recorded. *Domain term.* The services differ, and each adapter keeps its own service's -spelling in its parameters: NWIS `site_no` and `sites=`, WQP `Station` and -`siteid`, Water Data `monitoring_location_id`, NGWMN's `sites` collection. Where +spelling in its parameters: WQP `Station` and `siteid`, Water Data +`monitoring_location_id`, NGWMN's `sites` collection. Where a service names a thing `site-types` or `site_type_code`, that is its vocabulary and is reproduced rather than translated. Prose that is not about one particular adapter says *monitoring location*. @@ -264,7 +263,7 @@ adapter supplies one and the shared code reads it, which is how protocol code stays free of service names. **Single-shot adapter** — An adapter whose query is always exactly one request: -WQP, NLDI, StreamStats, and deprecated NWIS. Nothing divides and nothing +WQP, NLDI, and StreamStats. Nothing divides and nothing distributes, so `concurrency` and `parallel_chunks` are not part of its vocabulary. NWDC is not one: its query fans out per location even though it never chunks by bytes. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d1047fc8c..45a633d80 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -177,8 +177,8 @@ restructuring. `lint-imports` checks the dependency contracts declared in [`.importlinter`](.importlinter) against the *transitive* import graph: the layer -stack, which modules may consume OGC, NGWMN's facade-only seam, the NWIS -quarantine, and collection-family independence. +stack, which modules may consume OGC, NGWMN's facade-only seam, and +collection-family independence. **That file is the only place dependency direction is enforced.** These rules were once asserted a second time in `tests/architecture_test.py` by hand-parsing @@ -246,16 +246,14 @@ link checking. * The public interface should emphasize functions over classes; classes can and should be used internally and in tests. * Group public download functions by service. For example, modern Water - Data functions belong in `dataretrieval.waterdata`; legacy NWIS functions - remain quarantined in `dataretrieval.nwis` during deprecation. + Data functions belong in `dataretrieval.waterdata`. * Treat a change to a service's documented return shape or metadata type as a public compatibility change; update contract tests and architecture documentation and follow the deprecation process where required. * Preserve the dependency direction documented in [`docs/source/architecture`](docs/source/architecture/index.rst): public facades depend on service/protocol adapters, which depend on stable shared - policy and infrastructure. Shared OGC code must not import service adapters, - and modern modules must not depend on legacy NWIS. + policy and infrastructure. Shared OGC code must not import service adapters. * Treat underscore-prefixed helpers as implementation details. Existing cross-package uses are documented variances, not extension points for new code. diff --git a/NEWS.md b/NEWS.md index 28dd18fdc..76db51f1e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,5 @@ +**10/22/2026:** **Breaking change:** `dataretrieval.nwis` is removed, ahead of its 2027-05-06 horizon, because USGS is [decommissioning the legacy waterservices endpoints](https://waterdata.usgs.gov/blog/api-waterservices-decom/) the module called. `import dataretrieval.nwis` now raises `ModuleNotFoundError`. Migrate to the `waterdata` getters: `get_dv` -> `get_daily`, `get_iv` -> `get_continuous`, `get_info` / `what_sites` -> `get_monitoring_locations`, the data catalog -> `get_time_series_metadata`, `get_discharge_peaks` -> `get_peaks`, `get_ratings` -> `get_ratings`, `get_stats` -> `get_stats_por` / `get_stats_date_range`, `get_discharge_measurements` / `get_gwlevels` -> `get_field_measurements`, and qw -> `get_samples`; water use moves to `nwdc.get_wateruse`. **Breaking change:** `dataretrieval.exceptions.NoSitesError` (and its `dataretrieval.NoSitesError` re-export) is removed; only the waterservices path raised it, and the modern getters return an empty `DataFrame` when nothing matches. The other published deprecations are unchanged and remain on their horizons: the `get_time_series_metadata()` v0 filters (`begin_utc`, `end_utc`, `state`, `state_name`, `hydrologic_unit_code`) on or after 2027-06-01, `get_cql(service=)` on or after 2027-08-09, the `wateruse` module alias on or after 2027-08-11, and `ogc.interruptions` on or after 2027-08-25. + **10/16/2026:** **Bug fix:** the time-zone table behind the `*DateTime` columns that `waterdata.get_samples()` and `wqp.get_results()` append, and behind `utils.format_datetime()`, now follows the code lists those services use: the USGS NWIS time-zone list (Samples, and the USGS records that the Water Quality Portal passes through) and the WQX TimeZone domain (Water Quality Portal). USGS records write American Samoa as `ZP-11`, which was missing, so every timed American Samoa row from `get_samples()`, and every timed USGS American Samoa row from `get_results()`, had a `NaT` datetime; it is now UTC-11. 39 other codes from the two lists that used to become `NaT` now resolve, among them the remaining `ZP*` offsets, `IDLW`, `IDLE`, `NZT`, `SWT`, and the retired WQX codes `AHST` and `YST`. **Behavior change:** codes that the table read with a different meaning from the USGS list now take the USGS meaning: `CAST` (+9:30), `CCT` (+8), `EASST` (+11), `EAST` (+10), `NFT` (-3:30), `NZDT` (+13), `WAST` (+7), and `WAT` (-1). `FJST` is now UTC+13. Where the two lists disagree, WQX wins: `SST` stays American Samoa (UTC-11), the meaning the Water Quality Portal returns, and `BST` is UTC-11. **10/15/2026:** **Bug fix:** the `ActivityStartDateTime` and `Activity_StartDateTime` columns that `wqp.get_results()` and `waterdata.get_samples()` append, and the `datetime` column of `utils.format_datetime()`, read the time-zone code `GST` as Gulf Standard Time (UTC+4). The USGS time-zone codes and the WQX TimeZone domain both define `GST` as Guam Standard Time (UTC+10), so a sample collected on Guam at 10:00 local time was placed at 06:00 UTC instead of 00:00 UTC. `GST` is now UTC+10, and `HDT` (Hawaii-Aleutian Daylight Time, UTC-9), a USGS code that was missing from the table, now resolves instead of becoming `NaT`. diff --git a/README.md b/README.md index e639981d1..4a3b2b2d8 100644 --- a/README.md +++ b/README.md @@ -334,13 +334,6 @@ print(statewide.head()) - `get_well_construction`: Casing, screen, and build-out records - `get_providers`: Contributing data-provider organizations -### Legacy NWIS Services (Deprecated) — `dataretrieval.nwis` -- `get_dv`: Legacy daily statistical data -- `get_iv`: Legacy continuous (instantaneous) data -- `get_info`: Basic site information -- `get_stats`: Statistical summaries -- `get_discharge_peaks`: Annual peak discharge events - ### Water Quality Portal — `dataretrieval.wqp` - `get_results`: Water-quality analytical results from USGS, EPA, and other agencies - `what_sites`: Monitoring-location information diff --git a/dataretrieval/__init__.py b/dataretrieval/__init__.py index 7e3349f75..dfca4e519 100644 --- a/dataretrieval/__init__.py +++ b/dataretrieval/__init__.py @@ -6,14 +6,9 @@ df, meta = waterdata.get_daily(monitoring_location_id="USGS-05427718") - from dataretrieval import nwis # legacy NWIS services - - df, meta = nwis.get_dv(sites="05427718") - Available service modules: ``waterdata``, ``wqp`` (Water Quality Portal), ``nwdc`` (National Water Availability Assessment Data Companion, incl. -water use), ``nldi``, ``streamstats``, and the -deprecated ``nwis``. +water use), ``nldi``, and ``streamstats``. ``nldi`` requires geopandas (``pip install dataretrieval[nldi]``) and is imported on demand: ``from dataretrieval import nldi``. @@ -56,7 +51,6 @@ DataRetrievalError, HTTPError, NetworkError, - NoSitesError, RateLimited, RequestTooLarge, ServiceUnavailable, @@ -89,7 +83,6 @@ exceptions, ngwmn, nwdc, - nwis, streamstats, utils, waterdata, @@ -105,7 +98,6 @@ # service modules "ngwmn", "nwdc", - "nwis", "streamstats", "utils", "waterdata", @@ -117,7 +109,6 @@ "DataRetrievalError", "HTTPError", "NetworkError", - "NoSitesError", "RateLimited", "RequestTooLarge", "ServiceUnavailable", diff --git a/dataretrieval/_deprecation.py b/dataretrieval/_deprecation.py index b4b12e94c..60bac1792 100644 --- a/dataretrieval/_deprecation.py +++ b/dataretrieval/_deprecation.py @@ -15,7 +15,6 @@ #: commitment already made in a released warning message; read it rather than #: spelling a date at the call site, so extending one is a single edit. REMOVALS: dict[str, str] = { - "nwis": "2027-05-06", "waterdata.get_cql(service=)": "2027-08-09", "wateruse": "2027-08-11", "ogc.interruptions": "2027-08-25", @@ -39,8 +38,8 @@ def warn_deprecated( Parameters ---------- subject - What is being removed, as the caller spells it (``"nwis.get_dv"``, the - keyword ``"stateFips"``). + What is being removed, as the caller spells it + (``"waterdata.get_cql(service=)"``, the keyword ``"stateFips"``). replacement What to use instead. Named in every message because a deprecation without a replacement gives the caller nothing to do. diff --git a/dataretrieval/_querying.py b/dataretrieval/_querying.py index ad1c2c803..dcaf99b72 100644 --- a/dataretrieval/_querying.py +++ b/dataretrieval/_querying.py @@ -1,17 +1,16 @@ -"""The one-shot HTTP query path behind the legacy service adapters. +"""The one-shot HTTP query path behind the single-request service adapters. "Compose a USGS query URL, send it, map the status, retry a transient" -- the -half of the old ``utils`` module that issues requests, as used by ``nwis``, -``wqp``, ``nldi``, ``streamstats`` and ``nwdc``. Its other half (pandas +half of the old ``utils`` module that issues requests, as used by ``wqp``, +``nldi``, ``streamstats`` and ``nwdc``. Its other half (pandas column reshaping) shared nothing with this but a filename: no caller used both, and the two have disjoint dependencies -- this one needs ``exceptions`` and ``transport``, that one needs ``codes`` and pandas. The module is private because the *names* are not: ``query`` and ``to_str`` keep their documented ``dataretrieval.utils`` path, the way ``Ambient`` and -``BaseMetadata`` do from their own implementation leaves. This is legacy -code for the deprecated single-request adapters; new service code uses -the chunked transport instead. +``BaseMetadata`` do from their own implementation leaves. This path serves the +single-request adapters; the chunked services use the chunked transport instead. """ from __future__ import annotations @@ -22,7 +21,6 @@ import httpx from dataretrieval.exceptions import ( - NoSitesError, URLTooLong, error_for_status, parse_retry_after, @@ -81,8 +79,7 @@ def to_str(listlike: object, delimiter: str = ",") -> str | None: data_list = [] # list to store chunk results in \n # loop through chunks and make requests \n for site_list in split_list: \n - data = nwis.get_record(sites=site_list, service='dv', \n - start=start, end=end) \n + data, _ = wqp.get_results(siteid=site_list) \n data_list.append(data) # append results to list""" @@ -101,7 +98,7 @@ def _raise_for_status( ) -> None: """Raise the typed :class:`DataRetrievalError` for an HTTP error response. - A success status returns ``None``. Shared by the legacy :func:`query` path + A success status returns ``None``. Shared by the single-request :func:`query` path (and ``streamstats`` / ``nwdc``). Delegates the status-to-type mapping to :func:`dataretrieval.exceptions.error_for_status`, except a too-long-URL status (413 / 414): that gets the same actionable "split your query" @@ -215,11 +212,6 @@ def _query_with_retry( **HTTPX_DEFAULTS, ) - # USGS waterservices reports an empty result with a 200 whose body starts - # "No sites/data ..." (its legacy wording); raise it as NoSitesError. - if response.text.startswith("No sites/data"): - raise NoSitesError(response.url) - return response @@ -255,8 +247,7 @@ def query( DataRetrievalError On an HTTP error response, the typed subclass for the status (see :func:`dataretrieval.exceptions.error_for_status` for the mapping); or - :class:`~dataretrieval.exceptions.NoSitesError` when a 200 response - reports no data matched; or :class:`~dataretrieval.exceptions.NetworkError` + :class:`~dataretrieval.exceptions.NetworkError` on a connection-level failure (timeout, DNS), with the underlying ``httpx`` exception on ``__cause__``. """ diff --git a/dataretrieval/_response_metadata.py b/dataretrieval/_response_metadata.py index 6df404921..831f10177 100644 --- a/dataretrieval/_response_metadata.py +++ b/dataretrieval/_response_metadata.py @@ -53,8 +53,8 @@ def __init__(self, response: httpx.Response) -> None: @property def site_info(self) -> Any: raise NotImplementedError( - "This metadata object has no site_info: only the nwis and wqp " - "metadata classes implement it, and the getter that produced this " + "This metadata object has no site_info: only the wqp " + "metadata class implements it, and the getter that produced this " "result does not return site descriptions alongside data. Fetch " "them using a separate function from the same adapter -- " "dataretrieval.waterdata.get_monitoring_locations(" diff --git a/dataretrieval/_validation.py b/dataretrieval/_validation.py index 09ded82d0..5abe9502b 100644 --- a/dataretrieval/_validation.py +++ b/dataretrieval/_validation.py @@ -2,8 +2,8 @@ This leaf module owns recurring validation shapes and their message vocabulary; adapter-specific vocabularies remain with the adapters that define them. The -checks cover closed vocabularies, required arguments and groups, sufficient -alternatives, and mutually exclusive arguments. +checks cover closed vocabularies, required arguments and groups, and mutually +exclusive arguments. Every check raises ``ValueError`` about an argument's *value*, so calling code needs no inventory of which check raised. Every message states the problem and @@ -209,47 +209,6 @@ def require_together( ) -def require_any_of( - values: Mapping[str, object], - *, - context: str = "", - remedy: str = "", -) -> None: - """Raise ``ValueError`` unless at least one of *values* was supplied. - - For a query that needs to be narrowed but does not care how -- the NWIS - major filters, where any one of five is enough for the service to respond. - The permissive counterpart of :func:`require_exactly_one`: two of them is a - narrower query rather than a contradiction, so only none is an error. - ``None`` counts as not supplied, so ``sites=None`` is refused rather than - reaching the URL. - - Parameters - ---------- - values - Parameter name to supplied value, in the order the message should - list them. - context - What the group is for, when the parameter names do not say -- - ``context="to narrow the query"``. - remedy - Overrides the default remedy, which names the arguments to choose - among. - - Raises - ------ - ValueError - If none of *values* were supplied. - """ - supplied, _ = _supplied(values) - if supplied: - return - where = _qualify(context) - names = _render_names(values, conjunction="or") - fix = remedy or f"Pass one of {names}." - raise ValueError(f"At least one of {names} is required{where}. {fix}") - - def require_exactly_one( values: Mapping[str, _T | None], *, diff --git a/dataretrieval/exceptions.py b/dataretrieval/exceptions.py index 1ac4342c9..b4836726f 100644 --- a/dataretrieval/exceptions.py +++ b/dataretrieval/exceptions.py @@ -1,6 +1,6 @@ """Exception taxonomy for ``dataretrieval``. -Every service module (``nwis``, ``wqp``, ``nldi``, ``waterdata``, +Every service module (``wqp``, ``nldi``, ``waterdata``, ``streamstats``) raises a subclass of :class:`DataRetrievalError` when a request fails, so one ``except dataretrieval.DataRetrievalError`` catches them all. That includes connection-level failures (timeouts, DNS, refused connections), which @@ -12,7 +12,7 @@ of which :class:`TransientError` (429 / 5xx) is the retryable subset. The rest aren't a plain status: :class:`RequestTooLarge` (with :class:`URLTooLong` / :class:`Unchunkable`), :class:`NetworkError` (a failed connection, per above), -:class:`NoSitesError`, and :class:`ConfigurationError` for an unusable setting. +and :class:`ConfigurationError` for an unusable setting. :func:`error_for_status` maps a status to its type. ``ConfigurationError`` is the one member that is not a request failure at all: it reports an unusable setting or config file, raised from wherever a setting is first resolved -- @@ -32,10 +32,7 @@ import math from datetime import datetime, timezone from email.utils import parsedate_to_datetime -from typing import TYPE_CHECKING, Any, ClassVar - -if TYPE_CHECKING: - import httpx +from typing import Any, ClassVar __all__ = [ "DataRetrievalError", @@ -47,7 +44,6 @@ "URLTooLong", "Unchunkable", "NetworkError", - "NoSitesError", "ConfigurationError", "DataCurrencyWarning", "SkippedItemWarning", @@ -209,7 +205,7 @@ class RateLimited(TransientError): class ServiceUnavailable(TransientError): """A request was rejected with a server error (HTTP 5xx). - Raised by both the legacy ``query`` path and the Water Data path, so a 5xx + Raised by both the single-request ``query`` path and the Water Data path, so a 5xx is raised as one type whichever subsystem issued the request. ``.status_code`` holds the actual 5xx; it falls back to 503 only on a bare hand-construction. """ @@ -233,7 +229,7 @@ class RequestTooLarge(DataRetrievalError): class URLTooLong(RequestTooLarge): """A single request URL was too long for the service. - Raised on the legacy ``query`` path (which sends one un-chunked request), + Raised on the single-request ``query`` path (which sends one un-chunked request), whether the URL is rejected client-side before sending or by the server (see :func:`error_for_status`). Remediation: query fewer sites, or split the call manually. @@ -282,27 +278,6 @@ class ConfigurationError(DataRetrievalError, ValueError): """ -# --- Empty result -------------------------------------------------------- - - -class NoSitesError(DataRetrievalError): - """A request succeeded (HTTP 200) but matched no sites/data. - - A no-data result is normally **not** an error: the modern getters - (``waterdata``, ``wqp``, ``nldi``) return an empty ``DataFrame``. Only the - deprecated ``nwis`` (waterservices) path still raises this. - """ - - def __init__(self, url: httpx.URL) -> None: - self.url = url - - def __str__(self) -> str: - return ( - "No sites/data found using the selection criteria specified in " - f"url: {self.url}" - ) - - # --- Upstream data currency ----------------------------------------------- @@ -364,7 +339,7 @@ def error_for_status( ) -> DataRetrievalError: """Return the typed :class:`DataRetrievalError` for an HTTP error *status*. - The one status-to-type mapping every request path shares (the legacy + The one status-to-type mapping every request path shares (the single-request ``query`` path, ``waterdata``, ``streamstats``), so a given status becomes the same type everywhere: diff --git a/dataretrieval/nwdc.py b/dataretrieval/nwdc.py index a42b82540..673f0476f 100644 --- a/dataretrieval/nwdc.py +++ b/dataretrieval/nwdc.py @@ -5,8 +5,7 @@ National Water Availability Assessment `_. Estimates are served on a HUC12 (12-digit hydrologic unit) spatial grid and can be queried for any county, state, or hydrologic unit. This is the modern -replacement for the defunct legacy NWIS water-use service -(``nwis.get_water_use``). +replacement for the defunct legacy NWIS water-use service. Unlike the main Water Data getters (:mod:`dataretrieval.waterdata`) and NGWMN (:mod:`dataretrieval.ngwmn`), the NWDC is a plain CSV REST service rather than diff --git a/dataretrieval/nwis.py b/dataretrieval/nwis.py deleted file mode 100644 index 3969bcad5..000000000 --- a/dataretrieval/nwis.py +++ /dev/null @@ -1,1330 +0,0 @@ -"""Functions for downloading data from the `National Water Information System (NWIS)`_. - -.. _National Water Information System (NWIS): https://waterdata.usgs.gov/nwis - -""" - -from __future__ import annotations - -import functools -import threading -import warnings -from collections.abc import Callable -from json import JSONDecodeError -from typing import Any, NoReturn, TypeVar, cast - -import httpx -import pandas as pd - -from dataretrieval._deprecation import REMOVALS, warn_deprecated -from dataretrieval._response_metadata import BaseMetadata -from dataretrieval._validation import ( - require_any_of, - require_one_of, - require_together, -) -from dataretrieval.exceptions import DataCurrencyWarning -from dataretrieval.rdb import read_rdb - -from ._querying import query - -try: - import geopandas as gpd -except ImportError: - gpd = None - -F = TypeVar("F", bound=Callable[..., Any]) - -WATERDATA_BASE_URL = "https://nwis.waterdata.usgs.gov/" -WATERDATA_URL = WATERDATA_BASE_URL + "nwis/" -WATERSERVICE_URL = "https://waterservices.usgs.gov/nwis/" -PARAMCODES_URL = "https://help.waterdata.usgs.gov/code/parameter_cd_nm_query?" -ALLPARAMCODES_URL = "https://help.waterdata.usgs.gov/code/parameter_cd_query?" - -WATERSERVICES_SERVICES = ["dv", "iv", "site", "stat"] -# What ``get_record`` routes, which is wider than what ``query_waterdata`` -# serves: 'ratings' is served by ``get_ratings`` from a different endpoint. -WATERDATA_SERVICES = [ - "peaks", - "ratings", -] -# The major filters each query function accepts, placed with the service -# lists so the checks and their remedies use one list. -_NWIS_WEB_MAJOR_FILTERS = ("site_no", "stateCd") -_NWIS_WEB_BBOX_CORNERS = ( - "nw_longitude_va", - "nw_latitude_va", - "se_longitude_va", - "se_latitude_va", -) -_WATERSERVICES_MAJOR_FILTERS = ("sites", "stateCd", "bBox", "huc", "countyCd") -# NAD83 -_CRS = "EPSG:4269" - -# Hints for columns whose names do not mark them as codes: ``site_no`` is a -# zero-padded identifier, and the decimal coordinates are floats. Code columns -# (``parm_cd``, ``huc_cd``, ``state_cd``, ...) are detected from the RDB header -# by ``rdb.read_rdb``. -_NWIS_RDB_DTYPES = { - "site_no": str, - "dec_long_va": float, - "dec_lat_va": float, -} - - -_NWIS_REMOVAL_DATE = REMOVALS["nwis"] -_REPLACEMENTS = { - "get_dv": "`waterdata.get_daily()`", - "get_iv": "`waterdata.get_continuous()`", - "get_info": "`waterdata.get_monitoring_locations()`", - "what_sites": "`waterdata.get_monitoring_locations()`", - "get_stats": "`waterdata.get_stats_por()` or `waterdata.get_stats_date_range()`", - "get_discharge_peaks": "`waterdata.get_peaks()`", - "get_ratings": "`waterdata.get_ratings()`", - "get_record": "the appropriate `waterdata.get_*()` for the service you need", - "query_waterdata": "a high-level `waterdata.get_*()` helper", - "query_waterservices": "a high-level `waterdata.get_*()` helper", -} - -_deprecation_state = threading.local() - - -def _warn_deprecated(func_name: str) -> None: - """Emit a per-function DeprecationWarning naming the waterdata replacement.""" - warn_deprecated( - f"`nwis.{func_name}`", - replacement=_REPLACEMENTS[func_name], - removal=_NWIS_REMOVAL_DATE, - stacklevel=3, - ) - - -def _deprecated(func: F) -> F: - """Mark an nwis function as deprecated. - - Wrappers like ``get_record`` -> ``get_iv`` -> ``query_waterservices`` would - otherwise emit one warning per layer; the thread-local sentinel ensures the - user sees only the outermost call's warning. - """ - if func.__name__ not in _REPLACEMENTS: - raise RuntimeError( - f"_REPLACEMENTS missing entry for {func.__name__!r}; " - "add a `waterdata` replacement before applying @_deprecated." - ) - - @functools.wraps(func) - def wrapper(*args: Any, **kwargs: Any) -> Any: - if getattr(_deprecation_state, "active", False): - return func(*args, **kwargs) - _deprecation_state.active = True - try: - _warn_deprecated(func.__name__) - return func(*args, **kwargs) - finally: - _deprecation_state.active = False - - return cast("F", wrapper) - - -def _parse_json_or_raise(response: httpx.Response) -> pd.DataFrame: - """Parse a JSON NWIS response, raising an error that names an HTML body.""" - try: - return _read_json(response.json()) - except (ValueError, JSONDecodeError) as e: - text_lower = response.text.lower() - content_type = response.headers.get("Content-Type", "").lower() - if ( - "" in text_lower - or " pd.Index: - """Localize a naive datetime index (or multi-index level) to UTC.""" - if hasattr(index, "levels"): - # Multi-index: localize the datetime level (level 1) - if hasattr(index.levels[1], "tzinfo") and index.levels[1].tzinfo is None: - return index.set_levels(index.levels[1].tz_localize("UTC"), level=1) - elif hasattr(index, "tzinfo") and index.tzinfo is None: - return index.tz_localize("UTC") - return index - - -def format_response( - df: pd.DataFrame, service: str | None = None, **kwargs: Any -) -> pd.DataFrame: - """Set up the index for a query response. - - Formats the response from the NWIS web services; in particular, it sets - the index of the data frame. It converts the NWIS response into pandas - datetime values localized to UTC and, where possible, uses those - timestamps to define the data frame index. - - Parameters - ---------- - df: ``pandas.DataFrame`` - The data frame to format. - service: string, optional, default is None - The NWIS service that was queried. This matters because the 'peaks' - service returns a different format from the other services. - **kwargs: optional - Additional keyword arguments, e.g. 'multi_index'. - - Returns - ------- - df: ``pandas.DataFrame`` - The formatted data frame. - - """ - mi = kwargs.pop("multi_index", True) - - if service == "peaks": - df = preformat_peaks_response(df) - - if gpd is not None and "dec_lat_va" in df.columns: - geoms = gpd.points_from_xy(df.dec_long_va.values, df.dec_lat_va.values) - df = gpd.GeoDataFrame(df, geometry=geoms, crs=_CRS) - - if "datetime" not in df.columns: - return df - - if len(df["site_no"].unique()) > 1 and mi: - keys = ["site_no", "datetime"] - else: - keys = ["datetime"] - - # Index our own frame, never the caller's. The shallow copy shares the - # columns; ``set_index`` without ``inplace`` duplicates them, because - # pandas deep-copies the frame whenever copy-on-write is off. - df = df.copy(deep=False) - df.set_index(keys, inplace=True) # noqa: PD002 # our copy, not the caller's - - # Retag the index alone; ``DataFrame.tz_localize`` relabels the axis by - # duplicating every column whenever copy-on-write is off. - df.index = _localized_datetime_index(df.index) - return df.sort_index() - - -def preformat_peaks_response(df: pd.DataFrame) -> pd.DataFrame: - """Format the datetime column of the 'peaks' service response. - - Parameters - ---------- - df: ``pandas.DataFrame`` - The data frame to format. - - Returns - ------- - df: ``pandas.DataFrame`` - The formatted data frame. - - Notes - ----- - An empty frame with no ``peak_dt`` column is returned unchanged, so an - empty peaks response takes :func:`format_response`'s empty-frame path - instead of raising ``KeyError``. - - NWIS zero-fills the unknown part of a historical peak's date -- - ``YYYY-MM-00`` when the day is not known, ``YYYY-00-00`` when the month is - not either. Neither parses, so ``datetime`` is ``NaT`` for those peaks - rather than a date NWIS does not have. The peak is kept regardless, and - ``peak_dt`` is left in the frame: the response has no ``water_yr``, so - it is the only column holding a censored peak's year. - - """ - if df.empty and "peak_dt" not in df.columns: - # A non-empty frame missing peak_dt is malformed, not empty, and must - # still raise. - return df - - # Derive the column on our own frame, never the caller's. - df = df.copy(deep=False) - df["datetime"] = pd.to_datetime(df["peak_dt"], errors="coerce") - return df - - -def get_qwdata(**kwargs: Any) -> NoReturn: - """Defunct: use ``waterdata.get_samples()``.""" - raise NameError( - "`nwis.get_qwdata` has been replaced with `waterdata.get_samples()`." - ) - - -def get_discharge_measurements(**kwargs: Any) -> NoReturn: - """Defunct: use ``waterdata.get_field_measurements()``.""" - raise NameError( - "`nwis.get_discharge_measurements` has been replaced " - "with `waterdata.get_field_measurements`." - ) - - -@_deprecated -def get_discharge_peaks( - sites: list[str] | str | None = None, - start: str | None = None, - end: str | None = None, - multi_index: bool = True, - ssl_check: bool = True, - **kwargs: Any, -) -> tuple[pd.DataFrame, NWIS_Metadata]: - """Get discharge peaks from the waterdata service. - - Parameters - ---------- - sites: string or list of strings, optional, default is None - USGS site number (or list of site numbers). If the waterdata parameter - site_no is supplied, it overwrites the sites parameter. - start: string, optional, default is None - Starting date of record (YYYY-MM-DD). If the waterdata parameter - begin_date is supplied, it overwrites the start parameter. - end: string, optional, default is None - Ending date of record (YYYY-MM-DD). If the waterdata parameter - end_date is supplied, it overwrites the end parameter. - multi_index: bool, optional - If False, return a dataframe with a single-level index (datetime). - Default is True. - ssl_check: bool, optional - Whether to check SSL certificates. Default is True. - **kwargs: optional - Additional query parameters, if supplied. - - Returns - ------- - df: ``pandas.DataFrame`` - Time series data from the NWIS JSON. - md: :obj:`dataretrieval.nwis.NWIS_Metadata` - A custom metadata object. - - Examples - -------- - .. doctest:: - - >>> # Get discharge peaks for site 01491000 - >>> df, md = dataretrieval.nwis.get_discharge_peaks( - ... sites="01491000", start="1980-01-01", end="1990-01-01" - ... ) - - >>> # Get discharge peaks for sites in Hawaii - >>> df, md = dataretrieval.nwis.get_discharge_peaks( - ... start="1980-01-01", end="1980-01-02", stateCd="HI" - ... ) - - """ - _check_sites_value_types(sites) - - kwargs["site_no"] = kwargs.pop("site_no", sites) - kwargs["begin_date"] = kwargs.pop("begin_date", start) - kwargs["end_date"] = kwargs.pop("end_date", end) - kwargs["multi_index"] = multi_index - - response = query_waterdata("peaks", format="rdb", ssl_check=ssl_check, **kwargs) - - # Parse raw (read_rdb), not _read_rdb — the latter already runs - # format_response, and the explicit format_response(service="peaks") below - # does the peaks-specific formatting, so _read_rdb here was a redundant pass. - df = read_rdb(response.text, dtypes=_NWIS_RDB_DTYPES) - - return format_response(df, service="peaks", **kwargs), NWIS_Metadata( - response, **kwargs - ) - - -def get_gwlevels(**kwargs: Any) -> NoReturn: - """Defunct: use ``waterdata.get_continuous()``, ``waterdata.get_daily()``, - or ``waterdata.get_field_measurements()``.""" - raise NameError( - "`nwis.get_gwlevels` has been replaced. Use " - "`waterdata.get_continuous()` for continuous (typically 15-minute) " - "values, `waterdata.get_daily()` for daily values, or " - "`waterdata.get_field_measurements()` for discrete/manual readings." - ) - - -@_deprecated -def get_stats( - sites: list[str] | str | None = None, ssl_check: bool = True, **kwargs: Any -) -> tuple[pd.DataFrame, NWIS_Metadata]: - """Query the water services statistics service. - - For more information about the water services statistics service, visit - https://waterservices.usgs.gov/docs/statistics/statistics-details/ - - Parameters - ---------- - sites: string or list of strings, optional, default is None - USGS site number (or list of site numbers). - ssl_check: bool, optional - Whether to check SSL certificates. Default is True. - **kwargs: optional - Additional query parameters, if supplied. - - Keyword Arguments - ----------------- - statReportType: string - daily (default), monthly, or annual. - statTypeCd: string - all, mean, max, min, median. - - Returns - ------- - df: ``pandas.DataFrame`` - Statistics data from the statistics service. - md: :obj:`dataretrieval.nwis.NWIS_Metadata` - A custom metadata object. - - .. todo:: - - fix date parsing - - Examples - -------- - .. doctest:: - - >>> # Get annual water statistics for a site - >>> df, md = dataretrieval.nwis.get_stats( - ... sites="01646500", statReportType="annual", statYearType="water" - ... ) - - >>> # Get monthly statistics for a site - >>> df, md = dataretrieval.nwis.get_stats( - ... sites="01646500", statReportType="monthly" - ... ) - - """ - _check_sites_value_types(sites) - - response = query_waterservices( - service="stat", sites=sites, ssl_check=ssl_check, **kwargs - ) - - return _read_rdb(response.text), NWIS_Metadata(response, **kwargs) - - -@_deprecated -def query_waterdata( - service: str, ssl_check: bool = True, **kwargs: Any -) -> httpx.Response: - """Query the waterdata service. - - Parameters - ---------- - service: string - Name of the service to query. Only ``'peaks'`` is served here; rating - tables come from :func:`get_ratings`, which uses a different - endpoint. - ssl_check: bool, optional - Whether to check SSL certificates. Default is True. - **kwargs: optional - Additional query parameters, if supplied. - - Returns - ------- - request: ``httpx.Response`` - The response object from the API request to the web service. - """ - require_any_of( - { - name: kwargs.get(name) - for name in _NWIS_WEB_MAJOR_FILTERS + _NWIS_WEB_BBOX_CORNERS - }, - context="as a major filter", - remedy=( - "Pass one, e.g. site_no='01491000' or stateCd='WI', or all four " - "bounding-box corners together with " - "coordinate_format='decimal_degrees'." - ), - ) - require_together( - {name: kwargs.get(name) for name in _NWIS_WEB_BBOX_CORNERS}, - context="to describe a bounding box", - remedy=( - "Pass them along with coordinate_format='decimal_degrees', or " - "drop the bounding box and filter with " - f"{' or '.join(_NWIS_WEB_MAJOR_FILTERS)} instead." - ), - ) - require_one_of( - service, - ("peaks",), - name="service", - remedy=( - "Rating tables come from waterdata.get_ratings(" - "monitoring_location_id='USGS-01646500'), served from a different " - "endpoint and keyed by the AGENCY-ID form of the site number. It " - "returns {'USGS-01646500.exsa.rdb': DataFrame} -- a dict per file, " - "not a (frame, metadata) pair." - ), - ) - - url = WATERDATA_URL + service - - return query(url, payload=kwargs, ssl_check=ssl_check) - - -@_deprecated -def query_waterservices( - service: str, ssl_check: bool = True, **kwargs: Any -) -> httpx.Response: - """Query waterservices.usgs.gov. - - For more documentation see https://waterservices.usgs.gov/docs/ - - .. note:: - - User must specify one major filter: sites, stateCd, or bBox - - Parameters - ---------- - service: string - Name of the service to query: 'dv', 'iv', 'site', or 'stat'. - ssl_check: bool, optional - Whether to check SSL certificates. Default is True. - **kwargs: optional - Additional query parameters, if supplied. - - Keyword Arguments - ----------------- - bBox: string - Bounding box of decimal latitude and longitude values, given as - west longitude, south latitude, east longitude, north latitude, - separated by commas. - startDT: string - Start date (e.g. '2017-12-31'). - endDT: string - End date (e.g. '2018-01-01'). - modifiedSince: string - Period during which site attributes or period-of-record data must have - changed for a site to be returned. Expected to be a string in ISO-8601 - duration format (e.g. 'P1D' for one day, 'P1Y' for one year). - - Returns - ------- - request: ``httpx.Response`` - The response object from the API request to the web service. - - """ - require_any_of( - {name: kwargs.get(name) for name in _WATERSERVICES_MAJOR_FILTERS}, - context="as a major filter", - remedy=("Pass one, e.g. sites='01491000', stateCd='WI', or countyCd='55025'."), - ) - require_one_of(service, WATERSERVICES_SERVICES, name="service") - - if "format" not in kwargs: - kwargs["format"] = "rdb" - - url = WATERSERVICE_URL + service - - return query(url, payload=kwargs, ssl_check=ssl_check) - - -def _get_json_values( - service: str, - sites: list[str] | str | None, - start: str | None, - end: str | None, - multi_index: bool, - ssl_check: bool, - kwargs: dict[str, Any], -) -> tuple[pd.DataFrame, NWIS_Metadata]: - """Shared body of the JSON waterservices time-series getters (dv / iv). - - The caller-facing ``sites`` / ``start`` / ``end`` arguments are aliases: an - explicit waterservices keyword of the same meaning takes precedence over - them. Note that ``multi_index`` is passed through ``kwargs`` so that - :func:`format_response` sees it. - """ - _check_sites_value_types(sites) - - kwargs["startDT"] = kwargs.pop("startDT", start) - kwargs["endDT"] = kwargs.pop("endDT", end) - kwargs["sites"] = kwargs.pop("sites", sites) - kwargs["multi_index"] = multi_index - - response = query_waterservices( - service, format="json", ssl_check=ssl_check, **kwargs - ) - df = _parse_json_or_raise(response) - - return format_response(df, **kwargs), NWIS_Metadata(response, **kwargs) - - -@_deprecated -def get_dv( - sites: list[str] | str | None = None, - start: str | None = None, - end: str | None = None, - multi_index: bool = True, - ssl_check: bool = True, - **kwargs: Any, -) -> tuple[pd.DataFrame, NWIS_Metadata]: - """Get daily values data from NWIS and return it as a ``pandas.DataFrame``. - - .. note:: - - If no start or end date are provided, only the most recent record - is returned. - - Parameters - ---------- - sites: string or list of strings, optional, default is None - USGS site number (or list of site numbers). - start: string, optional, default is None - Starting date of record (YYYY-MM-DD). If the waterdata parameter - startDT is supplied, it overwrites the start parameter. - end: string, optional, default is None - Ending date of record (YYYY-MM-DD). If the waterdata parameter endDT - is supplied, it overwrites the end parameter. - multi_index: bool, optional - If True, return a multi-index dataframe; if False, return a - single-index dataframe. Default is True. - ssl_check: bool, optional - Whether to check SSL certificates. Default is True. - **kwargs: optional - Additional query parameters, if supplied. - - Returns - ------- - df: ``pandas.DataFrame`` - Time series data from the NWIS JSON. - md: :obj:`dataretrieval.nwis.NWIS_Metadata` - A custom metadata object. - - Examples - -------- - .. doctest:: - - >>> # Get mean statistic daily values for site 04085427 - >>> df, md = dataretrieval.nwis.get_dv( - ... sites="04085427", - ... start="2012-01-01", - ... end="2012-06-30", - ... statCd="00003", - ... ) - - >>> # Get the latest daily values for site 01646500 - >>> df, md = dataretrieval.nwis.get_dv(sites="01646500") - - """ - return _get_json_values("dv", sites, start, end, multi_index, ssl_check, kwargs) - - -@_deprecated -def get_info( - ssl_check: bool = True, **kwargs: Any -) -> tuple[pd.DataFrame, NWIS_Metadata]: - """Get site description information from NWIS. - - **Note:** *Must specify one major parameter.* - - For additional parameter options see - https://waterservices.usgs.gov/docs/site-service/site-service-details/ - - Parameters - ---------- - ssl_check: bool, optional - Whether to check SSL certificates. Default is True. - **kwargs: optional - Additional query parameters, if supplied. - - Keyword Arguments - ----------------- - sites: string or list of strings - A list of site numbers. Sites may be prefixed with an optional agency - code followed by a colon. - stateCd: string - U.S. postal service (2-digit) state code. Only 1 state can be specified - per request. - huc: string or list of strings - A list of hydrologic unit codes (HUC) or aggregated watersheds. Only 1 - major HUC can be specified per request, or up to 10 minor HUCs. A major - HUC has two digits. - bBox: string or list of strings - A contiguous range of decimal latitude and longitude, starting with the - west longitude, then the south latitude, then the east longitude, and - then the north latitude, with each value separated by a comma. The - product of the range of latitude and longitude cannot exceed 25 - degrees. Whole or decimal degrees must be specified, up to six digits - of precision. Minutes and seconds are not allowed. - countyCd: string or list of strings - A list of county numbers, in a 5 digit numeric format. The first two - digits of a county's code are the FIPS State Code. - (url: https://help.waterdata.usgs.gov/code/county_query?fmt=html) - startDt: string - Selects sites based on whether data was collected at a point in time - beginning after startDt (start date). Dates must be in ISO-8601 - Calendar Date format (for example: 1990-01-01). - endDt: string - The end date for the period of record. Dates must be in ISO-8601 - Calendar Date format (for example: 1990-01-01). - period: string - Selects sites based on whether they were active between now - and a time in the past. For example, period=P10W will select sites - active in the last ten weeks. - modifiedSince: string - Returns only sites where site attributes or period of record data have - changed during the request period. - parameterCd: string or list of strings - Returns only site data for those sites containing the requested USGS - parameter codes. - siteType: string or list of strings - Restricts sites to those having one or more major and/or minor site - types, such as stream, spring or well. For a list of all valid site - types see https://help.waterdata.usgs.gov/site_tp_cd - For example, siteType='ST' returns streams only. - siteOutput: string ('basic' or 'expanded') - Indicates the richness of metadata you want for site attributes. Note - that for visually oriented formats like Google Map format, this - argument has no meaning. For performance reasons, siteOutput=expanded - cannot be used if seriesCatalogOutput=true or with any values for - outputDataTypeCd. - seriesCatalogOutput: bool - A switch that provides detailed period of record information for - certain output formats. The period of record indicates date ranges for - a certain kind of information about a site, for example the start and - end dates for a site's daily mean streamflow. - - Returns - ------- - df: ``pandas.DataFrame`` - Site data from the NWIS web service. - md: :obj:`dataretrieval.nwis.NWIS_Metadata` - A custom metadata object. - - Examples - -------- - .. doctest:: - - >>> # Get site information for a single site - >>> df, md = dataretrieval.nwis.get_info(sites="05114000") - - >>> # Get site information for multiple sites - >>> df, md = dataretrieval.nwis.get_info(sites=["05114000", "09423350"]) - - """ - seriesCatalogOutput = kwargs.pop("seriesCatalogOutput", None) - if seriesCatalogOutput in ["True", "TRUE", "true", True]: - warnings.warn( - ( - "Starting in March 2024, the NWIS qw data endpoint is " - "retiring and no longer receives updates. For more information, " - "refer to https://waterdata.usgs.gov/nwis/qwdata and " - "https://doi-usgs.github.io/dataRetrieval/articles/Status.html " - "or email CompTools@usgs.gov." - ), - DataCurrencyWarning, - stacklevel=2, - ) - # convert bool to string if necessary - kwargs["seriesCatalogOutput"] = "True" - else: - # cannot have both seriesCatalogOutput and the expanded format - kwargs["siteOutput"] = "Expanded" - - response = query_waterservices("site", ssl_check=ssl_check, **kwargs) - - return _read_rdb(response.text), NWIS_Metadata(response, **kwargs) - - -@_deprecated -def get_iv( - sites: list[str] | str | None = None, - start: str | None = None, - end: str | None = None, - multi_index: bool = True, - ssl_check: bool = True, - **kwargs: Any, -) -> tuple[pd.DataFrame, NWIS_Metadata]: - """Get instantaneous values data from NWIS and return it as a DataFrame. - - .. note:: - - If no start or end date are provided, only the most recent record - is returned. - - Parameters - ---------- - sites: string or list of strings, optional, default is None - USGS site number (or list of site numbers). If the waterdata parameter - site_no is supplied, it overwrites the sites parameter. - start: string, optional, default is None - Starting date of record (YYYY-MM-DD). If the waterdata parameter - startDT is supplied, it overwrites the start parameter. - end: string, optional, default is None - Ending date of record (YYYY-MM-DD). If the waterdata parameter endDT - is supplied, it overwrites the end parameter. - multi_index: bool, optional - If False, return a dataframe with a single-level index (datetime). - Default is True. - ssl_check: bool, optional - Whether to check SSL certificates. Default is True. - **kwargs: optional - Additional query parameters, if supplied. - - Returns - ------- - df: ``pandas.DataFrame`` - Time series data from the NWIS JSON. - md: :obj:`dataretrieval.nwis.NWIS_Metadata` - A custom metadata object. - - Examples - -------- - .. doctest:: - - >>> # Get instantaneous discharge data for site 05114000 - >>> df, md = dataretrieval.nwis.get_iv( - ... sites="05114000", - ... start="2013-11-03", - ... end="2013-11-03", - ... parameterCd="00060", - ... ) - - """ - return _get_json_values("iv", sites, start, end, multi_index, ssl_check, kwargs) - - -def get_pmcodes(**kwargs: Any) -> NoReturn: - """Defunct: use ``waterdata.get_reference_table(collection='parameter-codes')``.""" - raise NameError( - "`nwis.get_pmcodes` has been replaced with " - "`waterdata.get_reference_table(collection='parameter-codes')`." - ) - - -def get_water_use(**kwargs: Any) -> NoReturn: - """Defunct: use ``dataretrieval.nwdc.get_wateruse`` instead. - - The legacy NWIS water-use service has been retired. Modeled water-use - estimates are now served by the National Water Availability Assessment Data - Companion (NWDC); retrieve them with - :func:`dataretrieval.nwdc.get_wateruse`. - """ - raise NameError( - "`nwis.get_water_use` is defunct; use " - "`dataretrieval.nwdc.get_wateruse` instead." - ) - - -@_deprecated -def get_ratings( - site: str | None = None, - file_type: str = "base", - ssl_check: bool = True, - **kwargs: Any, -) -> tuple[pd.DataFrame, NWIS_Metadata]: - """Get the rating table for an active USGS streamgage. - - Reads the current rating table for an active USGS streamgage from NWISweb. - Data is retrieved from https://waterdata.usgs.gov/nwis. - - Parameters - ---------- - site: string, optional, default is None - USGS site number, usually an 8 digit number as a string. If the nwis - parameter site_no is supplied, it overwrites the site parameter. - file_type: string, default is "base" - One of "base", "corr", or "exsa". - ssl_check: bool, optional - Whether to check SSL certificates. Default is True. - **kwargs: optional - Additional query parameters, if supplied. - - Returns - ------- - df: ``pandas.DataFrame`` - Formatted requested data. - md: :obj:`dataretrieval.nwis.NWIS_Metadata` - A custom metadata object. - - Examples - -------- - .. doctest:: - - >>> # Get the rating table for USGS streamgage 01594440 - >>> df, md = dataretrieval.nwis.get_ratings(site="01594440") - - """ - site = kwargs.pop("site_no", site) - - payload = {} - url = WATERDATA_BASE_URL + "nwisweb/get_ratings/" - if site is not None: - payload.update({"site_no": site}) - if file_type is not None: - require_one_of(file_type, ("base", "corr", "exsa"), name="file_type") - payload.update({"file_type": file_type}) - response = query(url, payload, ssl_check=ssl_check) - return _read_rdb(response.text), NWIS_Metadata(response, site_no=site) - - -@_deprecated -def what_sites( - ssl_check: bool = True, **kwargs: Any -) -> tuple[pd.DataFrame, NWIS_Metadata]: - """Search NWIS for sites within a region with specific data. - - Parameters - ---------- - ssl_check: bool, optional - Whether to check SSL certificates. Default is True. - **kwargs: optional - Accepts the same parameters as :obj:`dataretrieval.nwis.get_info`. - - Returns - ------- - df: ``pandas.DataFrame`` - Formatted requested data. - md: :obj:`dataretrieval.nwis.NWIS_Metadata` - A custom metadata object. - - Examples - -------- - .. doctest:: - - >>> # get information about a single site - >>> df, md = dataretrieval.nwis.what_sites(sites="05114000") - - >>> # get information about sites with phosphorus in Ohio - >>> df, md = dataretrieval.nwis.what_sites( - ... stateCd="OH", parameterCd="00665" - ... ) - - """ - response = query_waterservices(service="site", ssl_check=ssl_check, **kwargs) - - df = _read_rdb(response.text) - - return df, NWIS_Metadata(response, **kwargs) - - -# Each ignored ``get_record`` parameter maps to its declared default and -# replacement getter guidance, not restrictions on the replacement getter. -_DEFUNCT_RECORD_OPTIONS: dict[str, tuple[object, str]] = { - "wide_format": (True, "`waterdata.get_samples()`"), - "datetime_index": ( - True, - "`waterdata.get_continuous()` or `waterdata.get_daily()`", - ), - "state": (None, "`nwdc.get_wateruse(state=...)`"), -} - - -def _warn_defunct_record_options(**given: object) -> None: - """Warn when an ignored ``get_record`` parameter differs from its default. - - ``given`` must contain only names from ``_DEFUNCT_RECORD_OPTIONS``. - Values equal to the declared defaults do not produce parameter warnings, - whether passed explicitly or omitted by the caller of ``get_record``. - Replacement names in the table identify getters for retrieving the data; - they do not mean those getters accept the ignored parameters. - """ - for name, value in given.items(): - unset, replacement = _DEFUNCT_RECORD_OPTIONS[name] - if value != unset: - warn_deprecated( - f"`nwis.get_record`'s `{name}` argument", - replacement=replacement, - removal=_NWIS_REMOVAL_DATE, - detail=( - "It is ignored, and has been since the service that read " - "it was retired." - ), - # _warn_defunct_record_options -> get_record -> @_deprecated - # wrapper -> the caller's own line. - stacklevel=4, - ) - - -@_deprecated -def get_record( - sites: list[str] | str | None = None, - start: str | None = None, - end: str | None = None, - multi_index: bool = True, - wide_format: bool = True, - datetime_index: bool = True, - state: str | None = None, - service: str = "iv", - ssl_check: bool = True, - **kwargs: Any, -) -> pd.DataFrame: - """Get data from NWIS and return it as a ``pandas.DataFrame``. - - .. note:: - - If no start or end date are provided, only the most recent record is - returned. - - Parameters - ---------- - sites: string or list of strings, optional, default is None - List of sites, or a comma-delimited string of sites. - start: string, optional, default is None - Starting date of record (YYYY-MM-DD). - end: string, optional, default is None - Ending date of record (YYYY-MM-DD). - multi_index: bool, optional - If False, return a dataframe with a single-level index (datetime). - Default is True. - wide_format : bool, optional - (defunct) Previously shaped output from the retired 'qwdata' service. - ``get_record`` ignores this parameter; passing ``False`` emits a - ``DeprecationWarning``. - To retrieve sample data, use ``waterdata.get_samples``, - which returns one row per result and has no ``wide_format`` parameter. - datetime_index : bool, optional - (defunct) Previously shaped output from the retired 'qwdata' and - 'gwlevels' services. - ``get_record`` ignores this parameter; passing ``False`` emits a - ``DeprecationWarning``. - To retrieve time-series data, use ``waterdata.get_continuous`` or - ``waterdata.get_daily``, which return ``time`` as a column and have - no ``datetime_index`` parameter. - state: string, optional, default is None - (defunct) Previously selected sites for the retired 'water_use' service. - ``get_record`` ignores this parameter; passing a value other than - ``None`` emits a ``DeprecationWarning``. - To retrieve water-use data by state, use ``nwdc.get_wateruse(state=...)``. - Its ``state`` parameter is supported and filters the query. - service: string, default is 'iv' - - 'iv' : instantaneous data - - 'dv' : daily mean data - - 'site' : site description - - 'measurements' : (defunct) use `waterdata.get_field_measurements` - - 'peaks': discharge peaks - - 'gwlevels': (defunct) use `waterdata.get_continuous`, - `waterdata.get_daily`, or `waterdata.get_field_measurements` - - 'pmcodes': (defunct) use `waterdata.get_reference_table` - - 'water_use': (defunct) use `nwdc.get_wateruse` - - 'ratings': get rating table - - 'stat': get statistics - ssl_check: bool, optional - Whether to check SSL certificates. Default is True. - **kwargs: optional - Additional query parameters, if supplied. - - Returns - ------- - ``pandas.DataFrame`` containing the requested data. - - Examples - -------- - .. doctest:: - - >>> # Get latest instantaneous data from site 01585200 - >>> df = dataretrieval.nwis.get_record(sites="01585200", service="iv") - - >>> # Get latest daily mean data from site 01585200 - >>> df = dataretrieval.nwis.get_record(sites="01585200", service="dv") - - >>> # Get site description for site 01585200 - >>> df = dataretrieval.nwis.get_record(sites="01585200", service="site") - - - >>> # Get discharge peaks for site 01585200 - >>> df = dataretrieval.nwis.get_record(sites="01585200", service="peaks") - - >>> # Get rating table for USGS streamgage 01585200 - >>> df = dataretrieval.nwis.get_record(sites="01585200", service="ratings") - - >>> # Get annual statistics for USGS station 01646500 - >>> df = dataretrieval.nwis.get_record( - ... sites="01646500", - ... service="stat", - ... statReportType="annual", - ... statYearType="water", - ... ) - - """ - _check_sites_value_types(sites) - - defunct_replacements = { - "measurements": "`waterdata.get_field_measurements`", - "gwlevels": ( - "`waterdata.get_continuous` (continuous), " - "`waterdata.get_daily`, or `waterdata.get_field_measurements` " - "(discrete)" - ), - "pmcodes": "`waterdata.get_reference_table`", - "water_use": "`nwdc.get_wateruse`", - } - if service in defunct_replacements: - raise NameError( - f"The NWIS service '{service}' is no longer supported by " - f"get_record. Use {defunct_replacements[service]} instead." - ) - - require_one_of( - service, - WATERSERVICES_SERVICES + WATERDATA_SERVICES, - name="service", - remedy=( - "New work should use the dataretrieval.waterdata getters instead; " - "NWIS is deprecated." - ), - ) - - _warn_defunct_record_options( - wide_format=wide_format, datetime_index=datetime_index, state=state - ) - - if service == "iv": - df, _ = get_iv( - sites=sites, - startDT=start, - endDT=end, - multi_index=multi_index, - ssl_check=ssl_check, - **kwargs, - ) - return df - - elif service == "dv": - df, _ = get_dv( - sites=sites, - startDT=start, - endDT=end, - multi_index=multi_index, - ssl_check=ssl_check, - **kwargs, - ) - return df - - elif service == "site": - df, _ = get_info(sites=sites, ssl_check=ssl_check, **kwargs) - return df - - elif service == "peaks": - df, _ = get_discharge_peaks( - sites=sites, - start=start, - end=end, - multi_index=multi_index, - ssl_check=ssl_check, - **kwargs, - ) - return df - - elif service == "ratings": - # the ratings service is single-site; get_ratings takes a scalar site - df, _ = get_ratings( - site=cast("str | None", sites), ssl_check=ssl_check, **kwargs - ) - return df - - elif service == "stat": - df, _ = get_stats(sites=sites, ssl_check=ssl_check, **kwargs) - return df - - else: # pragma: no cover - every recognized service has a branch above - raise AssertionError(f"get_record has no handler for service {service!r}") - - -def _site_block_boundaries(site_list: list[str]) -> list[int]: - """Return indices where the site number changes, with 0 and len added at the ends. - - For example, given ``['A', 'A', 'B']`` returns ``[0, 2, 3]``. - """ - boundaries = [0] - boundaries.extend( - i + 1 - for i, (a, b) in enumerate(zip(site_list[:-1], site_list[1:], strict=False)) - if a != b - ) - boundaries.append(len(site_list)) - return boundaries - - -def _build_column_name(param_cd: str, method: str, option: str | None) -> str: - """Derive the DataFrame column name for a parameter record.""" - col_name = param_cd - if method: - col_name = f"{col_name}_{method.strip('[]()').lower()}" - if option: - col_name = f"{col_name}_{option}" - return col_name - - -def _parse_parameter_record( - record_json: list[dict[str, Any]], col_name: str -) -> pd.DataFrame: - """Parse a single parameter's value list into a renamed DataFrame.""" - record_df = pd.DataFrame(record_json) - record_df["value"] = pd.to_numeric(record_df["value"], errors="coerce") - record_df["qualifiers"] = ( - record_df["qualifiers"].astype(str).str.strip("[]").str.replace("'", "") - ) - return record_df.rename( - columns={ - "value": col_name, - "dateTime": "datetime", - "qualifiers": col_name + "_cd", - } - ) - - -def _parse_site_block(site_block: list[dict[str, Any]]) -> pd.DataFrame: - """Parse all timeseries in one site's block into a single DataFrame.""" - site_no = site_block[0]["sourceInfo"]["siteCode"][0]["value"] - site_df = pd.DataFrame(columns=["datetime"]) - - for timeseries in site_block: - param_cd = timeseries["variable"]["variableCode"][0]["value"] - option = timeseries["variable"]["options"]["option"][0].get("value") - - for parameter in timeseries["values"]: - method = parameter["method"][0]["methodDescription"] - col_name = _build_column_name(param_cd, method, option) - record_json = parameter["value"] - if not record_json: - continue - record_df = _parse_parameter_record(record_json, col_name) - site_df = site_df.merge(record_df, how="outer", on="datetime") - - site_df["site_no"] = site_no - return site_df - - -def _read_json(json: dict[str, Any]) -> pd.DataFrame: - """Read a NWIS Water Services formatted JSON into a ``pandas.DataFrame``. - - Parameters - ---------- - json: dict - A JSON dictionary response to be parsed into a ``pandas.DataFrame``. - - Returns - ------- - df: ``pandas.DataFrame`` - Time series data from the NWIS JSON. - - """ - time_series = json["value"]["timeSeries"] - site_list = [ts["sourceInfo"]["siteCode"][0]["value"] for ts in time_series] - boundaries = _site_block_boundaries(site_list) - - all_site_dfs = [] - for start, end in zip(boundaries[:-1], boundaries[1:], strict=False): - site_block = time_series[start:end] - if not site_block: - continue - all_site_dfs.append(_parse_site_block(site_block)) - - if not all_site_dfs: - return pd.DataFrame(columns=["site_no", "datetime"]) - - merged_df = pd.concat(all_site_dfs, ignore_index=True) - - if "datetime" in merged_df.columns: - merged_df["datetime"] = pd.to_datetime(merged_df["datetime"], utc=True) - - return merged_df - - -def _read_rdb(rdb: str) -> pd.DataFrame: - """Parse an NWIS RDB response and apply NWIS-specific post-processing. - - Thin wrapper around :func:`dataretrieval.rdb.read_rdb` that adds the - NWIS column-dtype hints and runs :func:`format_response` (datetime - index, multi-site MultiIndex, optional GeoDataFrame). - """ - return format_response(read_rdb(rdb, dtypes=_NWIS_RDB_DTYPES)) - - -def _check_sites_value_types(sites: list[str] | str | None) -> None: - if sites and not isinstance(sites, list) and not isinstance(sites, str): - raise TypeError( - "sites must be a site number as a string, or a list of them, not " - f"{type(sites).__name__}. Pass sites='01491000' for one site, or " - "sites=['01491000', '01645000'] for several." - ) - - -class NWIS_Metadata(BaseMetadata): - """Metadata class for NWIS service, derived from BaseMetadata. - - Attributes - ---------- - url : str - Response url. - query_time: datetime.timedelta - Response elapsed time. - header: httpx.Headers - Response headers. - comments: str | None - Metadata comments, if any. - - Notes - ----- - ``site_info`` is exposed as a property (documented below) rather than a - plain attribute. - - """ - - def __init__(self, response: httpx.Response, **parameters: Any) -> None: - """Generate the standard metadata set, plus NWIS-specific metadata. - - Parameters - ---------- - response: Response - Response object from the ``httpx`` module. - parameters: unpacked dictionary - Unpacked dictionary of the parameters supplied in the request. - - """ - super().__init__(response) - - comments = "" - for line in response.text.splitlines(): - if line.startswith("#"): - comments += line.lstrip("#") + "\n" - if comments: - self.comment = comments - - self._parameters = parameters - - @property - def site_info(self) -> tuple[pd.DataFrame, BaseMetadata] | None: - """Site information for the query. - - Populated when the query included ``site_no``, ``sites``, ``stateCd``, - ``huc``, ``countyCd`` or ``bBox`` (``site_no`` is preferred over - ``sites`` if both are present); ``None`` otherwise. - - Returns - ------- - df: ``pandas.DataFrame`` - Formatted requested data from calling `nwis.what_sites`. - md: :obj:`dataretrieval.nwis.NWIS_Metadata` - A NWIS_Metadata object. - """ - if "site_no" in self._parameters: - return what_sites(sites=self._parameters["site_no"]) - - elif "sites" in self._parameters: - return what_sites(sites=self._parameters["sites"]) - - elif "stateCd" in self._parameters: - return what_sites(stateCd=self._parameters["stateCd"]) - - elif "huc" in self._parameters: - return what_sites(huc=self._parameters["huc"]) - - elif "countyCd" in self._parameters: - return what_sites(countyCd=self._parameters["countyCd"]) - - elif "bBox" in self._parameters: - return what_sites(bBox=self._parameters["bBox"]) - - else: - return None # don't set metadata site_info attribute diff --git a/dataretrieval/ogc/chunking.py b/dataretrieval/ogc/chunking.py index 1bb867aaa..6a12d6776 100644 --- a/dataretrieval/ogc/chunking.py +++ b/dataretrieval/ogc/chunking.py @@ -91,7 +91,7 @@ def parallel_chunks(n: int) -> Iterator[None]: A per-call setting rather than an environment variable, and scoped to a ``with`` block: ADR 0009. Outside any block the getters use the conservative default. Only the OGC getters (Water Data, NGWMN) read this; - wrapping a legacy NWIS call in the block is a no-op. + wrapping a single-shot call (WQP, NLDI, StreamStats) in the block is a no-op. Parameters ---------- diff --git a/dataretrieval/ogc/shaping.py b/dataretrieval/ogc/shaping.py index 8e8746064..419dfeb00 100644 --- a/dataretrieval/ogc/shaping.py +++ b/dataretrieval/ogc/shaping.py @@ -32,8 +32,7 @@ # Water Data OGC coordinates are published in WGS84, so attach that CRS where the # GeoDataFrame is built (otherwise the result is CRS-naive and ``to_crs`` / -# spatial joins fail). Matches the constants in ``nldi`` (EPSG:4326) and ``nwis`` -# (EPSG:4269). +# spatial joins fail). Matches the constant in ``nldi`` (EPSG:4326). _CRS = "EPSG:4326" # Whether geopandas is present is a static, environment-level fact, so warn diff --git a/dataretrieval/rdb.py b/dataretrieval/rdb.py index 515ad642f..40da669ac 100644 --- a/dataretrieval/rdb.py +++ b/dataretrieval/rdb.py @@ -11,10 +11,10 @@ it is informational only and skipped during parsing. - Tab-separated data rows. -This module exposes the parsing primitives that both ``dataretrieval.nwis`` -and ``dataretrieval.waterdata.ratings`` use. Callers layer their own -post-processing (NWIS-specific datetime indexing, ratings-specific -``df.attrs`` provenance, etc.) on top of the raw frame. +This module exposes the parsing primitives that +``dataretrieval.waterdata.ratings`` uses. Callers layer their own +post-processing (ratings-specific ``df.attrs`` provenance, etc.) on top of +the raw frame. """ from __future__ import annotations @@ -62,9 +62,8 @@ def read_rdb(text: str, dtypes: dict[str, type] | None = None) -> pd.DataFrame: "the service is degraded, has moved, or returned an error page " "rather than that the query was wrong. Retry once after a short " "wait; if the same HTML comes back, the endpoint has most likely " - "been retired -- see " - "https://waterdata.usgs.gov/blog/api-waterservices-decom/ and " - "migrate to the dataretrieval.waterdata getters." + "moved -- report it at " + "https://github.com/DOI-USGS/dataretrieval-python/issues." ) lines = text.splitlines() diff --git a/dataretrieval/transport/http.py b/dataretrieval/transport/http.py index 82029f901..3a20f135e 100644 --- a/dataretrieval/transport/http.py +++ b/dataretrieval/transport/http.py @@ -55,7 +55,7 @@ def default_headers(target_url: str | httpx.URL | None = None) -> dict[str, str] resolution reads the config file and can raise :class:`~dataretrieval.exceptions.ConfigurationError` for a malformed file or a profile it no longer defines. Resolving first would let a Water Data - configuration problem fail a legacy NWIS, WQP, or NGWMN call that would + configuration problem fail a WQP or NGWMN call that would never have received the key. """ headers = { diff --git a/dataretrieval/wateruse.py b/dataretrieval/wateruse.py index 2054cc3b1..d9960354b 100644 --- a/dataretrieval/wateruse.py +++ b/dataretrieval/wateruse.py @@ -5,7 +5,7 @@ which the water-use models are five; the rest are hydrologic, atmospheric-forcing, and assessment outputs. Every other adapter in this package is named for its service -- ``ngwmn``, ``nldi``, ``wqp``, -``streamstats``, ``nwis`` -- so this one is now ``nwdc``. +``streamstats`` -- so this one is now ``nwdc``. Importing this module emits a :class:`DeprecationWarning` and re-exports :mod:`dataretrieval.nwdc`'s public surface. The re-exported objects are the @@ -34,8 +34,9 @@ from dataretrieval.nwdc import * # noqa: F403 # re-export the public surface #: When the alias may be deleted. Read from the shared horizon table rather than spelled -#: here, so it is reviewed and extended with every other published removal; matches the -#: dated-removal convention :mod:`dataretrieval.nwis` uses. +#: here, so it is reviewed and extended with every other published removal; this follows +#: the dated-removal convention every entry in +#: :data:`~dataretrieval._deprecation.REMOVALS` uses. NWDC_RENAME_REMOVAL_DATE = REMOVALS["wateruse"] __all__ = list(_nwdc.__all__) diff --git a/demos/R Python Vignette equivalents.ipynb b/demos/R Python Vignette equivalents.ipynb index 6c7b79157..c54bd73ed 100644 --- a/demos/R Python Vignette equivalents.ipynb +++ b/demos/R Python Vignette equivalents.ipynb @@ -13,7 +13,7 @@ "metadata": {}, "outputs": [], "source": [ - "from dataretrieval import nwis, waterdata, wqp" + "from dataretrieval import waterdata, wqp" ] }, { @@ -307,7 +307,7 @@ " header # the response headers\n", "```\n", "\n", - "Note: USGS *water use* data has no Water Data API equivalent yet. The legacy `nwis.get_water_use()` service has been decommissioned and now raises a \"defunct\" error, so there is currently no runnable way to retrieve water-use data through `dataretrieval`." + "Note: USGS *water use* data is retrieved through a separate service, `nwdc.get_wateruse()`, which draws on the USGS National Water Availability Assessment Data Companion (NWDC). See the water-use example notebook for details." ] } ], diff --git a/demos/USGS_WaterData_Introduction_Examples.ipynb b/demos/USGS_WaterData_Introduction_Examples.ipynb index 51cc60bf2..c31866b69 100644 --- a/demos/USGS_WaterData_Introduction_Examples.ipynb +++ b/demos/USGS_WaterData_Introduction_Examples.ipynb @@ -9,12 +9,9 @@ "\n", "The [USGS Water Data APIs](https://api.waterdata.usgs.gov/ogcapi/v1/) are the\n", "modern, OGC-based replacement for the legacy NWIS web services. In Python they are\n", - "exposed through the `dataretrieval.waterdata` module, which will gradually replace\n", - "the older `dataretrieval.nwis` functions.\n", + "exposed through the `dataretrieval.waterdata` module.\n", "\n", - "This notebook tours each new function. The NWIS shut-down timeline is still\n", - "uncertain, so we recommend migrating to the `waterdata` functions sooner rather\n", - "than later.\n", + "This notebook tours each function.\n", "\n", "If you are coming from the R `dataRetrieval` package, the functions map across as\n", "follows:\n", diff --git a/demos/WaterData_demo.ipynb b/demos/WaterData_demo.ipynb index 35b0cc201..3d76a5cfb 100644 --- a/demos/WaterData_demo.ipynb +++ b/demos/WaterData_demo.ipynb @@ -6,9 +6,7 @@ "metadata": {}, "source": [ "# Using the `waterdata` module to pull data from the USGS Water Data APIs\n", - "The `waterdata` module replaces the `nwis` module for accessing USGS water data. It leverages the [Water Data APIs](https://api.waterdata.usgs.gov/) to download metadata, daily values, and instantaneous values. \n", - "\n", - "While the specifics of this transition timeline are opaque, it is advised to switch to the new functions as soon as possible to reduce unexpected interruptions in your workflow.\n", + "The `waterdata` module is the interface for accessing USGS water data. It leverages the [Water Data APIs](https://api.waterdata.usgs.gov/) to download metadata, daily values, and instantaneous values. \n", "\n", "As always, please report any issues you encounter on our [Issues](https://github.com/DOI-USGS/dataretrieval-python/issues) page. If you have questions or need help, please reach out to us at comptools@usgs.gov." ] diff --git a/demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb b/demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb new file mode 100644 index 000000000..a5d5ea5ee --- /dev/null +++ b/demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb @@ -0,0 +1,265 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# USGS dataretrieval Python Package Water-Use Examples\n", + "\n", + "This notebook provides examples of using the Python dataretrieval package to retrieve water-use data from the USGS [National Water Availability Assessment Data Companion (NWDC)](https://water.usgs.gov/nwaa-data/). The NWDC serves national-scale, *modeled* water-use estimates on a HUC12 (12-digit hydrologic unit) grid, queryable for any county, state, or hydrologic unit. It is the modern replacement for the retired legacy water-use service.\n", + "\n", + "The dataretrieval package exposes the service through a single function, `nwdc.get_wateruse`, which returns a tuple of a pandas data frame and an associated metadata object." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Install the Package\n", + "\n", + "Use the following code to install the package if it doesn't exist already within your Jupyter Python environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install dataretrieval" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load the package so you can use it along with other packages used in this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import display\n", + "\n", + "from dataretrieval import nwdc" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Basic Usage\n", + "\n", + "This example uses the `get_wateruse()` function to retrieve modeled water-use estimates. The following arguments are commonly used:\n", + "\n", + "* **model** (string): The water-use category to query, for example `wu-public-supply-wd` (public-supply withdrawals) or `wu-irrigation-wd` (irrigation withdrawals). Available models include:\n", + "\n", + " | model | description |\n", + " | --- | --- |\n", + " | `wu-public-supply-wd` | public-supply withdrawals |\n", + " | `wu-public-supply-cu` | public-supply consumptive use |\n", + " | `wu-irrigation-wd` | irrigation withdrawals |\n", + " | `wu-irrigation-cu` | irrigation consumptive use |\n", + " | `wu-thermoelectric` | thermoelectric-power water use |\n", + "\n", + "* **variable** (string or list of strings): One or more variable IDs within the chosen model, for example `pswdtot` (total public-supply withdrawals) or `[\"pswdgw\", \"pswdsw\"]` for the groundwater and surface-water components. The service requires at least one variable.\n", + "* **state**, **county**, or **huc** (string, int, or list): Exactly one of these selects the area. `state` accepts a full name (`\"Kansas\"`), a two-letter postal code (`\"KS\"`), or a two-digit FIPS code (`\"20\"`); `county` takes a five-digit FIPS code; and a `huc` code's length sets its hydrologic-unit level.\n", + "* **time_resolution** (string): `\"monthly\"`, `\"annualcy\"` (annual, calendar year), or `\"annualwy\"` (annual, water year).\n", + "* **start_date**, **end_date** (string): The query window, formatted `\"YYYY\"` for annual data or `\"YYYY-MM\"` for monthly data.\n", + "\n", + "See the [NWDC data catalog](https://water.usgs.gov/nwaa-data/) for the full list of models and their variables." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Example 1: Retrieve public-supply withdrawals for a state\n", + "\n", + "Request total public-supply withdrawals for every HUC12 in Kansas, as annual calendar-year values. Because a state spans many HUC12s, the service returns the result across several pages; `get_wateruse()` follows the pagination links and stitches the pages into one frame." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "kansas, md = nwdc.get_wateruse(\n", + " model=\"wu-public-supply-wd\",\n", + " variable=\"pswdtot\",\n", + " state=\"KS\",\n", + " start_date=\"2015\",\n", + " end_date=\"2020\",\n", + " time_resolution=\"annualcy\",\n", + ")\n", + "print(\n", + " \"Retrieved \"\n", + " + str(len(kansas))\n", + " + \" records across \"\n", + " + str(kansas[\"huc12_id\"].nunique())\n", + " + \" HUC12 watersheds.\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Interpreting the Result\n", + "\n", + "The `get_wateruse()` function returns a tuple containing a pandas data frame and an associated metadata object. The data frame is in long (tidy) form: one row per HUC12 and time step. The `huc12_id` column is kept as a string so leading zeros are preserved, and each value column carries its unit — here `_mgd`, million gallons per day.\n", + "\n", + "Once you've got the data frame, there are several useful things you can do to explore the data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Display the data frame as a table\n", + "display(kansas)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Show the data types of the columns in the resulting data frame." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(kansas.dtypes)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Aggregate the HUC12 grid to a statewide total for each year." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "statewide = kansas.groupby(\"year\")[\"pswdtot_mgd\"].sum()\n", + "display(statewide)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The other part of the result returned from the `get_wateruse()` function is a metadata object that contains information about the query that was executed to return the data. For example, you can access the URL that was assembled to retrieve the requested data from the NWDC." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"The query URL used to retrieve the data from the NWDC was: \" + md.url)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Additional Examples\n", + "\n", + "#### Example 2: Split public-supply withdrawals by source\n", + "\n", + "Request the total, groundwater, and surface-water components of public-supply withdrawals for Rhode Island as monthly values for 2020. Passing a list of variables returns one value column per variable." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rhode_island, md = nwdc.get_wateruse(\n", + " model=\"wu-public-supply-wd\",\n", + " variable=[\"pswdtot\", \"pswdgw\", \"pswdsw\"],\n", + " state=\"RI\",\n", + " start_date=\"2020-01\",\n", + " end_date=\"2020-12\",\n", + " time_resolution=\"monthly\",\n", + ")\n", + "display(rhode_island)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Example 3: Retrieve a different water-use category\n", + "\n", + "Swap the `model` and `variable` to retrieve irrigation withdrawals instead of public supply. Here we request total irrigation withdrawals (`irrwdtot`) for Nebraska as annual calendar-year values." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nebraska, md = nwdc.get_wateruse(\n", + " model=\"wu-irrigation-wd\",\n", + " variable=\"irrwdtot\",\n", + " state=\"NE\",\n", + " start_date=\"2015\",\n", + " end_date=\"2020\",\n", + " time_resolution=\"annualcy\",\n", + ")\n", + "display(nebraska)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Notes\n", + "\n", + "- **Spatial resolution.** Estimates are always returned on the HUC12 grid, regardless of the area you query. Joining `huc12_id` to a HUC12 boundary layer (for example with `geopandas`) lets you map the results.\n", + "- **Pick one selector.** Use exactly one of `state`, `county` (five-digit FIPS), or `huc`. Each selector also accepts a list (e.g. `state=[\"NE\", \"KS\"]`), fanned out into one request per area and concatenated.\n", + "- **Large areas paginate.** A query spanning more than `limit` HUC12s (600 by default) is split across pages; `get_wateruse()` follows the links and returns a single concatenated frame.\n", + "- **Time columns.** Monthly data come back with a `year_month` column; annual data (`annualcy` or `annualwy`) come back with a `year` column." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/demos/hydroshare/USGS_NWIS_WaterUse_Examples.ipynb b/demos/hydroshare/USGS_NWIS_WaterUse_Examples.ipynb deleted file mode 100644 index f2e3f94ec..000000000 --- a/demos/hydroshare/USGS_NWIS_WaterUse_Examples.ipynb +++ /dev/null @@ -1,186 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# USGS dataretrieval Python Package Water Use Examples\n", - "\n", - "> **Note:** USGS water-use data has **no USGS Water Data API equivalent**. The legacy `nwis.get_water_use()` service has been decommissioned and now raises a \"defunct\" error, so the examples below are retained for historical reference only — they document the former interface and are not runnable. There is currently no `waterdata` replacement for water-use data.\n", - "\n", - "This notebook formerly retrieved water use data through the USGS National Water Information System (NWIS)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Install the Package\n", - "\n", - "Use the following code to install the package if it doesn't exist already within your Jupyter Python environment." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install dataretrieval" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Load the package so you can use it along with other packages used in this notebook." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from IPython.display import display\n", - "\n", - "from dataretrieval import nwis\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Basic Usage\n", - "\n", - "The dataretrieval package has several functions that allow you to retrieve data from different web services. This example uses the `get_water_use()` function to retrieve water use data. The following arguments are supported:\n", - "\n", - "Arguments (Additional arguments, if supplied, will be used as query parameters)\n", - "\n", - "* **years** (Listlike): List or comma delimited string of years. Must be years ending in 0 or 5 because water use data is only reported during these years, or \"ALL\", which retrieves all available years\n", - "* **state** (string): Full name, abbreviation or id for a state for which to retrieve data\n", - "* **county** (string or list of strings): County IDs from county lookup or \"ALL\"\n", - "* **categories** (Listlike): List or comma delimited string of two-letter category abbreviations" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Example 1: Retrieve all water use data for a state" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# [Defunct] pennsylvania = nwis.get_water_use(state=\"PA\")\n", - "# [Defunct] print(\"Retrieved \" + str(len(pennsylvania[0])) + \" water use records.\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Interpreting the Result\n", - "\n", - "The result of calling the `get_water_use()` function is an object that contains a Pandas data frame object and an associated metadata object. The Pandas data frame contains the water use data.\n", - "\n", - "Once you've got the data frame, there are several useful things you can do to explore the data." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Display the data frame as a table. The example request was for a whole state. The data returned are organized by county and year, with summary data reported every 5 years." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# [Defunct] display(pennsylvania[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Show the data types of the columns in the resulting data frame." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# [Defunct] print(pennsylvania[0].dtypes)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Example 2: Retrieve data for an entire state for certain years\n", - "\n", - "Returns data parsed by county: one row for each county for each year of interest, rather than for the entire state. Data are included for 5-year periods." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# [Defunct] ohio = nwis.get_water_use(years=[2000, 2005, 2010], state=\"OH\")\n", - "# [Defunct] print(\"Retrieved \" + str(len(ohio[0])) + \" water use records.\")\n", - "# [Defunct] display(ohio[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Example 3: Retrieve two specific water use categories for an entire state" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Get water use data for livestock (LI) and irrigation (IT)\n", - "# [Defunct] kansas = nwis.get_water_use(state=\"KS\", categories=[\"IT\", \"LI\"])\n", - "# [Defunct] print(\"Retrieved \" + str(len(kansas[0])) + \" water use records.\")\n", - "# [Defunct] display(kansas[0])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/demos/hydroshare/USGS_WaterData_Peaks_Examples.ipynb b/demos/hydroshare/USGS_WaterData_Peaks_Examples.ipynb index 8560b9393..ae985461b 100644 --- a/demos/hydroshare/USGS_WaterData_Peaks_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_Peaks_Examples.ipynb @@ -6,7 +6,7 @@ "source": [ "# USGS dataretrieval Python Package Peak Streamflow Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to retrieve annual peak streamflow data for United States Geological Survey (USGS) monitoring locations using the **USGS Water Data API** via the `waterdata` module. The `waterdata` module is the recommended way to access USGS water data and replaces the deprecated `nwis` module." + "This notebook provides examples of using the Python dataretrieval package to retrieve annual peak streamflow data for United States Geological Survey (USGS) monitoring locations using the **USGS Water Data API** via the `waterdata` module. The `waterdata` module is the recommended way to access USGS water data." ] }, { diff --git a/demos/hydroshare/USGS_WaterData_Ratings_Examples.ipynb b/demos/hydroshare/USGS_WaterData_Ratings_Examples.ipynb index 2696e2f07..af46101ce 100644 --- a/demos/hydroshare/USGS_WaterData_Ratings_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_Ratings_Examples.ipynb @@ -6,7 +6,7 @@ "source": [ "# USGS dataretrieval Python Package Rating Curve Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to retrieve stage–discharge rating curve data for United States Geological Survey (USGS) streamgages using the **USGS Water Data API** via the `waterdata` module. The `waterdata` module is the recommended way to access USGS water data and replaces the deprecated `nwis` module.\n", + "This notebook provides examples of using the Python dataretrieval package to retrieve stage–discharge rating curve data for United States Geological Survey (USGS) streamgages using the **USGS Water Data API** via the `waterdata` module. The `waterdata` module is the recommended way to access USGS water data.\n", "\n", "Note: not all active USGS streamflow gages have traditional rating curves relating stage to discharge." ] diff --git a/demos/hydroshare/USGS_WaterData_Statistics_Examples.ipynb b/demos/hydroshare/USGS_WaterData_Statistics_Examples.ipynb index 8474727e4..5d0a32641 100644 --- a/demos/hydroshare/USGS_WaterData_Statistics_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_Statistics_Examples.ipynb @@ -6,7 +6,7 @@ "source": [ "# USGS dataretrieval Python Package Statistics Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to retrieve summary statistics for observed variables at a United States Geological Survey (USGS) monitoring location using the **USGS Water Data API** via the `waterdata` module. The `waterdata` module is the recommended way to access USGS water data and replaces the deprecated `nwis` module.\n", + "This notebook provides examples of using the Python dataretrieval package to retrieve summary statistics for observed variables at a United States Geological Survey (USGS) monitoring location using the **USGS Water Data API** via the `waterdata` module. The `waterdata` module is the recommended way to access USGS water data.\n", "\n", "Two statistics functions are demonstrated:\n", "\n", diff --git a/demos/nwqn_data_pull/retrieve_nwqn_samples.py b/demos/nwqn_data_pull/retrieve_nwqn_samples.py index aab00f02d..6ee12fb22 100644 --- a/demos/nwqn_data_pull/retrieve_nwqn_samples.py +++ b/demos/nwqn_data_pull/retrieve_nwqn_samples.py @@ -8,7 +8,7 @@ import lithops import pandas as pd -from dataretrieval import nldi, nwis, wqp +from dataretrieval import nldi, waterdata, wqp DESTINATION_BUCKET = os.environ.get("DESTINATION_BUCKET") PROJECT = "National Water Quality Assessment Program (NAWQA)" @@ -26,7 +26,7 @@ def map_retrieval(site): - """Map function to pull data from NWIS and WQP""" + """Map function to pull sample data from the Water Quality Portal""" print(f"Retrieving samples from site {site}") # skip bad sites if site in BAD_NLDI_SITES: @@ -82,8 +82,8 @@ def wrapper(*args, **kwargs): @exponential_backoff(max_retries=5, base_delay=1) -def nwis_get_info(*args, **kwargs): - return nwis.get_info(*args, **kwargs) +def get_monitoring_locations(*args, **kwargs): + return waterdata.get_monitoring_locations(*args, **kwargs) @exponential_backoff(max_retries=5, base_delay=1) @@ -108,8 +108,10 @@ def find_neighboring_sites(site, search_factor=0.1, fudge_factor=3.0): An additional fudge factor to apply to the search distance, because watersheds are not circular. """ - site_df, _ = nwis_get_info(sites=site) - drain_area_sq_mi = site_df["drain_area_va"].values[0] + site_df, _ = get_monitoring_locations( + monitoring_location_id=f"USGS-{site}", skip_geometry=True + ) + drain_area_sq_mi = site_df["drainage_area"].values[0] length = _estimate_watershed_length_km(drain_area_sq_mi) search_distance = length * search_factor * fudge_factor # clip between 1 and 9999km @@ -129,13 +131,16 @@ def find_neighboring_sites(site, search_factor=0.1, fudge_factor=3.0): features = pd.concat(gdfs, ignore_index=True) - df, _ = nwis_get_info(sites=list(features.identifier.str.removeprefix("USGS-"))) - # drop sites with disimilar different drainage areas + df, _ = get_monitoring_locations( + monitoring_location_id=list(features.identifier), skip_geometry=True + ) + # drop sites with dissimilar drainage areas df = df.where( - (df["drain_area_va"] / drain_area_sq_mi) > search_factor, + (df["drainage_area"] / drain_area_sq_mi) > search_factor, ).dropna(how="all") - site_list = df["site_no"].to_list() + # return bare site numbers (strip the "USGS-" agency prefix) + site_list = df["monitoring_location_id"].str.removeprefix("USGS-").to_list() # include the original search site among the neighbors if site not in site_list: diff --git a/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py b/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py index f5ebaf498..7f9776159 100644 --- a/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py +++ b/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py @@ -7,9 +7,13 @@ import lithops import numpy as np import pandas as pd -from retrieve_nwqn_samples import BAD_NLDI_SITES, find_neighboring_sites +from retrieve_nwqn_samples import ( + BAD_NLDI_SITES, + find_neighboring_sites, + get_monitoring_locations, +) -from dataretrieval import nwis +from dataretrieval import waterdata DESTINATION_BUCKET = os.environ.get("DESTINATION_BUCKET") START_DATE = "1991-01-01" @@ -17,7 +21,7 @@ def map_retrieval(site): - """Map function to pull data from NWIS and WQP""" + """Map function to pull daily streamflow from the USGS Water Data API""" print(f"Retrieving daily streamflow from site {site}") if site in BAD_NLDI_SITES: @@ -27,47 +31,48 @@ def map_retrieval(site): sleep(randint(0, 5)) site_list = find_neighboring_sites(site) - df, _ = nwis.get_dv( - sites=site_list, - start=START_DATE, - end=END_DATE, - parameterCd="00060", + # Daily mean discharge, approved values only (filtered by the service). + df, _ = waterdata.get_daily( + monitoring_location_id=[f"USGS-{s}" for s in site_list], + parameter_code="00060", + statistic_id="00003", + approval_status="Approved", + time=f"{START_DATE}/{END_DATE}", + skip_geometry=True, ) - # by default, site_no is not in the index if a single site is queried - if "site_no" in df.columns: - index_name = df.index.names[0] - df.set_index(["site_no", df.index], inplace=True) - df.index.names = ["site_no", index_name] - print(len(df), "records retrieved") # process the results if not df.empty: - # drop rows with missing values; ignore other 00060_* columns - df = df.dropna(subset=["00060_Mean"]) - # fill missing codes to enable string operations - df["00060_Mean_cd"] = df["00060_Mean_cd"].fillna("M") - df = df[df["00060_Mean_cd"].str.contains("A")] - df["00060_Mean"] = df["00060_Mean"].replace(-999999, np.nan) - - site_info, _ = nwis.get_info(sites=site_list) - # USACE sites may have same site_no, which creates index conflicts later - site_info = site_info[site_info["agency_cd"] == "USGS"] # keep only USGS sites + # index by bare site number and day, keeping only the discharge value + df["site_no"] = df["monitoring_location_id"].str.removeprefix("USGS-") + df = df.set_index(["site_no", "time"])[["value"]].dropna() + + site_info, _ = get_monitoring_locations( + monitoring_location_id=[f"USGS-{s}" for s in site_list], + skip_geometry=True, + ) + # keep only USGS sites; USACE sites may share a site number, which + # creates index conflicts later + site_info = site_info[site_info["agency_code"] == "USGS"] + site_info["site_no"] = site_info["monitoring_location_id"].str.removeprefix( + "USGS-" + ) site_info = site_info.set_index("site_no") main_site = site_info.loc[site] - main_site_drainage_area = main_site["drain_area_va"] + main_site_drainage_area = main_site["drainage_area"] # compute fraction of drainage area - site_info = site_info[["drain_area_va"]].copy() + site_info = site_info[["drainage_area"]].copy() site_info["drain_fraction"] = ( - site_info["drain_area_va"] / main_site_drainage_area + site_info["drainage_area"] / main_site_drainage_area ) site_info["fraction_diff"] = np.abs(1 - site_info["drain_fraction"]) # apply drainage area fraction df = pd.merge(df, site_info, left_index=True, right_index=True) - df["00060_Mean"] *= site_info.loc[ + df["value"] *= site_info.loc[ df.index.get_level_values("site_no"), "drain_fraction" ].values @@ -87,7 +92,7 @@ def map_retrieval(site): output = update_dataframe(output, fill_data) output = output.drop( - columns=["drain_area_va", "drain_fraction", "fraction_diff"] + columns=["drainage_area", "drain_fraction", "fraction_diff"] ) output["site_no"] = site diff --git a/demos/peak_streamflow_trends.ipynb b/demos/peak_streamflow_trends.ipynb index 1beb5dd39..811d04ebc 100644 --- a/demos/peak_streamflow_trends.ipynb +++ b/demos/peak_streamflow_trends.ipynb @@ -37,7 +37,7 @@ "metadata": {}, "source": [ "## Basic usage\n", - "The `waterdata` module is the recommended interface to USGS water data and replaces the deprecated `nwis` module. Annual peak streamflow is retrieved with `waterdata.get_peaks()`, which returns a `pandas` data frame and a metadata object. To get started we need a monitoring location ID, a parameter code, and (optionally) a time window." + "The `waterdata` module is the interface to USGS water data. Annual peak streamflow is retrieved with `waterdata.get_peaks()`, which returns a `pandas` data frame and a metadata object. To get started we need a monitoring location ID, a parameter code, and (optionally) a time window." ] }, { diff --git a/docs/source/architecture/decisions/0001-modular-monolith.rst b/docs/source/architecture/decisions/0001-modular-monolith.rst index befcc0d6a..a1854efb0 100644 --- a/docs/source/architecture/decisions/0001-modular-monolith.rst +++ b/docs/source/architecture/decisions/0001-modular-monolith.rst @@ -44,8 +44,10 @@ Compliance ---------- ``.importlinter`` prevents shared OGC infrastructure from importing service -adapters and prevents modern modules from depending on legacy NWIS; -``lint-imports`` checks it in pre-commit and CI. A package-wide fitness function -requires the runtime import graph, including package facades, to stay acyclic. -The installed-wheel CI job verifies that the whole monolith ships as one usable -artifact. +adapters; ``lint-imports`` checks it in pre-commit and CI. A package-wide +fitness function requires the runtime import graph, including package facades, +to stay acyclic. The installed-wheel CI job verifies that the whole monolith +ships as one usable artifact. + +Note (2026-10): ``dataretrieval.nwis`` was removed, so the contract that kept +modern modules from depending on legacy NWIS is deleted with the module. diff --git a/docs/source/architecture/decisions/0003-dependency-direction.rst b/docs/source/architecture/decisions/0003-dependency-direction.rst index 434ba9fbb..9436b9b92 100644 --- a/docs/source/architecture/decisions/0003-dependency-direction.rst +++ b/docs/source/architecture/decisions/0003-dependency-direction.rst @@ -48,11 +48,15 @@ Compliance ``.importlinter`` is the single authority for dependency direction. It declares the layer stack, the allowlist of OGC consumers, the facade-only seam, OGC's -independence from legacy utilities, the NWIS quarantine, and collection-family +independence from legacy utilities, and collection-family independence; ``lint-imports`` checks all of it against the transitive import graph in pre-commit and CI. A boundary that legitimately moves is one edit, in that file, alongside the ADR it cites. +Note (2026-10): ``dataretrieval.nwis`` was removed, so the NWIS quarantine +contract and the Decision's two rules naming NWIS above are deleted along with +the module. + These rules were previously asserted a second time in ``tests/architecture_test.py``, by hand-parsing the AST. That duplication is gone. The tests now cover only what the configured contracts cannot express — diff --git a/docs/source/architecture/decisions/0005-legacy-nwis.rst b/docs/source/architecture/decisions/0005-legacy-nwis.rst index a1b8771b6..7185daa33 100644 --- a/docs/source/architecture/decisions/0005-legacy-nwis.rst +++ b/docs/source/architecture/decisions/0005-legacy-nwis.rst @@ -4,7 +4,8 @@ ADR 0005: Quarantine and retire legacy NWIS Status ------ -Accepted +Accepted; completed -- ``dataretrieval.nwis`` removed in the next major release +(2026-10), ahead of the 2027-05-06 horizon. Context ------- @@ -43,7 +44,8 @@ Consequences Compliance ---------- -Deprecation tests verify one warning per public call and validate named Water -Data replacements. The ``nwis-quarantine`` contract in ``.importlinter`` -prevents modern package modules from importing ``dataretrieval.nwis``, directly -or through an intermediary. +Note (2026-10): ``dataretrieval.nwis`` has been removed, so +``import dataretrieval.nwis`` raises ``ModuleNotFoundError`` and the +``nwis-quarantine`` contract that once kept modern modules from importing it is +deleted. The deprecation tests that verified one warning per public call and +named Water Data replacements are gone with the module. diff --git a/docs/source/architecture/decisions/0006-service-neutral-transport.rst b/docs/source/architecture/decisions/0006-service-neutral-transport.rst index dec857a6d..7ebf95391 100644 --- a/docs/source/architecture/decisions/0006-service-neutral-transport.rst +++ b/docs/source/architecture/decisions/0006-service-neutral-transport.rst @@ -76,8 +76,7 @@ gateway statuses, because its service responds to a *rejected query* with a 500, and re-sending that would spend a caller's quota on a request that cannot succeed. Both sets are narrower than ``DataRetrievalError.retryable``, deliberately: that field indicates re-issuing might work, where spending -someone's quota unasked needs a stricter criterion. Deprecated NWIS calls -retain their compatibility behavior. A failed pagination or fan-out operation +someone's quota unasked needs a stricter criterion. A failed pagination or fan-out operation raises rather than returning successful siblings as an apparently complete result -- with one narrow exception for a fan-out over independent items, recorded in :doc:`0004-error-retry-resume`. diff --git a/docs/source/architecture/decisions/0007-adapter-facades.rst b/docs/source/architecture/decisions/0007-adapter-facades.rst index a00fa89e6..28578faea 100644 --- a/docs/source/architecture/decisions/0007-adapter-facades.rst +++ b/docs/source/architecture/decisions/0007-adapter-facades.rst @@ -95,7 +95,9 @@ collection families independent of each other, restricts the facade-only consumers (NGWMN and ``waterdata.cql``) to the OGC facade, and prevents one adapter from importing another. The identifier-column rule is covered by ``tests/nwdc_test.py::test_huc12_id_kept_as_string_with_leading_zero`` and the equivalent -leading-zero assertions in the WQP and NWIS adapter tests. +leading-zero assertions in the WQP adapter tests. Note (2026-10): the NWIS +adapter tests that once asserted the same rule were removed with +``dataretrieval.nwis``. Notes ----- diff --git a/docs/source/architecture/decisions/0010-adapter-scoped-settings.rst b/docs/source/architecture/decisions/0010-adapter-scoped-settings.rst index 4dd65cd71..e824f08e4 100644 --- a/docs/source/architecture/decisions/0010-adapter-scoped-settings.rst +++ b/docs/source/architecture/decisions/0010-adapter-scoped-settings.rst @@ -65,15 +65,10 @@ from shows the premise is false. The settings themselves differ: - no - gateway only - no - * - ``nwis`` (deprecated, not an adapter key) - - ``waterservices.usgs.gov`` - - no - - fixed, no retry - - yes ``concurrency`` and ``parallel_chunks`` are meaningless for the four single-shot adapters -- there is nothing to fan out. ``ssl_check`` applies to -four adapters (``waterdata``, ``nwdc``, ``nwis``, ``wqp``) and is currently a +three adapters (``waterdata``, ``nwdc``, ``wqp``) and is currently a per-call keyword outside the chain entirely; it is passed to ``httpx``'s ``verify``, verified by spying on the client. A flat namespace accepts ``configure(streamstats={"parallel_chunks": 8})`` without error, which is @@ -165,7 +160,8 @@ Settings are scoped to the **adapter**, not the service, and not the host. ``waterdata``, ``ngwmn``, ``nwdc``, ``wqp``, ``nldi``, ``streamstats``. The deprecated ``nwis`` is deliberately absent: its calls pin ``max_retries=0``, so a ``[nwis]`` table could only be reported as in effect and - then ignored -- the failure this decision exists to prevent. + then ignored -- the failure this decision exists to prevent. Note (2026-10): + ``nwis`` has since been removed entirely. 8. **Each adapter is a named, typed parameter on** ``configure()``, annotated with its own ``TypedDict``, so a type checker rejects a setting the adapter @@ -231,11 +227,13 @@ Consequences the package that reads ``os.environ`` for a setting. - **``ssl_check`` stays a per-call argument and does not become a setting.** - It is a defaulted keyword on 23 shipped getters across four adapters -- - ``wqp`` (9), ``nwis`` (10), ``waterdata`` (3) and ``nwdc`` (1) -- and it is + It is a defaulted keyword on 13 shipped getters across three adapters -- + ``wqp`` (9), ``waterdata`` (3) and ``nwdc`` (1) -- and it is passed to ``httpx``'s ``verify``. It was added in 2023 to what were then the only modules; the OGC getters were added later and never adopted it, so its - distribution records the package's history rather than a boundary. + distribution records the package's history rather than a boundary. (Note + (2026-10): the ``nwis`` adapter, which held 10 of the getters, has been + removed.) Three reasons not to promote it. It disables certificate verification, so as a per-call keyword it is a visible, scoped decision, while a config-file key diff --git a/docs/source/architecture/decisions/0013-core-and-domain-terms.rst b/docs/source/architecture/decisions/0013-core-and-domain-terms.rst index 105b35d23..80cb9ba58 100644 --- a/docs/source/architecture/decisions/0013-core-and-domain-terms.rst +++ b/docs/source/architecture/decisions/0013-core-and-domain-terms.rst @@ -105,7 +105,8 @@ Consequences - The recurring question -- may this docstring say *site*? -- has an answer that does not depend on who is reviewing. In ``nwis`` it may, because that is the spelling its service and its parameters use. In ``transport`` it may not, - because nothing there is about NWIS. + because nothing there is about NWIS. (Note (2026-10): the ``nwis`` module has + since been removed; the example stands as the reasoning that applied to it.) - Enforcement splits. A core term can be checked mechanically, since one spelling is correct everywhere. A domain term cannot: the correct spelling depends on which adapter the prose is about, so it stays a review judgement. diff --git a/docs/source/architecture/index.rst b/docs/source/architecture/index.rst index a71518f04..2625d0ece 100644 --- a/docs/source/architecture/index.rst +++ b/docs/source/architecture/index.rst @@ -54,7 +54,7 @@ The package is the layer between Python callers and remote hydrologic services:: | v USGS Water Data APIs, NGWMN, NWDC Water Use, - Water Quality Portal, NLDI, StreamStats, legacy NWIS + Water Quality Portal, NLDI, StreamStats The remote services own their schemas, paging mechanisms, rate limits, and availability. The library adapts those differences to documented Python @@ -89,10 +89,6 @@ Public service adapters Service-specific adapters over shared synchronous HTTP and bounded retry policy. Their return types intentionally reflect their upstream data models. -``dataretrieval.nwis`` - Deprecated legacy NWIS adapter, scheduled for removal on or after - 2027-05-06. Modern code must not depend on it. - Shared components ^^^^^^^^^^^^^^^^^ @@ -169,8 +165,8 @@ Shared components behavior there. ``dataretrieval._querying`` - The one-shot HTTP query path the single-request adapters (``nwis``, - ``wqp``, ``nldi``, ``streamstats``, ``nwdc``) use: compose the URL, send + The one-shot HTTP query path the single-request adapters (``wqp``, + ``nldi``, ``streamstats``, ``nwdc``) use: compose the URL, send it, map the status, retry a transient. It was moved out of ``utils`` because the two halves were in one file for no other reason -- this one depends on ``exceptions`` and ``transport``, the shaping half on ``codes`` and @@ -240,8 +236,6 @@ service into one return shape: - StreamStats functions return raw ``httpx.Response`` objects or the service-specific ``Watershed`` domain object, depending on the requested format. -- Deprecated NWIS functions retain their established DataFrame and legacy - metadata contracts through the published deprecation window. Changing one of these shapes is a public compatibility change and requires the project's deprecation process; consistency alone is not sufficient reason. @@ -296,8 +290,7 @@ architecturally is the behavior around them: bounded ``Retry-After`` values. Only failures that may not recur on a later attempt are re-sent: 429 and gateway 5xx, not a 500 rejecting the query itself, and not a transport failure that is determined before the request - is sent (unresolvable host, unsupported scheme). Deprecated NWIS - compatibility paths do not opt in. + is sent (unresolvable host, unsupported scheme). ``API_USGS_STALL_TIMEOUT`` Seconds a call may go without receiving any data before retrying stops and diff --git a/docs/source/examples/USGS_NLDI_Examples.nblink b/docs/source/examples/USGS_NLDI_Examples.nblink new file mode 100644 index 000000000..690c1e654 --- /dev/null +++ b/docs/source/examples/USGS_NLDI_Examples.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../../demos/hydroshare/USGS_NLDI_Examples.ipynb" +} diff --git a/docs/source/examples/USGS_NWDC_WaterUse_Examples.nblink b/docs/source/examples/USGS_NWDC_WaterUse_Examples.nblink new file mode 100644 index 000000000..834f99160 --- /dev/null +++ b/docs/source/examples/USGS_NWDC_WaterUse_Examples.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../../demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb" +} diff --git a/docs/source/examples/USGS_NWIS_WaterUse_Examples.nblink b/docs/source/examples/USGS_NWIS_WaterUse_Examples.nblink deleted file mode 100644 index b08fd2b98..000000000 --- a/docs/source/examples/USGS_NWIS_WaterUse_Examples.nblink +++ /dev/null @@ -1,3 +0,0 @@ -{ - "path": "../../../demos/hydroshare/USGS_NWIS_WaterUse_Examples.ipynb" -} diff --git a/docs/source/examples/USGS_WaterUse_Examples.nblink b/docs/source/examples/USGS_WaterUse_Examples.nblink new file mode 100644 index 000000000..ea4d19dca --- /dev/null +++ b/docs/source/examples/USGS_WaterUse_Examples.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../../demos/USGS_WaterUse_Examples.ipynb" +} diff --git a/docs/source/examples/index.rst b/docs/source/examples/index.rst index e7c2deb8a..5b26c8444 100644 --- a/docs/source/examples/index.rst +++ b/docs/source/examples/index.rst @@ -6,9 +6,9 @@ Examples Introduction to the ``waterdata`` module of ``dataretrieval`` ------------------------------------------------------------- -The ``waterdata`` module will replace the ``nwis`` module as the primary -set of data download functions for USGS water data. This Jupyter notebook -covers a basic introduction to module functions and usage. +The ``waterdata`` module is the primary set of data download functions for +USGS water data. This Jupyter notebook covers a basic introduction to module +functions and usage. .. toctree:: :maxdepth: 1 @@ -31,6 +31,7 @@ functions and is executed against the live USGS Water Data API. USGS_WaterData_DailyStatistics_Examples USGS_WaterData_ContinuousData_Examples USGS_WaterData_ReferenceLists_Examples + USGS_WaterUse_Examples USGS_NGWMN_Examples Simple uses of the ``dataretrieval`` package @@ -70,7 +71,8 @@ project repository. USGS_WaterData_Statistics_Examples USGS_WaterData_UnitValues_Examples USGS_WaterData_Samples_Examples - USGS_NWIS_WaterUse_Examples + USGS_NLDI_Examples + USGS_NWDC_WaterUse_Examples Using ``dataretrieval`` to obtain nation trends in peak annual streamflow diff --git a/docs/source/examples/readme_examples.rst b/docs/source/examples/readme_examples.rst index 0d7a9099d..1eabe25e7 100644 --- a/docs/source/examples/readme_examples.rst +++ b/docs/source/examples/readme_examples.rst @@ -5,8 +5,7 @@ Retrieving USGS water data with the ``waterdata`` module .. note:: The ``waterdata`` module accesses the USGS `Water Data API`_ and is the - recommended way to retrieve USGS water data. The legacy ``nwis`` module - remains available but is deprecated. + recommended way to retrieve USGS water data. .. _Water Data API: https://api.waterdata.usgs.gov/ diff --git a/docs/source/reference/index.rst b/docs/source/reference/index.rst index 5cbebce15..1d4925803 100644 --- a/docs/source/reference/index.rst +++ b/docs/source/reference/index.rst @@ -11,7 +11,6 @@ API reference exceptions ngwmn nldi - nwis streamstats utils waterdata diff --git a/docs/source/reference/nwis.rst b/docs/source/reference/nwis.rst deleted file mode 100644 index 6d8aef97e..000000000 --- a/docs/source/reference/nwis.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _nwis: - -dataretrieval.nwis ------------------- - -.. automodule:: dataretrieval.nwis - :members: - :special-members: diff --git a/docs/source/userguide/dataportals.rst b/docs/source/userguide/dataportals.rst index adfa127b2..5203f6ef0 100644 --- a/docs/source/userguide/dataportals.rst +++ b/docs/source/userguide/dataportals.rst @@ -18,5 +18,3 @@ portals. The table below lists those portals and their web addresses. +-----------------------------------+---------------------------------------------------------------+ | Water Quality Portal | https://waterqualitydata.us | +-----------------------------------+---------------------------------------------------------------+ -| Water Services | https://waterservices.usgs.gov | -+-----------------------------------+---------------------------------------------------------------+ diff --git a/pyproject.toml b/pyproject.toml index 45e0e0a4f..7370f694c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -171,7 +171,8 @@ ignore = [ ] [tool.ruff.lint.flake8-unused-arguments] -# Retired ``nwis`` functions accept unused ``**kwargs`` to report replacements. +# Getters with a ``**kwargs`` passthrough (Water Data's ``**queryables``, WQP's +# search filters) accept variadic parameters a given call may not consume. # Exempt variadic parameters while checking named parameters with ARG001. ignore-variadic-names = true diff --git a/tests/configuration_test.py b/tests/configuration_test.py index 01abc7f45..3d2c509d2 100644 --- a/tests/configuration_test.py +++ b/tests/configuration_test.py @@ -1003,7 +1003,7 @@ def test_non_regular_config_path_is_empty_configuration(monkeypatch): def test_broken_config_does_not_break_unrelated_services(config_file): - """A Water Data config problem must not fail a legacy NWIS/WQP call. + """A Water Data config problem must not fail an unrelated-host call. Config resolution can raise, and ``_default_headers`` runs for every service. Resolving the key only after the host check keeps the failure @@ -1011,8 +1011,8 @@ def test_broken_config_does_not_break_unrelated_services(config_file): """ config_file("this is not = valid toml [[[\n") - # Legacy hosts never get the key, so they never read the configuration. - assert "X-Api-Key" not in _default_headers("https://waterservices.usgs.gov/nwis/dv") + # Unauthorized hosts never get the key, so they never read the configuration. + assert "X-Api-Key" not in _default_headers("https://example.invalid/data") assert "X-Api-Key" not in _default_headers("https://www.waterqualitydata.us/data") # The authorized host still raises rather than sending the request @@ -1284,11 +1284,11 @@ def test_settings_for_an_unimported_adapter_is_not_an_error(monkeypatch): def test_every_adapter_is_actually_wired_to_a_read_site(): """A schema nothing passes gives the caller a report that may be wrong. - ``show_configuration()`` would report a ``[nwis]`` override as live while every call - ignored it -- the report that exists to say what a call will use being wrong. - Importability is the weaker half of the invariant: it passed while - ``waterdata.get_cql``, eight of nine WQP getters, and all of ``nwis`` resolved - package-wide without an error. + ``show_configuration()`` would report a ``[streamstats]`` override as live while + every call ignored it -- the report that exists to say what a call will use being + wrong. Importability is the weaker half of the invariant: it passed while + ``waterdata.get_cql``, eight of nine WQP getters, and all of ``streamstats`` + resolved package-wide without an error. """ import pathlib @@ -1320,7 +1320,7 @@ def test_a_misspelled_adapter_at_a_read_site_raises(): # Every read site goes through one resolver, so the check covers them all -- # including the accessors that would otherwise return a default. with pytest.raises(configuration.ConfigurationError, match="not a configurable"): - configuration.base_url(adapter="nwis", default="https://example.invalid") + configuration.base_url(adapter="ngwmns", default="https://example.invalid") def test_a_non_finite_stall_timeout_is_refused(): diff --git a/tests/data/nwis_iv_empty_mock.json b/tests/data/nwis_iv_empty_mock.json deleted file mode 100644 index 7b69d6d54..000000000 --- a/tests/data/nwis_iv_empty_mock.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "value": { - "timeSeries": [] - } -} \ No newline at end of file diff --git a/tests/data/nwis_iv_mock.json b/tests/data/nwis_iv_mock.json deleted file mode 100644 index 5c84f9f82..000000000 --- a/tests/data/nwis_iv_mock.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "value": { - "timeSeries": [ - { - "sourceInfo": { - "siteCode": [ - { - "value": "03339000" - } - ] - }, - "variable": { - "variableCode": [ - { - "value": "00060" - } - ], - "options": { - "option": [ - { - "value": "mean" - } - ] - } - }, - "values": [ - { - "method": [ - { - "methodDescription": "mean" - } - ], - "value": [ - { - "value": "1.0", - "dateTime": "2018-01-24T00:00:00Z", - "qualifiers": "A" - } - ] - } - ] - }, - { - "sourceInfo": { - "siteCode": [ - { - "value": "05447500" - } - ] - }, - "variable": { - "variableCode": [ - { - "value": "00060" - } - ], - "options": { - "option": [ - { - "value": "mean" - } - ] - } - }, - "values": [ - { - "method": [ - { - "methodDescription": "mean" - } - ], - "value": [ - { - "value": "2.0", - "dateTime": "2018-01-24T00:00:00Z", - "qualifiers": "A" - } - ] - } - ] - } - ] - } -} \ No newline at end of file diff --git a/tests/data/nwis_sites.txt b/tests/data/nwis_sites.txt deleted file mode 100755 index ad460ae98..000000000 --- a/tests/data/nwis_sites.txt +++ /dev/null @@ -1,238 +0,0 @@ -# -# -# US Geological Survey -# retrieved: 2020-03-06 11:23:28 -05:00 (caas01) -# -# The Site File stores location and general information about groundwater, -# surface water, and meteorological sites -# for sites in USA. -# -# File-format description: http://help.waterdata.usgs.gov/faq/about-tab-delimited-output -# Automated-retrieval info: https://waterservices.usgs.gov/docs/site-service/site-service-details/ -# -# Contact: gs-w_support_nwisweb@usgs.gov -# Warning: A site search criterion has been used for which the data may be unavailable. -# -# The following selected fields are included in this output: -# -# agency_cd -- Agency -# site_no -- Site identification number -# station_nm -- Site name -# site_tp_cd -- Site type -# dec_lat_va -- Decimal latitude -# dec_long_va -- Decimal longitude -# coord_acy_cd -- Latitude-longitude accuracy -# dec_coord_datum_cd -- Decimal Latitude-longitude datum -# alt_va -- Altitude of Gage/land surface -# alt_acy_va -- Altitude accuracy -# alt_datum_cd -- Altitude datum -# huc_cd -- Hydrologic unit code -# -agency_cd site_no station_nm site_tp_cd dec_lat_va dec_long_va coord_acy_cd dec_coord_datum_cd alt_va alt_acy_va alt_datum_cd huc_cd -5s 15s 50s 7s 16s 16s 1s 10s 8s 3s 10s 16s -USGS 03161500 SOUTH FORK NEW RIVER NR CRUMPLER, NC ST 36.53484707 -81.3428766 S NAD83 2550.00 1 NGVD29 05050001 -USGS 03163000 NEW RIVER NEAR BAYWOOD, VA ST 36.608461 -81.0442497 U NAD83 2260.00 1 NGVD29 05050001 -USGS 03175100 COX BRANCH AB TAZEWELL RESERVOIR NR GRATTON, VA ST 37.15344945 -81.4139945 U NAD83 2990 1 NGVD29 05050002 -USGS 03175140 WEST FORK COVE CREEK NEAR BLUEFIELD, VA ST 37.18428345 -81.3298241 S NAD83 2650 20 NGVD29 05050002 -USGS 03177700 BLUESTONE RIVER AT BLUEFIELD, VA ST 37.2559502 -81.2817664 U NAD83 2350.00 1 NGVD29 05050002 -USGS 03177710 BLUESTONE RIVER AT FALLS MILLS, VA ST 37.27150554 -81.3048227 U NAD83 2316.68 0.6 NAVD88 05050002 -USGS 03178000 BLUESTONE R NR SPANISHBURG, WV ST 37.4334722 -81.11 1 NAD83 2051.13 010 NGVD29 05050002 -USGS 03178500 CAMP CREEK NEAR CAMP CREEK, WV ST 37.5042841 -81.1275947 U NAD83 05050002 -USGS 03179000 BLUESTONE RIVER NEAR PIPESTEM, WV ST 37.54400779 -81.0103678 U NAD83 1526.91 10 NAVD88 05050002 -USGS 03185000 PINEY CREEK AT RALEIGH, WV ST 37.7606708 -81.1623212 U NAD83 2083.9 .1 NAVD88 05050004 -USGS 03185400 NEW RIVER AT THURMOND, WV ST 37.95511285 -81.07648838 F NAD83 1030.7 .20 NAVD88 05050004 -USGS 03185500 NEW RIVER @ CAPERTON ST 38.02233437 -81.0289878 U NAD83 938.44 0.1 NGVD29 05050004 -USGS 03186000 NEW RIVER @ FAYETTE ST 38.06538847 -81.0776014 U NAD83 838.44 0.1 COE1912 05050004 -USGS 03191000 GAULEY RIVER NEAR LEANDER, WV ST 38.20288637 -81.0137124 U NAD83 981.17 0.1 NGVD29 05050005 -USGS 03191500 PETERS CREEK NEAR LOCKWOOD, WV ST 38.2646111 -81.0231111 F NAD83 1064.10 010 NAVD88 05050005 -USGS 03192000 GAULEY RIVER ABOVE BELVA, WV ST 38.2334395 -81.1809415 U NAD83 668.79 10 NAVD88 05050005 -USGS 03192200 Twentymile Creek at Vaughan, WV ST 38.27777778 -81.1436111 S NAD83 798 29 NAVD88 05050005 -USGS 03192500 GAULEY RIVER AT BELVA, WV ST 38.2251062 -81.1914973 U NAD83 663.53 0.1 COE1912 05050005 -USGS 03193000 KANAWHA RIVER AT KANAWHA FALLS, WV ST 38.1381632 -81.2142745 F NAD83 620.39 .1 NAVD88 05050006 -USGS 03193742 KANAWHA RIVER AT GLASGOW, WV ST 38.2064927 -81.4248371 U NAD83 05050006 -USGS 03193770 KANAWHA RIVER AT CABIN CREEK, WV ST 38.19954775 -81.47789389 U NAD83 05050006 -USGS 03193776 RIGHT FORK LITTLE CREEK NR CHELYAN, WV ST 38.1792698 -81.5178944 U NAD83 05050006 -USGS 03193778 LITTLE CREEK NEAR CHELYAN, WV ST 38.18260318 -81.5123388 U NAD83 750.00 20 NGVD29 05050006 -USGS 03196750 BUFFALO CREEK AT CLAY, WV ST 38.4545458 -81.0667743 U NAD83 05050007 -USGS 03196800 ELK RIVER AT CLAY, WV ST 38.46065656 -81.0876087 U NAD83 677.23 .16 NAVD88 05050007 -USGS 03197000 ELK RIVER AT QUEEN SHOALS, WV ST 38.47093228 -81.2840057 U NAD83 603.50 10 NAVD88 05050007 -USGS 03197500 ELK R AT CLENDENIN, WV ST 38.48981995 -81.3498412 U NAD83 588.70 0.1 NGVD29 05050007 -USGS 03197680 ELK RIVER AT BLUE CREEK,WV ST 38.4492642 -81.4559545 U NAD83 578.22 0.1 NGVD29 05050007 -USGS 03197790 LITTLE SANDY CREEK NEAR ELKVIEW,WV ST 38.45594444 -81.5011944 S NAD83 05050007 -USGS 03198000 KANAWHA RIVER AT CHARLESTON, WV ST 38.37148448 -81.7020701 U NAD83 547.34 10 NAVD88 05050008 -USGS 03198020 TRACE FORK AT RUTH, WV ST 38.30731895 -81.7270693 F NAD83 700 010 NGVD29 05050008 -USGS 03198022 TRACE FK D/S DRYDEN HOLLOW AT RUTH, WV ST 38.31537429 -81.7281806 U NAD83 05050008 -USGS 03198350 CLEAR FORK AT WHITESVILLE, WV ST 37.9662186 -81.524278 F NAD83 818.49 .15 NAVD88 05050009 -USGS 03198450 DRAWDY CREEK NEAR PEYTONA, WV ST 38.12482378 -81.6923421 U NAD83 05050009 -USGS 03198500 BIG COAL RIVER AT ASHFORD, WV ST 38.1798222 -81.7115106 U NAD83 621.83 10 NAVD88 05050009 -USGS 03198550 BIG COAL RIVER NEAR ALUM CREEK, ST 38.2500969 -81.7981813 U NAD83 588.75 0.1 NGVD29 05050009 -USGS 03198690 Spruce Fork at Sharples, WV ST 37.92416667 -81.8283333 S NAD83 824 10 NAVD88 05050009 -USGS 03199000 LITTLE COAL RIVER AT DANVILLE, WV ST 38.07977778 -81.8365 1 NAD83 661.12 0.1 NGVD29 05050009 -USGS 03199300 ROCK CREEK NEAR DANVILLE, WV ST 38.1001 -81.82984589 U NAD83 674.77 0.1 NAVD88 05050009 -USGS 03199320 ROCK CREEK AT ROCK CREEK, WV ST 38.1014887 -81.8404018 U NAD83 05050009 -USGS 03199400 LITTLE COAL RIVER AT JULIAN, WV ST 38.15482058 -81.85234779 U NAD83 634.13 0.1 NGVD29 05050009 -USGS 03199500 LITTLE COAL RIVER AT MCCORKLE, WV ST 38.2167638 -81.8331818 U NAD83 05050009 -USGS 03199700 COAL RIVER AT ALUM CREEK, WV ST 38.2867626 -81.8065157 U NAD83 05050009 -USGS 03200000 COAL R AT FUQUA, WV ST 38.3153729 -81.8165167 U NAD83 05050009 -USGS 03200500 COAL RIVER AT TORNADO, WV ST 38.33898309 -81.841518 U NAD83 569.77 .07 NAVD88 05050009 -USGS 03200650 KANAWHA RIVER AT POCA, WV ST 38.4748136 -81.8190201 U NAD83 05050008 -USGS 03201405 HURRICANE CREEK AT HURRICANE, WV ST 38.4453673 -82.0068032 S NAD83 599.19 .07 NAVD88 05050008 -USGS 03201410 POPLAR FORK AT TEAYS, WV ST 38.450646 -81.9315231 U NAD83 642.39 10 NAVD88 05050008 -USGS 03202240 ALLEN CREEK AT ALLEN JUNCTION, WV ST 37.5926144 -81.346491 U NAD83 05070101 -USGS 03202245 MARSH FORK AT MABEN, WV ST 37.63872486 -81.3937143 U NAD83 1589.46 20 NAVD88 05070101 -USGS 03202255 STILL RUN AT ITMANN, WV ST 37.58094716 -81.4281588 U NAD83 05070101 -USGS 03202260 BLACK FORK ABOVE BLACK FORK FALLS NR MULLENS, WV ST 37.6190023 -81.4489927 U NAD83 05070101 -USGS 03202262 BLACK FORK AT MOUTH NR MULLENS, WV ST 37.62511335 -81.45315949 U NAD83 05070101 -USGS 03202310 BEARHOLE FORK AT PINEVILLE, WV ST 37.58789077 -81.5198273 U NAD83 05070101 -USGS 03202400 GUYANDOTTE RIVER NEAR BAILEYSVILLE, WV ST 37.60400034 -81.6451096 U NAD83 1139.41 .12 NAVD88 05070101 -USGS 03202480 BRIER CREEK AT FANROCK, WV ST 37.5634451 -81.6523317 U NAD83 1219.82 .1 NAVD88 05070101 -USGS 03202490 INDIAN CREEK AT FANROCK, WV ST 37.56705618 -81.652054 U NAD83 05070101 -USGS 03202695 MILAM FORK AT MCGRAWS, WV ST 37.6801128 -81.4739935 U NAD83 05070101 -USGS 03202750 CLEAR FORK AT CLEAR FORK, WV ST 37.62316608 -81.7073342 U NAD83 1149 20. NAVD88 05070101 -USGS 03202900 GUYANDOTTE R NR JUSTICE, WV ST 37.6070543 -81.79011488 U NAD83 05070101 -USGS 03202915 GUYANDOTTE RIVER BELOW R.D. BAILEY DAM ST 37.5981652 -81.829283 U NAD83 879.32 20 NAVD88 05070101 -USGS 03203000 GUYANDOTTE RIVER AT MAN, WV ST 37.740385 -81.8767857 U NAD83 710.06 .07 NAVD88 05070101 -USGS 03203600 GUYANDOTTE RIVER AT LOGAN, WV ST 37.84232616 -81.9759574 U NAD83 639.79 10 NAVD88 05070101 -USGS 03203670 WHITMAN CREEK AT WHITMAN, WV ST 37.8078816 -82.0281816 U NAD83 05070101 -USGS 03203700 ISLAND CREEK AT LOGAN, WV ST 37.84732558 -82.008181 U NAD83 05070101 -USGS 03204000 GUYANDOTTE RIVER AT BRANCHLAND, WV ST 38.22092326 -82.2026417 U NAD83 548.07 0.1 NAVD88 05070102 -USGS 03204200 GUYANDOTTE RIVER AT BARBOURSVILLE, WV ST 38.4156409 -82.2954258 U NAD83 05070102 -USGS 03204205 Unnamed Tributary to Ballard Fork near Mud, WV ST 38.06916667 -81.92 S NAD83 988 10 NGVD29 05070102 -USGS 03204210 Spring Branch near Mud, WV ST 38.06777778 -81.9377778 S NAD83 897.39 .1 NGVD29 05070102 -USGS 03204215 Ballard Fork near Mud, WV ST 38.06888889 -81.9422222 S NAD83 869 10 NAVD88 05070102 -USGS 03204220 Mud River at Mud, WV ST 38.09444444 -81.9783333 S NAD83 898 10 NAVD88 05070102 -USGS 03204500 MUD RIVER NEAR MILTON, WV ST 38.38825 -82.1131111 1 NAD83 572.64 0.1 COE1912 05070102 -USGS 03205000 MUD RIVER AT YATES, WV ST 38.44314225 -82.190144 U NAD83 05070102 -USGS 03205180 MUD RIVER AT BARBOURSVILLE, WV ST 38.41619648 -82.2948702 U NAD83 05070102 -USGS 03205500 Symmes Creek at Getaway OH ST 38.49591486 -82.4762668 S NAD83 539.15 .01 NGVD29 05090101 -USGS 03206000 OHIO RIVER AT HUNTINGTON, WV ST 38.41341549 -82.500434 U NAD83 489.16 0.1 NAVD88 05090101 -USGS 03206500 FOURPOLE C AT HUNTINGTON, WV ST 38.40424926 -82.4790442 U NAD83 520.23 0.1 NGVD29 05090101 -USGS 03206600 EAST FORK TWELVEPOLE CREEK NEAR DUNLOW, WV ST 38.0118333 -82.3059722 5 NAD83 717.51 10 NAVD88 05090102 -USGS 03206790 EAST FORK TWELVEPOLE CREEK BELOW EAST LYNN DAM ST 38.14786667 -82.3832045 U NAD83 609.30 10 NAVD88 05090102 -USGS 03206800 E F TWELVEPOLE C NR E LYNN, WV ST 38.15425535 -82.3845936 U NAD83 600.00 10 NGVD29 05090102 -USGS 03206980 WEST FK TWELVEPOLE CREEK ABOVE WAYNE @ ECHO, WV ST 38.1811976 -82.475709 U NAD83 05090102 -USGS 03207000 TWELVEPOLE CREEK AT WAYNE, WV ST 38.2181414 -82.448486 U NAD83 576.53 0.1 NGVD29 05090102 -USGS 03207020 TWELVEPOLE CREEK BELOW WAYNE, WV ST 38.24897409 -82.4343191 U NAD83 559.33 10 NAVD88 05090102 -USGS 03207057 BEECH FORK BELOW BEECH FORK DAM, WV ST 38.30508466 -82.424319 U NAD83 05090102 -USGS 03207500 LEVISA FORK NEAR GRUNDY, VA ST 37.2978881 -82.12596789 U NAD83 984.47 1 NGVD29 05070202 -USGS 03207800 LEVISA FORK AT BIG ROCK, VA ST 37.35371995 -82.1956935 U NAD83 865.64 .15 NAVD88 05070202 -USGS 03207845 CARD CREEK AT MOUTHCARD, KY ST 37.38177426 -82.2581969 U NAD83 850 10 NGVD29 05070202 -USGS 03207875 FEDS CREEK AT FEDS CREEK, KY ST 37.4020518 -82.2437516 U NAD83 820 20 NGVD29 05070202 -USGS 03207905 BIG CREEK AT DUNLAP, KY ST 37.42871789 -82.2476405 U NAD83 830 10 NGVD29 05070202 -USGS 03207915 ELKFOOT BRANCH LEVISA FORK NEAR HIGH, KY ST 37.3978846 -82.28403129 U NAD83 05070202 -USGS 03207925 ISLAND CREEK NEAR PHYLLIS, KY ST 37.42316146 -82.3045876 U NAD83 770 10 NGVD29 05070202 -USGS 03207935 LICK CREEK AT LICK CREEK, KY ST 37.39566215 -82.3020877 U NAD83 820 20 NGVD29 05070202 -USGS 03207940 MILLERS CREEK NEAR PHYLLIS, KY ST 37.4220499 -82.3312554 U NAD83 800 20 NGVD29 05070202 -USGS 03207962 DICKS FORK AT PHYLLIS, KY ST 37.4492713 -82.33764438 U NAD83 980 20 NGVD29 05070202 -USGS 03207965 GRAPEVINE CREEK NEAR PHYLLIS, KY ST 37.43260479 -82.3537563 U NAD83 780.00 10 NGVD29 05070202 -USGS 03208000 LEVISA FORK BELOW FISHTRAP DAM NEAR MILLARD, KY ST 37.42593725 -82.4123701 F NAD83 659.96 1 NGVD29 05070202 -USGS 03208034 GRISSOM CREEK NEAR COUNCIL, VA ST 37.07872129 -82.0401293 U NAD83 1810 1 NGVD29 05070202 -USGS 03208036 BARTON FORK NEAR COUNCIL, VA ST 37.0770546 -82.0390181 U NAD83 1800 1 NGVD29 05070202 -USGS 03208040 RUSSELL FORK AT COUNCIL, VA ST 37.07816537 -82.0654084 U NAD83 1680 1 NGVD29 05070202 -USGS 03208100 RUSSELL FORK NEAR BIRCHLEAF, VA ST 37.16399764 -82.2554193 U NAD83 1280 1 NGVD29 05070202 -USGS 03208500 RUSSELL FORK AT HAYSI, VA ST 37.20705367 -82.2956993 U NAD83 1237.61 .01 NGVD29 05070202 -USGS 03208700 N F POUND RIVER AT POUND, VA ST 37.12565856 -82.6265449 U NAD83 1500.00 1 NGVD29 05070202 -USGS 03208800 POUND RIVER ABOVE INDIAN CREEK, AT POUND, VA ST 37.12399227 -82.6079334 U NAD83 1535.64 .01 NGVD29 05070202 -USGS 03208850 POUND RIVER BELOW BOLD CAMP CREEK, AT POUND, VA ST 37.12204799 -82.5984888 U NAD83 1527.36 1 NGVD29 05070202 -USGS 03208900 POUND RIVER NEAR GEORGES FORK, VA ST 37.1642727 -82.5248762 U NAD83 1470.39 1 NGVD29 05070202 -USGS 03208950 CRANES NEST RIVER NEAR CLINTWOOD, VA ST 37.1239952 -82.4387614 U NAD83 1439.60 .2 NAVD88 05070202 -USGS 03209000 POUND RIVER BELOW FLANNAGAN DAM, NEAR HAYSI, VA ST 37.23705384 -82.34320179 U NAD83 1200.00 .01 NGVD29 05070202 -USGS 03209200 RUSSELL FORK AT BARTLICK, VA ST 37.24594307 -82.32347869 U NAD83 1165.00 1 NGVD29 05070202 -USGS 03209300 RUSSELL FORK AT ELKHORN CITY, KY ST 37.30399717 -82.3429236 F NAD83 773.00 1 NGVD29 05070202 -USGS 03209440 SHELBY CREEK AT DORTON, KY ST 37.27732816 -82.5787658 U NAD83 1002.69 .01 NGVD29 05070202 -USGS 03209500 LEVISA FORK AT PIKEVILLE, KY ST 37.4642676 -82.5262632 F NAD83 632.88 1 NGVD29 05070203 -USGS 03209800 LEVISA FORK AT PRESTONSBURG, KY ST 37.67093027 -82.7771043 F NAD83 588.12 1 NGVD29 05070203 -USGS 03210000 JOHNS CREEK NEAR META, KY ST 37.5670444 -82.45792659 F NAD83 715.66 .01 NGVD29 05070203 -USGS 03210040 RACCOON CREEK NEAR ZEBULON, KY ST 37.5153785 -82.4512599 U NAD83 785 1 NGVD29 05070203 -USGS 03210160 CANEY FORK NEAR GULNARE, KY ST 37.5864878 -82.5395963 U NAD83 715 1 NGVD29 05070203 -USGS 03210310 BRUSHY FORK AT HEENON, KY ST 37.66620956 -82.4840383 U NAD83 725 1 NGVD29 05070203 -USGS 03210420 BUFFALO CREEK NEAR ENDICOTT, KY ST 37.632876 -82.6048761 U NAD83 700 20 NGVD29 05070203 -USGS 03210500 2121 JOHNS CREEK NEAR PRESTONBURG, KY ST 37.69870809 -82.7248803 U NAD83 05070203 -USGS 03211500 JOHNS CREEK NEAR VAN LEAR, KY ST 37.74370748 -82.72404689 F NAD83 597.28 1 NGVD29 05070203 -USGS 03212000 PAINT CREEK AT STAFFORDSVILLE, KY ST 37.834815 -82.8707187 U NAD83 600.96 .01 NGVD29 05070203 -USGS 03212500 LEVISA FORK AT PAINTSVILLE, KY ST 37.81537197 -82.7915493 F NAD83 566.84 1 NGVD29 05070203 -USGS 03212515 RUSH FORK NEAR PAINTSVILLE, KY ST 37.85481527 -82.8154389 F NAD83 05070203 -USGS 03212558 PUNCHEONCAMP BRANCH AT LECKIE, WV ST 37.34372656 -81.4114921 U NAD83 05070201 -USGS 03212567 FREEMAN BRANCH NEAR SKYGUSTY, WV ST 37.27455979 -81.487328 U NAD83 05070201 -USGS 03212580 LEFT FORK SANDLICK CREEK AT ELBERT, WV ST 37.33566975 -81.5773293 U NAD83 05070201 -USGS 03212585 RIGHT FORK SANDLICK CREEK NEAR GARY, WV ST 37.3476142 -81.5667734 U NAD83 05070201 -USGS 03212600 TUG FORK AT WELCH, WV ST 37.41705797 -81.590107 U NAD83 05070201 -USGS 03212640 JOHNS KNOB BRANCH AT ELKHORN, WV ST 37.3850722 -81.3970278 H NAD83 1959.89 .01 NAVD88 05070201 -USGS 03212700 ELKHORN CR AT MAITLAND, WV ST 37.429836 -81.55205038 U NAD83 05070201 -USGS 03212703 ELKHORN CREEK TRIBUTARY AT WELCH, WV ST 37.42955809 -81.5670508 U NAD83 05070201 -USGS 03212750 TUG FORK DOWNSTREAM OF ELKHORN CREEK AT WELCH, WV ST 37.44122439 -81.5998295 U NAD83 1267.66 .07 NAVD88 05070201 -USGS 03212980 DRY FORK AT BEARTOWN, WV ST 37.39538968 -81.8026142 U NAD83 1055.40 10 NAVD88 05070201 -USGS 03212985 DRY FORK AT AVONDALE, WV ST 37.4256673 -81.789558 U NAD83 05070201 -USGS 03213000 TUG FORK AT LITWAR, WV ST 37.47927778 -81.8383056 1 NAD83 936.36 0.1 NGVD29 05070201 -USGS 03213495 CRANE CREEK NEAR PANTHER, WV ST 37.4245557 -81.8606728 U NAD83 05070201 -USGS 03213500 PANTHER CREEK NEAR PANTHER, WV ST 37.44555556 -81.8711111 U NAD83 1049 20. NAVD88 05070201 -USGS 03213577 KERSHAW BRANCH NEAR HURLEY, VA ST 37.4503877 -82.0109578 U NAD83 1140.00 1 NGVD29 05070201 -USGS 03213590 KNOX CREEK AT KELSA, VA ST 37.45066474 -82.0592943 M NAD83 945 1 NGVD29 05070201 -USGS 03213594 CAMP CREEK NEAR ARGO, KY ST 37.47483069 -82.0876291 U NAD83 05070201 -USGS 03213620 TUG FORK AT VULCAN, WV ST 37.55177326 -82.1242979 U NAD83 695.00 20 NGVD29 05070201 -USGS 03213630 RIGHT FORK HURRICANE CREEK NEAR STOPOVER, KY ST 37.49621929 -82.0892955 U NAD83 05070201 -USGS 03213700 TUG FORK AT WILLIAMSON, WV ST 37.67315699 -82.2801408 T NAD83 619.68 20 NAVD88 05070201 -USGS 03213800 PIGEON CREEK NR LENORE, WV ST 37.7870439 -82.2620845 U NAD83 05070201 -USGS 03214000 TUG FORK NEAR KERMIT, WV ST 37.81759718 -82.3887568 U NAD83 581.82 0.1 NGVD29 05070201 -USGS 03214500 TUG FORK AT KERMIT, WV ST 37.83731869 -82.4087578 U NAD83 574.07 20 NAVD88 05070201 -USGS 03214900 TUG FORK AT GLENHAYES, WV ST 38.0056466 -82.51459729 U NAD83 536.57 0.1 NGVD29 05070201 -USGS 03215000 BIG SANDY R AT LOUISA, KY ST 38.17119708 -82.6346023 F NAD83 512.81 1 NGVD29 05070201 -USGS 03215410 BLAINE CREEK NEAR BLAINE, KY ST 38.0295332 -82.846829 U NAD83 632.46 .01 NAVD88 05070204 -USGS 03215500 BLAINE CREEK AT YATESVILLE, KY ST 38.144531 -82.6846033 U NAD83 561.57 .01 NGVD29 05070204 -USGS 03216000 OHIO RIVER AT ASHLAND, KY ST 38.4811922 -82.6365497 F NAD83 481.03 1 NGVD29 05090103 -USGS 03216350 LITTLE SANDY RIVER BELOW GRAYSON DAM NEAR LEON, KY ST 38.25397068 -82.9910027 F NAD83 500.00 10 NGVD29 05090104 -USGS 03216400 LITTLE SANDY RIVER AT LEON, KY ST 38.2864704 -82.9773916 U NAD83 573.37 .01 NGVD29 05090104 -USGS 03216500 LITTLE SANDY RIVER AT GRAYSON, KY ST 38.3300813 -82.9393353 F NAD83 557.95 1 NGVD29 05090104 -USGS 03216540 EAST FORK LITTLE SANDY RIVER NEAR FALLSBURG, KY ST 38.233695 -82.7087717 U NAD83 661.4 .01 NGVD29 05090104 -USGS 03216564 MILE BRANCH AT COALTON, KY ST 38.36563749 -82.7804419 U NAD83 05070204 -USGS 03277300 NORTH FORK KENTUCKY RIVER AT WHITESBURG, KY ST 37.11759849 -82.82460429 F NAD83 1127.92 .01 NGVD29 05100201 -USGS 03400000 POOR FORK AT HARLAN LETCHER COUNTY LINE, KY ST 37.00009387 -82.90960579 U NAD83 1506.35 .01 NGVD29 05130103 -USGS 03400500 POOR FORK AT CUMBERLAND, KY ST 36.97398059 -82.99294 F NAD83 1410.15 1 NGVD29 05130103 -USGS 03471500 S F HOLSTON RIVER AT RIVERSIDE, NEAR CHILHOWIE, VA ST 36.7603931 -81.63122929 U NAD83 2106.71 .13 NAVD88 06010102 -USGS 03472500 BEAVERDAM CREEK AT DAMASCUS, VA ST 36.6278938 -81.79095259 U NAD83 1946.66 1 NGVD29 06010102 -USGS 03472515 TRIBUTARY TO LOCUST KNOB BRANCH AT SHADY VALLEY,TN ST 36.5095595 -81.94734349 U NAD83 06010102 -USGS 03473000 S F HOLSTON RIVER NEAR DAMASCUS, VA ST 36.65178127 -81.8440102 U NAD83 1792.30 .01 NGVD29 06010102 -USGS 03473500 M F HOLSTON RIVER AT GROSECLOSE, VA ST 36.888729 -81.34732718 U NAD83 2449.50 1.6 NAVD88 06010102 -USGS 03474000 M F HOLSTON RIVER AT SEVEN MILE FORD, VA ST 36.80733756 -81.6220617 U NAD83 1959.67 0.1 NAVD88 06010102 -USGS 03474500 M F HOLSTON RIVER AT CHILHOWIE, VA ST 36.7959482 -81.6803967 U NAD83 1930.00 1 NGVD29 06010102 -USGS 03475000 M F HOLSTON RIVER NEAR MEADOWVIEW, VA ST 36.7131694 -81.8187334 U NAD83 1820.04 .13 NAVD88 06010102 -USGS 03476500 S F HOLSTON RIVER BELOW SOUTH HOLSTON DAM, TENN ST 36.5235597 -82.097264 U NAD83 1450.00 .1 NGVD29 06010102 -USGS 03477500 BEAVER CREEK NEAR WALLACE, VA ST 36.64038617 -82.1115194 U NAD83 1808.93 1 NGVD29 06010102 -USGS 03478400 BEAVER CREEK AT BRISTOL, VA ST 36.63177439 -82.1337425 U NAD83 1780.60 0.1 NAVD88 06010102 -USGS 03478500 BEAVER CREEK AT BRISTOL, TENN ST 36.5867533 -82.1838218 U NAD83 1660.00 .1 NGVD29 06010102 -USGS 03487499 SOUTH FORK HOLSTON RIVER AT KINGSPORT(MAIN), TEN ST 36.53081209 -82.558057 U NAD83 1175.84 .1 NGVD29 06010102 -USGS 03487500 SOUTH FORK HOLSTON RIVER AT KINGSPORT, TENN ST 36.5231318 -82.5457063 U NAD83 1175.84 .1 NGVD29 06010102 -USGS 03487501 SOUTH FORK HOLSTON RIVER AT KINGSPORT, TN (AUX) ST 36.52562046 -82.5587236 U NAD83 1175.84 .1 NGVD29 06010102 -USGS 03487550 REEDY CREEK AT OREBANK, TN ST 36.5617741 -82.45947219 U NAD83 1232.61 .1 NGVD29 06010102 -USGS 03487800 LICK CREEK NEAR CHATHAM HILL, VA ST 36.962338 -81.4723343 U NAD83 2076.97 1 NGVD29 06010101 -USGS 03488000 N F HOLSTON RIVER NEAR SALTVILLE, VA ST 36.89678115 -81.7462293 U NAD83 1703.53 .01 NGVD29 06010101 -USGS 03488100 N F HOLSTON RIVER NEAR PLASTERCO, VA ST 36.8645574 -81.83789958 U NAD83 1625.84 1 NGVD29 06010101 -USGS 03488445 BRUMLEY CREEK NEAR HANSONVILLE, VA ST 36.8559427 -82.0451291 U NAD83 3371.95 1 NGVD29 06010101 -USGS 03488450 BRUMLEY CREEK AT BRUMLEY GAP, VA ST 36.79177655 -82.0192947 M NAD83 1489.16 .01 NGVD29 06010101 -USGS 03488500 N F HOLSTON RIVER AT HOLSTON, VA ST 36.77483088 -82.0726305 U NAD83 1437.11 1 NGVD29 06010101 -USGS 03489500 N F HOLSTON RIVER AT MENDOTA, VA ST 36.70149216 -82.3070856 U NAD83 1329.67 1 NGVD29 06010101 -USGS 03489850 COVE CREEK NEAR HILTON, VA ST 36.65232464 -82.3645881 U NAD83 1354.40 .01 NGVD29 06010101 -USGS 03489870 BIG MOCCASIN CR AT COLLINWOOD, NR HANSONVILLE, VA ST 36.73788077 -82.3234762 U NAD83 1796.34 1 NGVD29 06010101 -USGS 03489900 BIG MOCCASIN CREEK NEAR GATE CITY, VA ST 36.6464888 -82.553209 U NAD83 1267.64 1 NGVD29 06010101 -USGS 03490000 N F HOLSTON RIVER NEAR GATE CITY, VA ST 36.60871119 -82.567931 U NAD83 1197.56 1 NGVD29 06010101 -USGS 03490350 HOLSTON RIVER NEAR CHURCH HILL, TN ST 36.516765 -82.7232148 U NAD83 06010104 -USGS 03521000 CLINCH RIVER AT CEDAR BLUFF, VA ST 37.0890028 -81.7665035 U NAD83 1940.00 1 NGVD29 06010205 -USGS 03521500 CLINCH RIVER AT RICHLANDS, VA ST 37.08622488 -81.78094879 M NAD83 1924.08 .01 NGVD29 06010205 -USGS 03522000 LITTLE RIVER AT WARDELL, VA ST 37.03789148 -81.7976172 U NAD83 2033.01 1 NGVD29 06010205 -USGS 03523000 BIG CEDAR CREEK NEAR LEBANON, VA ST 36.9081651 -82.0387399 U NAD83 1895.76 .01 NGVD29 06010205 -USGS 03523500 THOMPSON CREEK NEAR COULWOOD, VA ST 36.98927587 -82.0620743 U NAD83 1573.22 1 NGVD29 06010205 -USGS 03524000 CLINCH RIVER AT CLEVELAND, VA ST 36.9448295 -82.1548569 U NAD83 1499.78 .12 NAVD88 06010205 -USGS 03524500 GUEST RIVER AT COEBURN, VA ST 36.92926938 -82.4562619 U NAD83 1925.29 .1 NAVD88 06010205 -USGS 03524550 GUEST RIVER NEAR MILLER YARD, VA ST 36.87871389 -82.4059814 U NAD83 1400 1 NGVD29 06010205 -USGS 03524740 CLINCH RIVER AT ROUTE 65 AT DUNGANNON, VA ST 36.83138889 -82.4619444 S NAD83 06010205 -USGS 03524900 STONY CREEK AT KA, VA ST 36.8159322 -82.6171014 U NAD83 1510 1 NGVD29 06010205 -USGS 03525000 STONY CREEK AT FORT BLACKMORE, VA ST 36.7750989 -82.58043379 U NAD83 1269.78 .01 NGVD29 06010205 -USGS 03525500 CLINCH RIVER AT CLINCHPORT, VA ST 36.67370844 -82.74710498 U NAD83 1210.00 1 NGVD29 06010205 -USGS 03526000 COPPER CREEK NEAR GATE CITY, VA ST 36.67398838 -82.5657099 U NAD83 1301.95 1 NGVD29 06010205 -USGS 03526990 COPPER CREEK ABOVE MOUTH AT SPEERS FERRY, VA ST 36.6553752 -82.7432159 S NAD83 06010205 -USGS 03527000 CLINCH RIVER AT SPEERS FERRY, VA ST 36.64870849 -82.7504384 U NAD83 1195.91 .21 NAVD88 06010205 -USGS 03527220 CLINCH RIVER NEAR LOONEYS GAP, TN ST 36.57280708 -82.938754 U NAD83 06010205 -USGS 03527500 N F CLINCH RIVER AT DUFFIELD, VA ST 36.7112068 -82.79571719 U NAD83 1314.14 1 NGVD29 06010205 -USGS 03529500 POWELL RIVER AT BIG STONE GAP, VA ST 36.86898536 -82.7754387 U NAD83 1458.34 .23 NAVD88 06010206 -USGS 03530000 S F POWELL RIVER AT BIG STONE GAP, VA ST 36.86509659 -82.7709942 U NAD83 1470.00 1 NGVD29 06010206 -USGS 03531000 POWELL RIVER NEAR PENNINGTON GAP, VA ST 36.73453336 -82.998777 U NAD83 1320.00 1 NGVD29 06010206 diff --git a/tests/data/waterservices_dv.txt b/tests/data/waterservices_dv.txt deleted file mode 100755 index fab57f83d..000000000 --- a/tests/data/waterservices_dv.txt +++ /dev/null @@ -1 +0,0 @@ -{"name":"ns1:timeSeriesResponseType","declaredType":"org.cuahsi.waterml.TimeSeriesResponseType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"queryInfo":{"queryURL":"http://waterservices.usgs.gov/nwis/dvformat=json&sites=01491000%2C01645000&startDT=2020-02-14&endDT=2020-02-15","criteria":{"locationParam":"[ALL:01491000, ALL:01645000]","variableParam":"ALL","timeParam":{"beginDateTime":"2020-02-14T00:00:00.000","endDateTime":"2020-02-15T00:00:00.000"},"parameter":[]},"note":[{"value":"[ALL:01491000, ALL:01645000]","title":"filter:sites"},{"value":"[mode=RANGE, modifiedSince=null] interval={INTERVAL[2020-02-14T00:00:00.000-05:00/2020-02-15T00:00:00.000-05:00]}","title":"filter:timeRange"},{"value":"methodIds=[ALL]","title":"filter:methodId"},{"value":"2020-02-20T21:07:37.666Z","title":"requestDT"},{"value":"05d575e0-5425-11ea-acf4-6cae8b663fb6","title":"requestId"},{"value":"Provisional data are subject to revision. Go to http://waterdata.usgs.gov/nwis/help/?provisional for more information.","title":"disclaimer"},{"value":"vaas01","title":"server"}]},"timeSeries":[{"sourceInfo":{"siteName":"CHOPTANK RIVER NEAR GREENSBORO, MD","siteCode":[{"value":"01491000","network":"NWIS","agencyCode":"USGS"}],"timeZoneInfo":{"defaultTimeZone":{"zoneOffset":"-05:00","zoneAbbreviation":"EST"},"daylightSavingsTimeZone":{"zoneOffset":"-04:00","zoneAbbreviation":"EDT"},"siteUsesDaylightSavingsTime":true},"geoLocation":{"geogLocation":{"srs":"EPSG:4326","latitude":38.99719444,"longitude":-75.7858056},"localSiteXY":[]},"note":[],"siteType":[],"siteProperty":[{"value":"ST","name":"siteTypeCd"},{"value":"02060005","name":"hucCd"},{"value":"24","name":"stateCd"},{"value":"24011","name":"countyCd"}]},"variable":{"variableCode":[{"value":"00010","network":"NWIS","vocabulary":"NWIS:UnitValues","variableID":45807042,"default":true}],"variableName":"Temperature, water, °C","variableDescription":"Temperature, water, degrees Celsius","valueType":"Derived Value","unit":{"unitCode":"deg C"},"options":{"option":[{"value":"Maximum","name":"Statistic","optionCode":"00001"}]},"note":[],"noDataValue":-999999.0,"variableProperty":[],"oid":"45807042"},"values":[{"value":[],"qualifier":[],"qualityControlLevel":[],"method":[{"methodDescription":"","methodID":68074}],"source":[],"offset":[],"sample":[],"censorCode":[]}],"name":"USGS:01491000:00010:00001"},{"sourceInfo":{"siteName":"CHOPTANK RIVER NEAR GREENSBORO, MD","siteCode":[{"value":"01491000","network":"NWIS","agencyCode":"USGS"}],"timeZoneInfo":{"defaultTimeZone":{"zoneOffset":"-05:00","zoneAbbreviation":"EST"},"daylightSavingsTimeZone":{"zoneOffset":"-04:00","zoneAbbreviation":"EDT"},"siteUsesDaylightSavingsTime":true},"geoLocation":{"geogLocation":{"srs":"EPSG:4326","latitude":38.99719444,"longitude":-75.7858056},"localSiteXY":[]},"note":[],"siteType":[],"siteProperty":[{"value":"ST","name":"siteTypeCd"},{"value":"02060005","name":"hucCd"},{"value":"24","name":"stateCd"},{"value":"24011","name":"countyCd"}]},"variable":{"variableCode":[{"value":"00010","network":"NWIS","vocabulary":"NWIS:UnitValues","variableID":45807042,"default":true}],"variableName":"Temperature, water, °C","variableDescription":"Temperature, water, degrees Celsius","valueType":"Derived Value","unit":{"unitCode":"deg C"},"options":{"option":[{"value":"Minimum","name":"Statistic","optionCode":"00002"}]},"note":[],"noDataValue":-999999.0,"variableProperty":[],"oid":"45807042"},"values":[{"value":[],"qualifier":[],"qualityControlLevel":[],"method":[{"methodDescription":"","methodID":68075}],"source":[],"offset":[],"sample":[],"censorCode":[]}],"name":"USGS:01491000:00010:00002"},{"sourceInfo":{"siteName":"CHOPTANK RIVER NEAR GREENSBORO, MD","siteCode":[{"value":"01491000","network":"NWIS","agencyCode":"USGS"}],"timeZoneInfo":{"defaultTimeZone":{"zoneOffset":"-05:00","zoneAbbreviation":"EST"},"daylightSavingsTimeZone":{"zoneOffset":"-04:00","zoneAbbreviation":"EDT"},"siteUsesDaylightSavingsTime":true},"geoLocation":{"geogLocation":{"srs":"EPSG:4326","latitude":38.99719444,"longitude":-75.7858056},"localSiteXY":[]},"note":[],"siteType":[],"siteProperty":[{"value":"ST","name":"siteTypeCd"},{"value":"02060005","name":"hucCd"},{"value":"24","name":"stateCd"},{"value":"24011","name":"countyCd"}]},"variable":{"variableCode":[{"value":"00010","network":"NWIS","vocabulary":"NWIS:UnitValues","variableID":45807042,"default":true}],"variableName":"Temperature, water, °C","variableDescription":"Temperature, water, degrees Celsius","valueType":"Derived Value","unit":{"unitCode":"deg C"},"options":{"option":[{"value":"Mean","name":"Statistic","optionCode":"00003"}]},"note":[],"noDataValue":-999999.0,"variableProperty":[],"oid":"45807042"},"values":[{"value":[],"qualifier":[],"qualityControlLevel":[],"method":[{"methodDescription":"","methodID":68076}],"source":[],"offset":[],"sample":[],"censorCode":[]}],"name":"USGS:01491000:00010:00003"},{"sourceInfo":{"siteName":"CHOPTANK RIVER NEAR GREENSBORO, MD","siteCode":[{"value":"01491000","network":"NWIS","agencyCode":"USGS"}],"timeZoneInfo":{"defaultTimeZone":{"zoneOffset":"-05:00","zoneAbbreviation":"EST"},"daylightSavingsTimeZone":{"zoneOffset":"-04:00","zoneAbbreviation":"EDT"},"siteUsesDaylightSavingsTime":true},"geoLocation":{"geogLocation":{"srs":"EPSG:4326","latitude":38.99719444,"longitude":-75.7858056},"localSiteXY":[]},"note":[],"siteType":[],"siteProperty":[{"value":"ST","name":"siteTypeCd"},{"value":"02060005","name":"hucCd"},{"value":"24","name":"stateCd"},{"value":"24011","name":"countyCd"}]},"variable":{"variableCode":[{"value":"00060","network":"NWIS","vocabulary":"NWIS:UnitValues","variableID":45807197,"default":true}],"variableName":"Streamflow, ft³/s","variableDescription":"Discharge, cubic feet per second","valueType":"Derived Value","unit":{"unitCode":"ft3/s"},"options":{"option":[{"value":"Mean","name":"Statistic","optionCode":"00003"}]},"note":[],"noDataValue":-999999.0,"variableProperty":[],"oid":"45807197"},"values":[{"value":[{"value":"466","qualifiers":["P"],"dateTime":"2020-02-14T00:00:00.000"},{"value":"362","qualifiers":["P"],"dateTime":"2020-02-15T00:00:00.000"}],"qualifier":[{"qualifierCode":"P","qualifierDescription":"Provisional data subject to revision.","qualifierID":0,"network":"NWIS","vocabulary":"uv_rmk_cd"}],"qualityControlLevel":[],"method":[{"methodDescription":"","methodID":68077}],"source":[],"offset":[],"sample":[],"censorCode":[]}],"name":"USGS:01491000:00060:00003"},{"sourceInfo":{"siteName":"CHOPTANK RIVER NEAR GREENSBORO, MD","siteCode":[{"value":"01491000","network":"NWIS","agencyCode":"USGS"}],"timeZoneInfo":{"defaultTimeZone":{"zoneOffset":"-05:00","zoneAbbreviation":"EST"},"daylightSavingsTimeZone":{"zoneOffset":"-04:00","zoneAbbreviation":"EDT"},"siteUsesDaylightSavingsTime":true},"geoLocation":{"geogLocation":{"srs":"EPSG:4326","latitude":38.99719444,"longitude":-75.7858056},"localSiteXY":[]},"note":[],"siteType":[],"siteProperty":[{"value":"ST","name":"siteTypeCd"},{"value":"02060005","name":"hucCd"},{"value":"24","name":"stateCd"},{"value":"24011","name":"countyCd"}]},"variable":{"variableCode":[{"value":"00095","network":"NWIS","vocabulary":"NWIS:UnitValues","variableID":45807295,"default":true}],"variableName":"Specific conductance, water, unfiltered, microsiemens per centimeter at 25°C","variableDescription":"Specific conductance, water, unfiltered, microsiemens per centimeter at 25 degrees Celsius","valueType":"Derived Value","unit":{"unitCode":"uS/cm @25C"},"options":{"option":[{"value":"Maximum","name":"Statistic","optionCode":"00001"}]},"note":[],"noDataValue":-999999.0,"variableProperty":[],"oid":"45807295"},"values":[{"value":[],"qualifier":[],"qualityControlLevel":[],"method":[{"methodDescription":"","methodID":68078}],"source":[],"offset":[],"sample":[],"censorCode":[]}],"name":"USGS:01491000:00095:00001"},{"sourceInfo":{"siteName":"CHOPTANK RIVER NEAR GREENSBORO, MD","siteCode":[{"value":"01491000","network":"NWIS","agencyCode":"USGS"}],"timeZoneInfo":{"defaultTimeZone":{"zoneOffset":"-05:00","zoneAbbreviation":"EST"},"daylightSavingsTimeZone":{"zoneOffset":"-04:00","zoneAbbreviation":"EDT"},"siteUsesDaylightSavingsTime":true},"geoLocation":{"geogLocation":{"srs":"EPSG:4326","latitude":38.99719444,"longitude":-75.7858056},"localSiteXY":[]},"note":[],"siteType":[],"siteProperty":[{"value":"ST","name":"siteTypeCd"},{"value":"02060005","name":"hucCd"},{"value":"24","name":"stateCd"},{"value":"24011","name":"countyCd"}]},"variable":{"variableCode":[{"value":"00095","network":"NWIS","vocabulary":"NWIS:UnitValues","variableID":45807295,"default":true}],"variableName":"Specific conductance, water, unfiltered, microsiemens per centimeter at 25°C","variableDescription":"Specific conductance, water, unfiltered, microsiemens per centimeter at 25 degrees Celsius","valueType":"Derived Value","unit":{"unitCode":"uS/cm @25C"},"options":{"option":[{"value":"Minimum","name":"Statistic","optionCode":"00002"}]},"note":[],"noDataValue":-999999.0,"variableProperty":[],"oid":"45807295"},"values":[{"value":[],"qualifier":[],"qualityControlLevel":[],"method":[{"methodDescription":"","methodID":68079}],"source":[],"offset":[],"sample":[],"censorCode":[]}],"name":"USGS:01491000:00095:00002"},{"sourceInfo":{"siteName":"CHOPTANK RIVER NEAR GREENSBORO, MD","siteCode":[{"value":"01491000","network":"NWIS","agencyCode":"USGS"}],"timeZoneInfo":{"defaultTimeZone":{"zoneOffset":"-05:00","zoneAbbreviation":"EST"},"daylightSavingsTimeZone":{"zoneOffset":"-04:00","zoneAbbreviation":"EDT"},"siteUsesDaylightSavingsTime":true},"geoLocation":{"geogLocation":{"srs":"EPSG:4326","latitude":38.99719444,"longitude":-75.7858056},"localSiteXY":[]},"note":[],"siteType":[],"siteProperty":[{"value":"ST","name":"siteTypeCd"},{"value":"02060005","name":"hucCd"},{"value":"24","name":"stateCd"},{"value":"24011","name":"countyCd"}]},"variable":{"variableCode":[{"value":"00095","network":"NWIS","vocabulary":"NWIS:UnitValues","variableID":45807295,"default":true}],"variableName":"Specific conductance, water, unfiltered, microsiemens per centimeter at 25°C","variableDescription":"Specific conductance, water, unfiltered, microsiemens per centimeter at 25 degrees Celsius","valueType":"Derived Value","unit":{"unitCode":"uS/cm @25C"},"options":{"option":[{"value":"Mean","name":"Statistic","optionCode":"00003"}]},"note":[],"noDataValue":-999999.0,"variableProperty":[],"oid":"45807295"},"values":[{"value":[],"qualifier":[],"qualityControlLevel":[],"method":[{"methodDescription":"","methodID":68080}],"source":[],"offset":[],"sample":[],"censorCode":[]}],"name":"USGS:01491000:00095:00003"},{"sourceInfo":{"siteName":"CHOPTANK RIVER NEAR GREENSBORO, MD","siteCode":[{"value":"01491000","network":"NWIS","agencyCode":"USGS"}],"timeZoneInfo":{"defaultTimeZone":{"zoneOffset":"-05:00","zoneAbbreviation":"EST"},"daylightSavingsTimeZone":{"zoneOffset":"-04:00","zoneAbbreviation":"EDT"},"siteUsesDaylightSavingsTime":true},"geoLocation":{"geogLocation":{"srs":"EPSG:4326","latitude":38.99719444,"longitude":-75.7858056},"localSiteXY":[]},"note":[],"siteType":[],"siteProperty":[{"value":"ST","name":"siteTypeCd"},{"value":"02060005","name":"hucCd"},{"value":"24","name":"stateCd"},{"value":"24011","name":"countyCd"}]},"variable":{"variableCode":[{"value":"80154","network":"NWIS","vocabulary":"NWIS:UnitValues","variableID":53196299,"default":true}],"variableName":"Suspended sediment concentration, mg/L","variableDescription":"Suspended sediment concentration, milligrams per liter","valueType":"Derived Value","unit":{"unitCode":"mg/l"},"options":{"option":[{"value":"Mean","name":"Statistic","optionCode":"00003"}]},"note":[],"noDataValue":-999999.0,"variableProperty":[],"oid":"53196299"},"values":[{"value":[],"qualifier":[],"qualityControlLevel":[],"method":[{"methodDescription":"","methodID":68081}],"source":[],"offset":[],"sample":[],"censorCode":[]}],"name":"USGS:01491000:80154:00003"},{"sourceInfo":{"siteName":"CHOPTANK RIVER NEAR GREENSBORO, MD","siteCode":[{"value":"01491000","network":"NWIS","agencyCode":"USGS"}],"timeZoneInfo":{"defaultTimeZone":{"zoneOffset":"-05:00","zoneAbbreviation":"EST"},"daylightSavingsTimeZone":{"zoneOffset":"-04:00","zoneAbbreviation":"EDT"},"siteUsesDaylightSavingsTime":true},"geoLocation":{"geogLocation":{"srs":"EPSG:4326","latitude":38.99719444,"longitude":-75.7858056},"localSiteXY":[]},"note":[],"siteType":[],"siteProperty":[{"value":"ST","name":"siteTypeCd"},{"value":"02060005","name":"hucCd"},{"value":"24","name":"stateCd"},{"value":"24011","name":"countyCd"}]},"variable":{"variableCode":[{"value":"80155","network":"NWIS","vocabulary":"NWIS:UnitValues","variableID":53196300,"default":true}],"variableName":"Suspended sediment discharge, tons/d","variableDescription":"Suspended sediment discharge, short tons per day","valueType":"Derived Value","unit":{"unitCode":"tons/day"},"options":{"option":[{"value":"Mean","name":"Statistic","optionCode":"00003"}]},"note":[],"noDataValue":-999999.0,"variableProperty":[],"oid":"53196300"},"values":[{"value":[],"qualifier":[],"qualityControlLevel":[],"method":[{"methodDescription":"","methodID":68082}],"source":[],"offset":[],"sample":[],"censorCode":[]}],"name":"USGS:01491000:80155:00003"},{"sourceInfo":{"siteName":"SENECA CREEK AT DAWSONVILLE, MD","siteCode":[{"value":"01645000","network":"NWIS","agencyCode":"USGS"}],"timeZoneInfo":{"defaultTimeZone":{"zoneOffset":"-05:00","zoneAbbreviation":"EST"},"daylightSavingsTimeZone":{"zoneOffset":"-04:00","zoneAbbreviation":"EDT"},"siteUsesDaylightSavingsTime":true},"geoLocation":{"geogLocation":{"srs":"EPSG:4326","latitude":39.1280833,"longitude":-77.33577778},"localSiteXY":[]},"note":[],"siteType":[],"siteProperty":[{"value":"ST","name":"siteTypeCd"},{"value":"02070008","name":"hucCd"},{"value":"24","name":"stateCd"},{"value":"24031","name":"countyCd"}]},"variable":{"variableCode":[{"value":"00060","network":"NWIS","vocabulary":"NWIS:UnitValues","variableID":45807197,"default":true}],"variableName":"Streamflow, ft³/s","variableDescription":"Discharge, cubic feet per second","valueType":"Derived Value","unit":{"unitCode":"ft3/s"},"options":{"option":[{"value":"Mean","name":"Statistic","optionCode":"00003"}]},"note":[],"noDataValue":-999999.0,"variableProperty":[],"oid":"45807197"},"values":[{"value":[{"value":"179","qualifiers":["P"],"dateTime":"2020-02-14T00:00:00.000"},{"value":"136","qualifiers":["P"],"dateTime":"2020-02-15T00:00:00.000"}],"qualifier":[{"qualifierCode":"P","qualifierDescription":"Provisional data subject to revision.","qualifierID":0,"network":"NWIS","vocabulary":"uv_rmk_cd"}],"qualityControlLevel":[],"method":[{"methodDescription":"","methodID":68476}],"source":[],"offset":[],"sample":[],"censorCode":[]}],"name":"USGS:01645000:00060:00003"}]},"nil":false,"globalScope":true,"typeSubstituted":false} \ No newline at end of file diff --git a/tests/data/waterservices_iv.txt b/tests/data/waterservices_iv.txt deleted file mode 100644 index e9a5311b3..000000000 --- a/tests/data/waterservices_iv.txt +++ /dev/null @@ -1 +0,0 @@ -{"name": "ns1:timeSeriesResponseType", "declaredType": "org.cuahsi.waterml.TimeSeriesResponseType", "scope": "javax.xml.bind.JAXBElement$GlobalScope", "value": {"queryInfo": {"queryURL": "http://nwis.waterservices.usgs.gov/nwis/iv/format=json&sites=01491000%2C01645000&startDT=2019-02-14&endDT=2020-02-15", "criteria": {"locationParam": "[ALL:01491000, ALL:01645000]", "variableParam": "ALL", "timeParam": {"beginDateTime": "2019-02-14T00:00:00.000", "endDateTime": "2020-02-15T23:59:59.000"}, "parameter": []}, "note": [{"value": "[ALL:01491000, ALL:01645000]", "title": "filter:sites"}, {"value": "[mode=RANGE, modifiedSince=null] interval={INTERVAL[2019-02-14T00:00:00.000-05:00/2020-02-15T23:59:59.000Z]}", "title": "filter:timeRange"}, {"value": "methodIds=[ALL]", "title": "filter:methodId"}, {"value": "2020-02-20T21:02:27.219Z", "title": "requestDT"}, {"value": "4ccb7720-5424-11ea-8fce-4cd98f8df011", "title": "requestId"}, {"value": "Provisional data are subject to revision. Go to http://waterdata.usgs.gov/nwis/help/?provisional for more information.", "title": "disclaimer"}, {"value": "nadww01", "title": "server"}]}, "timeSeries": [{"sourceInfo": {"siteName": "CHOPTANK RIVER NEAR GREENSBORO, MD", "siteCode": [{"value": "01491000", "network": "NWIS", "agencyCode": "USGS"}], "timeZoneInfo": {"defaultTimeZone": {"zoneOffset": "-05:00", "zoneAbbreviation": "EST"}, "daylightSavingsTimeZone": {"zoneOffset": "-04:00", "zoneAbbreviation": "EDT"}, "siteUsesDaylightSavingsTime": true}, "geoLocation": {"geogLocation": {"srs": "EPSG:4326", "latitude": 38.99719444, "longitude": -75.7858056}, "localSiteXY": []}, "note": [], "siteType": [], "siteProperty": [{"value": "ST", "name": "siteTypeCd"}, {"value": "02060005", "name": "hucCd"}, {"value": "24", "name": "stateCd"}, {"value": "24011", "name": "countyCd"}]}, "variable": {"variableCode": [{"value": "00060", "network": "NWIS", "vocabulary": "NWIS:UnitValues", "variableID": 45807197, "default": true}], "variableName": "Streamflow, ft³/s", "variableDescription": "Discharge, cubic feet per second", "valueType": "Derived Value", "unit": {"unitCode": "ft3/s"}, "options": {"option": [{"name": "Statistic", "optionCode": "00000"}]}, "note": [], "noDataValue": -999999.0, "variableProperty": [], "oid": "45807197"}, "values": [{"value": [{"value": "974", "qualifiers": ["A"], "dateTime": "2019-02-14T00:00:00.000-05:00"}, {"value": "974", "qualifiers": ["A"], "dateTime": "2019-02-14T00:15:00.000-05:00"}, {"value": "966", "qualifiers": ["A"], "dateTime": "2019-02-14T00:30:00.000-05:00"}, {"value": "963", "qualifiers": ["A"], "dateTime": "2019-02-14T00:45:00.000-05:00"}, {"value": "955", "qualifiers": ["A"], "dateTime": "2019-02-14T01:00:00.000-05:00"}], "qualifier": [{"qualifierCode": "A", "qualifierDescription": "Approved for publication -- Processing and review completed.", "qualifierID": 0, "network": "NWIS", "vocabulary": "uv_rmk_cd"}, {"qualifierCode": "P", "qualifierDescription": "Provisional data subject to revision.", "qualifierID": 1, "network": "NWIS", "vocabulary": "uv_rmk_cd"}], "qualityControlLevel": [], "method": [{"methodDescription": "", "methodID": 69512}], "source": [], "offset": [], "sample": [], "censorCode": []}], "name": "USGS:01491000:00060:00000"}, {"sourceInfo": {"siteName": "CHOPTANK RIVER NEAR GREENSBORO, MD", "siteCode": [{"value": "01491000", "network": "NWIS", "agencyCode": "USGS"}], "timeZoneInfo": {"defaultTimeZone": {"zoneOffset": "-05:00", "zoneAbbreviation": "EST"}, "daylightSavingsTimeZone": {"zoneOffset": "-04:00", "zoneAbbreviation": "EDT"}, "siteUsesDaylightSavingsTime": true}, "geoLocation": {"geogLocation": {"srs": "EPSG:4326", "latitude": 38.99719444, "longitude": -75.7858056}, "localSiteXY": []}, "note": [], "siteType": [], "siteProperty": [{"value": "ST", "name": "siteTypeCd"}, {"value": "02060005", "name": "hucCd"}, {"value": "24", "name": "stateCd"}, {"value": "24011", "name": "countyCd"}]}, "variable": {"variableCode": [{"value": "00065", "network": "NWIS", "vocabulary": "NWIS:UnitValues", "variableID": 45807202, "default": true}], "variableName": "Gage height, ft", "variableDescription": "Gage height, feet", "valueType": "Derived Value", "unit": {"unitCode": "ft"}, "options": {"option": [{"name": "Statistic", "optionCode": "00000"}]}, "note": [], "noDataValue": -999999.0, "variableProperty": [], "oid": "45807202"}, "values": [{"value": [{"value": "6.48", "qualifiers": ["A"], "dateTime": "2019-02-14T00:00:00.000-05:00"}, {"value": "6.48", "qualifiers": ["A"], "dateTime": "2019-02-14T00:15:00.000-05:00"}, {"value": "6.46", "qualifiers": ["A"], "dateTime": "2019-02-14T00:30:00.000-05:00"}, {"value": "6.45", "qualifiers": ["A"], "dateTime": "2019-02-14T00:45:00.000-05:00"}, {"value": "6.43", "qualifiers": ["A"], "dateTime": "2019-02-14T01:00:00.000-05:00"}], "qualifier": [{"qualifierCode": "A", "qualifierDescription": "Approved for publication -- Processing and review completed.", "qualifierID": 0, "network": "NWIS", "vocabulary": "uv_rmk_cd"}, {"qualifierCode": "P", "qualifierDescription": "Provisional data subject to revision.", "qualifierID": 1, "network": "NWIS", "vocabulary": "uv_rmk_cd"}], "qualityControlLevel": [], "method": [{"methodDescription": "", "methodID": 69513}], "source": [], "offset": [], "sample": [], "censorCode": []}], "name": "USGS:01491000:00065:00000"}, {"sourceInfo": {"siteName": "SENECA CREEK AT DAWSONVILLE, MD", "siteCode": [{"value": "01645000", "network": "NWIS", "agencyCode": "USGS"}], "timeZoneInfo": {"defaultTimeZone": {"zoneOffset": "-05:00", "zoneAbbreviation": "EST"}, "daylightSavingsTimeZone": {"zoneOffset": "-04:00", "zoneAbbreviation": "EDT"}, "siteUsesDaylightSavingsTime": true}, "geoLocation": {"geogLocation": {"srs": "EPSG:4326", "latitude": 39.1280833, "longitude": -77.33577778}, "localSiteXY": []}, "note": [], "siteType": [], "siteProperty": [{"value": "ST", "name": "siteTypeCd"}, {"value": "02070008", "name": "hucCd"}, {"value": "24", "name": "stateCd"}, {"value": "24031", "name": "countyCd"}]}, "variable": {"variableCode": [{"value": "00060", "network": "NWIS", "vocabulary": "NWIS:UnitValues", "variableID": 45807197, "default": true}], "variableName": "Streamflow, ft³/s", "variableDescription": "Discharge, cubic feet per second", "valueType": "Derived Value", "unit": {"unitCode": "ft3/s"}, "options": {"option": [{"name": "Statistic", "optionCode": "00000"}]}, "note": [], "noDataValue": -999999.0, "variableProperty": [], "oid": "45807197"}, "values": [{"value": [{"value": "474", "qualifiers": ["A"], "dateTime": "2019-02-14T00:00:00.000-05:00"}, {"value": "474", "qualifiers": ["A"], "dateTime": "2019-02-14T00:05:00.000-05:00"}, {"value": "469", "qualifiers": ["A"], "dateTime": "2019-02-14T00:10:00.000-05:00"}, {"value": "474", "qualifiers": ["A"], "dateTime": "2019-02-14T00:15:00.000-05:00"}, {"value": "474", "qualifiers": ["A"], "dateTime": "2019-02-14T00:20:00.000-05:00"}], "qualifier": [{"qualifierCode": "A", "qualifierDescription": "Approved for publication -- Processing and review completed.", "qualifierID": 0, "network": "NWIS", "vocabulary": "uv_rmk_cd"}, {"qualifierCode": "P", "qualifierDescription": "Provisional data subject to revision.", "qualifierID": 1, "network": "NWIS", "vocabulary": "uv_rmk_cd"}], "qualityControlLevel": [], "method": [{"methodDescription": "", "methodID": 69925}], "source": [], "offset": [], "sample": [], "censorCode": []}], "name": "USGS:01645000:00060:00000"}, {"sourceInfo": {"siteName": "SENECA CREEK AT DAWSONVILLE, MD", "siteCode": [{"value": "01645000", "network": "NWIS", "agencyCode": "USGS"}], "timeZoneInfo": {"defaultTimeZone": {"zoneOffset": "-05:00", "zoneAbbreviation": "EST"}, "daylightSavingsTimeZone": {"zoneOffset": "-04:00", "zoneAbbreviation": "EDT"}, "siteUsesDaylightSavingsTime": true}, "geoLocation": {"geogLocation": {"srs": "EPSG:4326", "latitude": 39.1280833, "longitude": -77.33577778}, "localSiteXY": []}, "note": [], "siteType": [], "siteProperty": [{"value": "ST", "name": "siteTypeCd"}, {"value": "02070008", "name": "hucCd"}, {"value": "24", "name": "stateCd"}, {"value": "24031", "name": "countyCd"}]}, "variable": {"variableCode": [{"value": "00065", "network": "NWIS", "vocabulary": "NWIS:UnitValues", "variableID": 45807202, "default": true}], "variableName": "Gage height, ft", "variableDescription": "Gage height, feet", "valueType": "Derived Value", "unit": {"unitCode": "ft"}, "options": {"option": [{"name": "Statistic", "optionCode": "00000"}]}, "note": [], "noDataValue": -999999.0, "variableProperty": [], "oid": "45807202"}, "values": [{"value": [{"value": "3.13", "qualifiers": ["A"], "dateTime": "2019-02-14T00:00:00.000-05:00"}, {"value": "3.13", "qualifiers": ["A"], "dateTime": "2019-02-14T00:05:00.000-05:00"}, {"value": "3.12", "qualifiers": ["A"], "dateTime": "2019-02-14T00:10:00.000-05:00"}, {"value": "3.13", "qualifiers": ["A"], "dateTime": "2019-02-14T00:15:00.000-05:00"}, {"value": "3.13", "qualifiers": ["A"], "dateTime": "2019-02-14T00:20:00.000-05:00"}], "qualifier": [{"qualifierCode": "A", "qualifierDescription": "Approved for publication -- Processing and review completed.", "qualifierID": 0, "network": "NWIS", "vocabulary": "uv_rmk_cd"}, {"qualifierCode": "P", "qualifierDescription": "Provisional data subject to revision.", "qualifierID": 1, "network": "NWIS", "vocabulary": "uv_rmk_cd"}], "qualityControlLevel": [], "method": [{"methodDescription": "", "methodID": 69926}], "source": [], "offset": [], "sample": [], "censorCode": []}], "name": "USGS:01645000:00065:00000"}]}, "nil": false, "globalScope": true, "typeSubstituted": false} \ No newline at end of file diff --git a/tests/data/waterservices_peaks.txt b/tests/data/waterservices_peaks.txt deleted file mode 100755 index 5943a320a..000000000 --- a/tests/data/waterservices_peaks.txt +++ /dev/null @@ -1,94 +0,0 @@ -# -# U.S. Geological Survey -# National Water Information System -# Retrieved: 2020-02-20 16:35:50 EST -# -# ---------------------------------- WARNING ---------------------------------------- -# Some of the data that you have obtained from this U.S. Geological Survey database -# may not have received Director's approval. Any such data values are qualified -# as provisional and are subject to revision. Provisional data are released on the -# condition that neither the USGS nor the United States Government may be held liable -# for any damages resulting from its use. -# -# More data may be available offline. -# For more information on these data, contact USGS Water Data Inquiries. -# This file contains the annual peak streamflow data. -# -# This information includes the following fields: -# -# agency_cd Agency Code -# site_no USGS station number -# peak_dt Date of peak streamflow (format YYYY-MM-DD) -# peak_tm Time of peak streamflow (24 hour format, 00:00 - 23:59) -# peak_va Annual peak streamflow value in cfs -# peak_cd Peak Discharge-Qualification codes (see explanation below) -# gage_ht Gage height for the associated peak streamflow in feet -# gage_ht_cd Gage height qualification codes -# year_last_pk Peak streamflow reported is the highest since this year -# ag_dt Date of maximum gage-height for water year (if not concurrent with peak) -# ag_tm Time of maximum gage-height for water year (if not concurrent with peak -# ag_gage_ht maximum Gage height for water year in feet (if not concurrent with peak -# ag_gage_ht_cd maximum Gage height code -# -# Sites in this file include: -# USGS 01594440 PATUXENT RIVER NEAR BOWIE, MD -# -# Peak Streamflow-Qualification Codes(peak_cd): -# 1 ... Discharge is a Maximum Daily Average -# 2 ... Discharge is an Estimate -# 3 ... Discharge affected by Dam Failure -# 4 ... Discharge less than indicated value, -# which is Minimum Recordable Discharge at this site -# 5 ... Discharge affected to unknown degree by -# Regulation or Diversion -# 6 ... Discharge affected by Regulation or Diversion -# 7 ... Discharge is an Historic Peak -# 8 ... Discharge actually greater than indicated value -# 9 ... Discharge due to Snowmelt, Hurricane, -# Ice-Jam or Debris Dam breakup -# A ... Year of occurrence is unknown or not exact -# Bd ... Day of occurrence is unknown or not exact -# Bm ... Month of occurrence is unknown or not exact -# C ... All or part of the record affected by Urbanization, -# Mining, Agricultural changes, Channelization, or other -# F ... Peak supplied by another agency -# O ... Opportunistic value not from systematic data collection -# R ... Revised -# -# Gage height qualification codes(gage_ht_cd,ag_gage_ht_cd): -# 1 ... Gage height affected by backwater -# 2 ... Gage height not the maximum for the year -# 3 ... Gage height at different site and(or) datum -# 4 ... Gage height below minimum recordable elevation -# 5 ... Gage height is an estimate -# 6 ... Gage datum changed during this year -# 7 ... Debris, mud, or hyper-concentrated flow -# 8 ... Gage height tidally affected -# Bd ... Day of occurrence is unknown or not exact -# Bm ... Month of occurrence is unknown or not exact -# F ... Peak supplied by another agency -# R ... Revised -# -# -agency_cd site_no peak_dt peak_tm peak_va peak_cd gage_ht gage_ht_cd year_last_pk ag_dt ag_tm ag_gage_ht ag_gage_ht_cd -5s 15s 10d 6s 8s 33s 8s 27s 4s 10d 6s 8s 27s -USGS 01594440 2000-03-22 3640 5 11.90 -USGS 01594440 2001-06-08 06:30 3800 5 12.05 -USGS 01594440 2002-04-29 1510 2,5,8 -USGS 01594440 2003-02-23 19:30 6990 5 15.08 -USGS 01594440 2003-12-12 10:45 5790 5 13.99 -USGS 01594440 2005-04-03 19:15 5210 5 13.42 -USGS 01594440 2006-06-26 23:00 12700 5 19.20 -USGS 01594440 2007-04-16 11:15 5520 5 13.73 -USGS 01594440 2008-05-13 02:00 7860 5 15.80 -USGS 01594440 2009-06-19 05:45 4130 5 12.35 -USGS 01594440 2010-03-14 13:00 5780 5 13.98 -USGS 01594440 2011-09-08 13:15 16800 5 21.10 -USGS 01594440 2011-12-08 20:30 4900 5 13.74 -USGS 01594440 2012-10-30 23:00 10800 5 18.02 -USGS 01594440 2014-05-01 17:30 15600 5 20.56 -USGS 01594440 2015-06-28 18:15 6610 5 15.03 -USGS 01594440 2016-08-01 00:30 6140 5 14.64 -USGS 01594440 2017-07-30 01:15 4960 5 13.60 -USGS 01594440 2018-06-04 18:30 8360 5 16.32 -USGS 01594440 2018-12-16 23:30 7220 5 15.50 diff --git a/tests/data/waterservices_ratings.txt b/tests/data/waterservices_ratings.txt deleted file mode 100755 index 9964bb7a9..000000000 --- a/tests/data/waterservices_ratings.txt +++ /dev/null @@ -1,47 +0,0 @@ -# //UNITED STATES GEOLOGICAL SURVEY http://water.usgs.gov/ -# //NATIONAL WATER INFORMATION SYSTEM http://water.usgs.gov/data.html -# //DATA ARE PROVISIONAL AND SUBJECT TO CHANGE UNTIL PUBLISHED BY USGS -# //RETRIEVED: 2018-02-28 01:11:02 -# //WARNING -# //WARNING The stage-discharge rating provided in this file should be -# //WARNING considered provisional and subject to change. Stage-discharge -# //WARNING ratings change over time as the channel features that control -# //WARNING the relation between stage and discharge vary. Users are -# //WARNING cautioned to consider carefully the applicability of this -# //WARNING rating before using it for decisions that concern personal or -# //WARNING public safety or operational consequences. -# //WARNING -# //WARNING This rating does not include any shifts that may have been -# //WARNING used along with this base rating in converting stage to -# //WARNING discharge at this site. Stage data processed with the rating -# //WARNING thus may not match that displayed or published by the USGS. -# //WARNING -# //FILE TYPE="NWIS RATING" -# //DATABASE NUMBER=01 DESCRIPTION=" Standard data base for this site." -# //STATION AGENCY="USGS " NUMBER="01594440 " TIME_ZONE="EST" DST_FLAG=N -# //STATION NAME="PATUXENT RIVER NEAR BOWIE, MD" -# //LABEL="Discharge ft^3/s" -# //PARAMETER CODE="00060" -# //RATING ID="20.0" TYPE="STGQ" NAME="stage-discharge" AGING=Working -# //RATING REMARKS="" -# //RATING EXPANSION="logarithmic" -# //RATING OFFSET1=2.000000E+00 -# //RATING_INDEP ROUNDING="????" PARAMETER="Gage height (ft)" -# //RATING_DEP ROUNDING="????" PARAMETER="Discharge (ft^3/s)" -# //RATING_DATETIME BEGIN=20151001000000 BZONE=-05:00 END=20170206000000 EZONE=-05:00 AGING=None -# //RATING_DATETIME COMMENT="Adjust high end to Meas 32C. Begin on WY change" -# //RATING_DATETIME BEGIN=20170206000000 BZONE=-05:00 END=-------------- EZONE=--- AGING=None -# //RATING_DATETIME COMMENT="Adjust high end to Meas 32C. Begin on WY change" -INDEP DEP STOR -16N 16N 1S -2.9900000E+00 3.0000000E+01 * -4.0000000E+00 1.1000000E+02 * -5.0000000E+00 2.2500000E+02 * -5.5000000E+00 3.0000000E+02 * -6.0000000E+00 3.9000000E+02 * -6.5000000E+00 4.9000000E+02 * -7.0000000E+00 6.0000000E+02 * -9.0000000E+00 1.1750000E+03 * -1.3000000E+01 4.3500000E+03 * -2.0850000E+01 1.6497750E+04 * -2.7900000E+01 3.1100000E+04 * diff --git a/tests/data/waterservices_site.txt b/tests/data/waterservices_site.txt deleted file mode 100755 index ce47a512a..000000000 --- a/tests/data/waterservices_site.txt +++ /dev/null @@ -1,33 +0,0 @@ -# -# -# US Geological Survey -# retrieved: 2020-02-14 13:17:02 -05:00 (sdas01) -# -# The Site File stores location and general information about groundwater, -# surface water, and meteorological sites -# for sites in USA. -# -# File-format description: http://help.waterdata.usgs.gov/faq/about-tab-delimited-output -# Automated-retrieval info: https://waterservices.usgs.gov/docs/site-service/site-service-details/ -# -# Contact: gs-w_support_nwisweb@usgs.gov -# -# The following selected fields are included in this output: -# -# agency_cd -- Agency -# site_no -- Site identification number -# station_nm -- Site name -# site_tp_cd -- Site type -# dec_lat_va -- Decimal latitude -# dec_long_va -- Decimal longitude -# coord_acy_cd -- Latitude-longitude accuracy -# dec_coord_datum_cd -- Decimal Latitude-longitude datum -# alt_va -- Altitude of Gage/land surface -# alt_acy_va -- Altitude accuracy -# alt_datum_cd -- Altitude datum -# huc_cd -- Hydrologic unit code -# -agency_cd site_no station_nm site_tp_cd dec_lat_va dec_long_va coord_acy_cd dec_coord_datum_cd alt_va alt_acy_va alt_datum_cd huc_cd -5s 15s 50s 7s 16s 16s 1s 10s 8s 3s 10s 16s -USGS 01491000 CHOPTANK RIVER NEAR GREENSBORO, MD ST 38.99719444 -75.7858056 S NAD83 2.73 .1 NAVD88 02060005 -USGS 01645000 SENECA CREEK AT DAWSONVILLE, MD ST 39.1280833 -77.33577778 S NAD83 213.31 .1 NAVD88 02070008 diff --git a/tests/data/waterservices_stats.txt b/tests/data/waterservices_stats.txt deleted file mode 100755 index 863a65bfc..000000000 --- a/tests/data/waterservices_stats.txt +++ /dev/null @@ -1,2222 +0,0 @@ -# -# -# US Geological Survey, Water Resources Data -# retrieved: 2020-03-06 14:13:37 -05:00 (natwebcaas01) -# -# This file contains USGS Daily Statistics -# -# Note:The statistics generated are based on approved daily-mean data and may not match those published by the USGS in official publications. -# The user is responsible for assessment and use of statistics from this site. -# For more details on why the statistics may not match, visit http://help.waterdata.usgs.gov/faq/about-statistics. -# -# Data heading explanations. -# agency_cd -- agency code -# site_no -- Site identification number -# parameter_cd -- Parameter code -# station_nm -- Site name -# loc_web_ds -- Additional measurement description -# -# Data for the following 2 site(s) are contained in this file -# agency_cd site_no parameter_cd station_nm (loc_web_ds) -# USGS 01491000 00010 CHOPTANK RIVER NEAR GREENSBORO, MD -# USGS 01491000 00060 CHOPTANK RIVER NEAR GREENSBORO, MD -# USGS 01491000 00095 CHOPTANK RIVER NEAR GREENSBORO, MD -# USGS 01491000 80154 CHOPTANK RIVER NEAR GREENSBORO, MD -# USGS 01491000 80155 CHOPTANK RIVER NEAR GREENSBORO, MD -# USGS 01645000 00060 SENECA CREEK AT DAWSONVILLE, MD -# -# Explanation of Parameter Codes -# parameter_cd Parameter Name -# 00010 Temperature, water, degrees Celsius -# 00060 Discharge, cubic feet per second -# 00095 Specific conductance, water, unfiltered, microsiemens per centimeter at 25 degrees Celsius -# 80154 Suspended sediment concentration, milligrams per liter -# 80155 Suspended sediment discharge, short tons per day -# -# Data heading explanations. -# month_nu ... The month for which the statistics apply. -# day_nu ... The day for which the statistics apply. -# begin_yr ... First water year of data of daily mean values for this day. -# end_yr ... Last water year of data of daily mean values for this day. -# count_nu ... Number of values used in the calculation. -# max_va_yr ... Water year in which the maximum value occurred. -# max_va ... Maximum of daily mean values for this day. -# min_va_yr ... Water year in which the minimum value occurred. -# min_va ... Minimum of daily mean values for this day. -# mean_va ... Mean of daily mean values for this day. -# p05_va ... 05 percentile of daily mean values for this day. -# p10_va ... 10 percentile of daily mean values for this day. -# p20_va ... 20 percentile of daily mean values for this day. -# p25_va ... 25 percentile of daily mean values for this day. -# p50_va ... 50 percentile (median) of daily mean values for this day. -# p75_va ... 75 percentile of daily mean values for this day. -# p80_va ... 80 percentile of daily mean values for this day. -# p90_va ... 90 percentile of daily mean values for this day. -# p95_va ... 95 percentile of daily mean values for this day. -# -agency_cd site_no parameter_cd ts_id loc_web_ds month_nu day_nu begin_yr end_yr count_nu max_va_yr max_va min_va_yr min_va mean_va p05_va p10_va p20_va p25_va p50_va p75_va p80_va p90_va p95_va -5s 15s 5s 10n 15s 3n 3n 6n 6n 8n 5n 12s 5n 12s 12s 12s 12s 12s 12s 12s 12s 12s 12s 12s -USGS 01491000 00010 68076 1 1 2011 2012 2 2012 7.7 2011 2.8 5.3 5.3 -USGS 01491000 00010 68076 1 2 2011 2012 2 2012 7.3 2011 4.4 5.8 5.8 -USGS 01491000 00010 68076 1 3 2011 2012 2 2012 4.6 2011 3.2 3.9 3.9 -USGS 01491000 00010 68076 1 4 2011 2012 2 2011 2.5 2012 1.8 2.1 2.1 -USGS 01491000 00010 68076 1 5 2011 2012 2 2011 2.5 2012 2.3 2.4 2.4 -USGS 01491000 00010 68076 1 6 2011 2012 2 2012 3.5 2011 2.2 2.9 2.9 -USGS 01491000 00010 68076 1 7 2011 2012 2 2012 5.1 2011 2.9 4 4 -USGS 01491000 00010 68076 1 8 2011 2012 2 2012 6.0 2011 2.3 4.2 4.2 -USGS 01491000 00010 68076 1 9 2011 2012 2 2012 5.2 2011 0.9 3.1 3.1 -USGS 01491000 00010 68076 1 10 2011 2012 2 2012 5.1 2011 0.7 2.9 2.9 -USGS 01491000 00010 68076 1 11 2011 2012 2 2012 5.1 2011 0.7 2.9 2.9 -USGS 01491000 00010 68076 1 12 2011 2012 2 2012 7.5 2011 0.9 4.2 4.2 -USGS 01491000 00010 68076 1 13 2011 2012 2 2012 7.9 2011 0.7 4.3 4.3 -USGS 01491000 00010 68076 1 14 2011 2012 2 2012 4.8 2011 0.5 2.7 2.7 -USGS 01491000 00010 68076 1 15 2011 2012 2 2012 3.0 2011 0.8 1.9 1.9 -USGS 01491000 00010 68076 1 16 2011 2012 2 2011 1.8 2011 1.8 1.8 1.8 -USGS 01491000 00010 68076 1 17 2011 2012 2 2012 3.9 2011 1.6 2.8 2.8 -USGS 01491000 00010 68076 1 18 2011 2012 2 2012 5.9 2011 2.3 4.1 4.1 -USGS 01491000 00010 68076 1 19 2011 2012 2 2012 4.1 2011 2.6 3.3 3.3 -USGS 01491000 00010 68076 1 20 2011 2012 2 2012 4.0 2011 3.0 3.5 3.5 -USGS 01491000 00010 68076 1 21 2011 2012 2 2011 3.3 2012 3.1 3.2 3.2 -USGS 01491000 00010 68076 1 22 2011 2012 2 2012 2.8 2011 1.1 2 2 -USGS 01491000 00010 68076 1 23 2011 2012 2 2012 3.8 2011 0.2 2 2 -USGS 01491000 00010 68076 1 24 2011 2012 2 2012 6.9 2011 0.1 3.5 3.5 -USGS 01491000 00010 68076 1 25 2011 2012 2 2012 6.9 2011 0.7 3.8 3.8 -USGS 01491000 00010 68076 1 26 2011 2012 2 2012 7.3 2011 1.5 4.4 4.4 -USGS 01491000 00010 68076 1 27 2011 2012 2 2012 9.4 2011 0.9 5.2 5.2 -USGS 01491000 00010 68076 1 28 2011 2012 2 2012 8.4 2011 1.0 4.7 4.7 -USGS 01491000 00010 68076 1 29 2011 2012 2 2012 6.9 2011 2.0 4.5 4.5 -USGS 01491000 00010 68076 1 30 2011 2012 2 2012 5.7 2011 2.5 4.1 4.1 -USGS 01491000 00010 68076 1 31 2011 2012 2 2012 5.7 2011 2.4 4 4 -USGS 01491000 00010 68076 2 1 2011 2012 2 2012 7.6 2011 2.6 5.1 5.1 -USGS 01491000 00010 68076 2 2 2011 2012 2 2012 9.0 2011 3.6 6.3 6.3 -USGS 01491000 00010 68076 2 3 2011 2012 2 2012 7.8 2011 2.9 5.3 5.3 -USGS 01491000 00010 68076 2 4 2011 2012 2 2012 6.5 2011 2.2 4.3 4.3 -USGS 01491000 00010 68076 2 5 2011 2012 2 2012 6.4 2011 3.3 4.8 4.8 -USGS 01491000 00010 68076 2 6 2011 2012 2 2012 5.5 2011 4.4 4.9 4.9 -USGS 01491000 00010 68076 2 7 2011 2012 2 2012 5.9 2011 4.7 5.3 5.3 -USGS 01491000 00010 68076 2 8 2011 2012 2 2012 5.8 2011 5.4 5.6 5.6 -USGS 01491000 00010 68076 2 9 2011 2012 2 2012 5.7 2011 2.6 4.2 4.2 -USGS 01491000 00010 68076 2 10 2011 2012 2 2012 5.6 2011 2.4 4 4 -USGS 01491000 00010 68076 2 11 2011 2012 2 2012 5.9 2011 1.7 3.8 3.8 -USGS 01491000 00010 68076 2 12 2011 2012 2 2012 3.6 2011 2.4 3 3 -USGS 01491000 00010 68076 2 13 2011 2012 2 2011 3.6 2012 2.6 3.1 3.1 -USGS 01491000 00010 68076 2 14 2011 2012 2 2011 5.3 2012 4.0 4.7 4.7 -USGS 01491000 00010 68076 2 15 2011 2012 2 2012 6.1 2011 5.5 5.8 5.8 -USGS 01491000 00010 68076 2 16 2011 2012 2 2012 6.6 2011 4.5 5.5 5.5 -USGS 01491000 00010 68076 2 17 2011 2012 2 2012 7.8 2011 6.3 7 7 -USGS 01491000 00010 68076 2 18 2011 2012 2 2011 8.8 2012 7.5 8.2 8.2 -USGS 01491000 00010 68076 2 19 2011 2012 2 2011 8.9 2012 7.4 8.2 8.2 -USGS 01491000 00010 68076 2 20 2011 2012 2 2012 7.1 2011 6.6 6.8 6.8 -USGS 01491000 00010 68076 2 21 2011 2012 2 2012 6.3 2011 6.1 6.2 6.2 -USGS 01491000 00010 68076 2 22 2011 2012 2 2012 7.6 2011 3.7 5.7 5.7 -USGS 01491000 00010 68076 2 23 2011 2011 1 2011 3.1 2011 3.1 3.1 3.1 -USGS 01491000 00010 68076 2 24 2011 2012 2 2012 10.6 2011 3.7 7.2 7.2 -USGS 01491000 00010 68076 2 25 2011 2012 2 2012 8.7 2011 6.3 7.5 7.5 -USGS 01491000 00010 68076 2 26 2011 2012 2 2012 6.6 2011 6.4 6.5 6.5 -USGS 01491000 00010 68076 2 27 2011 2012 2 2011 7.1 2012 6.9 7 7 -USGS 01491000 00010 68076 2 28 2011 2012 2 2011 9.1 2012 8.3 8.7 8.7 -USGS 01491000 00010 68076 2 29 2012 2012 1 2012 8.0 2012 8.0 8 8 -USGS 01491000 00010 68076 3 1 2011 2012 2 2012 10.0 2011 8.9 9.4 9.4 -USGS 01491000 00010 68076 3 2 2011 2012 2 2012 10.2 2011 7.7 8.9 8.9 -USGS 01491000 00010 68076 3 3 2011 2012 2 2012 10.0 2011 6.5 8.2 8.2 -USGS 01491000 00010 68076 3 4 2011 2012 2 2012 9.6 2011 5.9 7.8 7.8 -USGS 01491000 00010 68076 3 5 2011 2012 2 2011 7.7 2012 7.5 7.6 7.6 -USGS 01491000 00010 68076 3 6 2011 2012 2 2011 10.2 2012 6.2 8.2 8.2 -USGS 01491000 00010 68076 3 7 2011 2012 2 2011 9.9 2012 7.6 8.8 8.8 -USGS 01491000 00010 68076 3 8 2011 2012 2 2012 11.0 2011 8.4 9.7 9.7 -USGS 01491000 00010 68076 3 9 2011 2012 2 2012 12.6 2011 7.7 10.2 10.2 -USGS 01491000 00010 68076 3 10 2011 2012 2 2012 10.0 2011 8.7 9.3 9.3 -USGS 01491000 00010 68076 3 11 2011 2012 2 2011 10.4 2012 9.0 9.7 9.7 -USGS 01491000 00010 68076 3 12 2011 2012 2 2012 10.4 2011 9.9 10.2 10.2 -USGS 01491000 00010 68076 3 13 2011 2012 2 2012 13.6 2011 10.2 11.9 11.9 -USGS 01491000 00010 68076 3 14 2011 2012 2 2012 15.7 2011 9.4 12.6 12.6 -USGS 01491000 00010 68076 3 15 2011 2012 2 2012 16.0 2011 8.9 12.4 12.4 -USGS 01491000 00010 68076 3 16 2011 2012 2 2012 15.2 2011 9.9 12.6 12.6 -USGS 01491000 00010 68076 3 17 2012 2012 1 2012 14.8 2012 14.8 14.8 14.8 -USGS 01491000 00010 68076 3 18 2012 2012 1 2012 15.4 2012 15.4 15.4 15.4 -USGS 01491000 00010 68076 3 19 2012 2012 1 2012 16.0 2012 16.0 16 16 -USGS 01491000 00010 68076 3 20 2012 2012 1 2012 17.1 2012 17.1 17.1 17.1 -USGS 01491000 00010 68076 3 21 2012 2012 1 2012 17.8 2012 17.8 17.8 17.8 -USGS 01491000 00010 68076 3 22 2012 2012 1 2012 18.3 2012 18.3 18.3 18.3 -USGS 01491000 00010 68076 3 23 2012 2012 1 2012 18.9 2012 18.9 18.9 18.9 -USGS 01491000 00010 68076 3 24 2012 2012 1 2012 17.8 2012 17.8 17.8 17.8 -USGS 01491000 00010 68076 3 25 2012 2012 1 2012 15.5 2012 15.5 15.5 15.5 -USGS 01491000 00010 68076 3 26 2012 2012 1 2012 14.5 2012 14.5 14.5 14.5 -USGS 01491000 00010 68076 3 27 2012 2012 1 2012 12.1 2012 12.1 12.1 12.1 -USGS 01491000 00010 68076 3 28 2012 2012 1 2012 12.1 2012 12.1 12.1 12.1 -USGS 01491000 00010 68076 3 29 2012 2012 1 2012 13.9 2012 13.9 13.9 13.9 -USGS 01491000 00010 68076 3 30 2012 2012 1 2012 12.2 2012 12.2 12.2 12.2 -USGS 01491000 00010 68076 3 31 2012 2012 1 2012 11.5 2012 11.5 11.5 11.5 -USGS 01491000 00010 68076 4 1 2012 2012 1 2012 11.8 2012 11.8 11.8 11.8 -USGS 01491000 00010 68076 4 2 2012 2012 1 2012 13.0 2012 13.0 13 13 -USGS 01491000 00010 68076 4 3 2012 2012 1 2012 13.0 2012 13.0 13 13 -USGS 01491000 00010 68076 4 4 2012 2012 1 2012 14.7 2012 14.7 14.7 14.7 -USGS 01491000 00010 68076 4 5 2012 2012 1 2012 15.0 2012 15.0 15 15 -USGS 01491000 00010 68076 4 6 2012 2012 1 2012 14.0 2012 14.0 14 14 -USGS 01491000 00010 68076 4 7 2012 2012 1 2012 13.5 2012 13.5 13.5 13.5 -USGS 01491000 00010 68076 4 8 2012 2012 1 2012 13.5 2012 13.5 13.5 13.5 -USGS 01491000 00010 68076 4 9 2012 2012 1 2012 14.2 2012 14.2 14.2 14.2 -USGS 01491000 00010 68076 4 10 2012 2012 1 2012 14.4 2012 14.4 14.4 14.4 -USGS 01491000 00010 68076 4 11 2012 2012 1 2012 13.5 2012 13.5 13.5 13.5 -USGS 01491000 00010 68076 4 12 2012 2012 1 2012 12.7 2012 12.7 12.7 12.7 -USGS 01491000 00010 68076 4 13 2012 2012 1 2012 13.1 2012 13.1 13.1 13.1 -USGS 01491000 00010 68076 4 14 2012 2012 1 2012 13.9 2012 13.9 13.9 13.9 -USGS 01491000 00010 68076 4 15 2012 2012 1 2012 16.5 2012 16.5 16.5 16.5 -USGS 01491000 00010 68076 4 16 2012 2012 1 2012 19.1 2012 19.1 19.1 19.1 -USGS 01491000 00010 68076 4 17 2012 2012 1 2012 20.4 2012 20.4 20.4 20.4 -USGS 01491000 00010 68076 4 18 2012 2012 1 2012 18.0 2012 18.0 18 18 -USGS 01491000 00010 68076 4 19 2012 2012 1 2012 17.1 2012 17.1 17.1 17.1 -USGS 01491000 00010 68076 4 20 2012 2012 1 2012 16.9 2012 16.9 16.9 16.9 -USGS 01491000 00010 68076 4 21 2012 2012 1 2012 18.2 2012 18.2 18.2 18.2 -USGS 01491000 00010 68076 4 22 2012 2012 1 2012 17.1 2012 17.1 17.1 17.1 -USGS 01491000 00010 68076 4 23 2012 2012 1 2012 13.5 2012 13.5 13.5 13.5 -USGS 01491000 00010 68076 4 24 2012 2012 1 2012 12.2 2012 12.2 12.2 12.2 -USGS 01491000 00010 68076 4 25 2012 2012 1 2012 13.3 2012 13.3 13.3 13.3 -USGS 01491000 00010 68076 4 26 2012 2012 1 2012 14.1 2012 14.1 14.1 14.1 -USGS 01491000 00010 68076 4 27 2012 2012 1 2012 14.6 2012 14.6 14.6 14.6 -USGS 01491000 00010 68076 4 28 2011 2012 2 2011 21.7 2012 12.9 17.3 17.3 -USGS 01491000 00010 68076 4 29 2011 2012 2 2011 19.7 2012 13.4 16.6 16.6 -USGS 01491000 00010 68076 4 30 2011 2012 2 2011 17.6 2012 13.8 15.7 15.7 -USGS 01491000 00010 68076 5 1 2011 2012 2 2011 15.9 2011 15.9 15.9 15.9 -USGS 01491000 00010 68076 5 2 2011 2012 2 2012 17.0 2011 16.4 16.7 16.7 -USGS 01491000 00010 68076 5 3 2011 2012 2 2011 18.4 2012 17.0 17.7 17.7 -USGS 01491000 00010 68076 5 4 2011 2012 2 2011 18.1 2012 18.0 18 18 -USGS 01491000 00010 68076 5 5 2011 2012 2 2012 19.6 2011 15.6 17.6 17.6 -USGS 01491000 00010 68076 5 6 2011 2012 2 2012 19.4 2011 15.5 17.4 17.4 -USGS 01491000 00010 68076 5 7 2011 2012 2 2012 17.9 2011 16.6 17.2 17.2 -USGS 01491000 00010 68076 5 8 2011 2012 2 2012 18.1 2011 17.1 17.6 17.6 -USGS 01491000 00010 68076 5 9 2011 2012 2 2012 18.7 2011 17.4 18 18 -USGS 01491000 00010 68076 5 10 2011 2011 1 2011 17.5 2011 17.5 17.5 17.5 -USGS 01491000 00010 68076 5 11 2011 2011 1 2011 17.7 2011 17.7 17.7 17.7 -USGS 01491000 00010 68076 5 12 2011 2011 1 2011 17.8 2011 17.8 17.8 17.8 -USGS 01491000 00010 68076 5 13 2011 2011 1 2011 18.0 2011 18.0 18 18 -USGS 01491000 00010 68076 5 14 2011 2011 1 2011 17.6 2011 17.6 17.6 17.6 -USGS 01491000 00010 68076 5 15 2011 2011 1 2011 18.0 2011 18.0 18 18 -USGS 01491000 00010 68076 5 16 2011 2011 1 2011 19.0 2011 19.0 19 19 -USGS 01491000 00010 68076 5 17 2011 2011 1 2011 19.4 2011 19.4 19.4 19.4 -USGS 01491000 00010 68076 5 18 2011 2011 1 2011 19.2 2011 19.2 19.2 19.2 -USGS 01491000 00010 68076 5 19 2011 2011 1 2011 18.9 2011 18.9 18.9 18.9 -USGS 01491000 00010 68076 5 20 2011 2011 1 2011 18.4 2011 18.4 18.4 18.4 -USGS 01491000 00010 68076 5 21 2011 2011 1 2011 18.9 2011 18.9 18.9 18.9 -USGS 01491000 00010 68076 5 22 2011 2011 1 2011 19.7 2011 19.7 19.7 19.7 -USGS 01491000 00010 68076 5 23 2011 2011 1 2011 20.1 2011 20.1 20.1 20.1 -USGS 01491000 00010 68076 5 24 2011 2011 1 2011 21.4 2011 21.4 21.4 21.4 -USGS 01491000 00010 68076 5 25 2011 2011 1 2011 22.7 2011 22.7 22.7 22.7 -USGS 01491000 00010 68076 5 26 2011 2011 1 2011 23.4 2011 23.4 23.4 23.4 -USGS 01491000 00010 68076 5 27 2011 2011 1 2011 24.1 2011 24.1 24.1 24.1 -USGS 01491000 00010 68076 5 28 2011 2011 1 2011 24.1 2011 24.1 24.1 24.1 -USGS 01491000 00010 68076 5 29 2011 2011 1 2011 24.1 2011 24.1 24.1 24.1 -USGS 01491000 00010 68076 5 30 2011 2011 1 2011 24.9 2011 24.9 24.9 24.9 -USGS 01491000 00010 68076 5 31 2011 2011 1 2011 25.8 2011 25.8 25.8 25.8 -USGS 01491000 00010 68076 6 1 2011 2011 1 2011 26.1 2011 26.1 26.1 26.1 -USGS 01491000 00010 68076 6 2 2011 2011 1 2011 25.2 2011 25.2 25.2 25.2 -USGS 01491000 00010 68076 6 3 2011 2011 1 2011 22.4 2011 22.4 22.4 22.4 -USGS 01491000 00010 68076 6 4 2011 2011 1 2011 20.9 2011 20.9 20.9 20.9 -USGS 01491000 00010 68076 6 5 2011 2011 1 2011 21.1 2011 21.1 21.1 21.1 -USGS 01491000 00010 68076 6 6 2011 2011 1 2011 21.4 2011 21.4 21.4 21.4 -USGS 01491000 00010 68076 6 7 2011 2011 1 2011 22.2 2011 22.2 22.2 22.2 -USGS 01491000 00010 68076 6 8 2011 2011 1 2011 23.8 2011 23.8 23.8 23.8 -USGS 01491000 00010 68076 6 9 2011 2011 1 2011 25.4 2011 25.4 25.4 25.4 -USGS 01491000 00010 68076 6 10 2011 2011 1 2011 25.8 2011 25.8 25.8 25.8 -USGS 01491000 00010 68076 6 11 2011 2011 1 2011 25.2 2011 25.2 25.2 25.2 -USGS 01491000 00010 68076 6 12 2011 2011 1 2011 24.6 2011 24.6 24.6 24.6 -USGS 01491000 00010 68076 6 13 2011 2011 1 2011 23.3 2011 23.3 23.3 23.3 -USGS 01491000 00010 68076 6 14 2011 2011 1 2011 21.8 2011 21.8 21.8 21.8 -USGS 01491000 00010 68076 6 15 2011 2011 1 2011 21.4 2011 21.4 21.4 21.4 -USGS 01491000 00010 68076 6 16 2011 2011 1 2011 21.3 2011 21.3 21.3 21.3 -USGS 01491000 00010 68076 6 17 2011 2011 1 2011 22.1 2011 22.1 22.1 22.1 -USGS 01491000 00010 68076 6 18 2011 2011 1 2011 23.1 2011 23.1 23.1 23.1 -USGS 01491000 00010 68076 6 19 2011 2011 1 2011 23.5 2011 23.5 23.5 23.5 -USGS 01491000 00010 68076 6 20 2011 2011 1 2011 22.5 2011 22.5 22.5 22.5 -USGS 01491000 00010 68076 6 21 2011 2011 1 2011 22.2 2011 22.2 22.2 22.2 -USGS 01491000 00010 68076 6 22 2011 2011 1 2011 23.5 2011 23.5 23.5 23.5 -USGS 01491000 00010 68076 6 23 2011 2011 1 2011 24.7 2011 24.7 24.7 24.7 -USGS 01491000 00010 68076 6 24 2011 2011 1 2011 25.0 2011 25.0 25 25 -USGS 01491000 00010 68076 6 25 2011 2011 1 2011 24.4 2011 24.4 24.4 24.4 -USGS 01491000 00010 68076 6 26 2011 2011 1 2011 23.9 2011 23.9 23.9 23.9 -USGS 01491000 00010 68076 6 27 2011 2011 1 2011 23.8 2011 23.8 23.8 23.8 -USGS 01491000 00010 68076 6 28 2011 2011 1 2011 24.1 2011 24.1 24.1 24.1 -USGS 01491000 00010 68076 6 29 2011 2011 1 2011 25.0 2011 25.0 25 25 -USGS 01491000 00010 68076 6 30 2011 2011 1 2011 23.9 2011 23.9 23.9 23.9 -USGS 01491000 00010 68076 7 1 2011 2011 1 2011 23.1 2011 23.1 23.1 23.1 -USGS 01491000 00010 68076 7 3 2011 2011 1 2011 24.0 2011 24.0 24 24 -USGS 01491000 00010 68076 7 4 2011 2011 1 2011 24.6 2011 24.6 24.6 24.6 -USGS 01491000 00010 68076 7 5 2011 2011 1 2011 25.1 2011 25.1 25.1 25.1 -USGS 01491000 00010 68076 7 6 2011 2011 1 2011 24.6 2011 24.6 24.6 24.6 -USGS 01491000 00010 68076 7 7 2011 2011 1 2011 25.3 2011 25.3 25.3 25.3 -USGS 01491000 00010 68076 7 8 2011 2011 1 2011 25.3 2011 25.3 25.3 25.3 -USGS 01491000 00010 68076 7 9 2011 2011 1 2011 24.9 2011 24.9 24.9 24.9 -USGS 01491000 00010 68076 7 10 2011 2011 1 2011 24.8 2011 24.8 24.8 24.8 -USGS 01491000 00010 68076 7 11 2011 2011 1 2011 25.4 2011 25.4 25.4 25.4 -USGS 01491000 00010 68076 7 12 2011 2011 1 2011 26.4 2011 26.4 26.4 26.4 -USGS 01491000 00010 68076 7 13 2011 2011 1 2011 26.1 2011 26.1 26.1 26.1 -USGS 01491000 00010 68076 7 14 2011 2011 1 2011 24.4 2011 24.4 24.4 24.4 -USGS 01491000 00010 68076 7 15 2011 2011 1 2011 23.5 2011 23.5 23.5 23.5 -USGS 01491000 00010 68076 7 16 2011 2011 1 2011 23.2 2011 23.2 23.2 23.2 -USGS 01491000 00010 68076 7 21 2011 2011 1 2011 26.0 2011 26.0 26 26 -USGS 01491000 00010 68076 7 22 2011 2011 1 2011 27.8 2011 27.8 27.8 27.8 -USGS 01491000 00010 68076 7 23 2011 2011 1 2011 28.9 2011 28.9 28.9 28.9 -USGS 01491000 00010 68076 7 24 2011 2011 1 2011 28.4 2011 28.4 28.4 28.4 -USGS 01491000 00010 68076 7 25 2011 2011 1 2011 26.8 2011 26.8 26.8 26.8 -USGS 01491000 00010 68076 7 26 2011 2011 1 2011 26.6 2011 26.6 26.6 26.6 -USGS 01491000 00010 68076 8 1 2011 2011 1 2011 26.0 2011 26.0 26 26 -USGS 01491000 00010 68076 8 2 2011 2011 1 2011 25.4 2011 25.4 25.4 25.4 -USGS 01491000 00010 68076 8 3 2011 2011 1 2011 24.6 2011 24.6 24.6 24.6 -USGS 01491000 00010 68076 8 4 2011 2011 1 2011 24.0 2011 24.0 24 24 -USGS 01491000 00010 68076 8 5 2011 2011 1 2011 23.5 2011 23.5 23.5 23.5 -USGS 01491000 00010 68076 8 6 2011 2011 1 2011 24.1 2011 24.1 24.1 24.1 -USGS 01491000 00010 68076 8 7 2011 2011 1 2011 25.7 2011 25.7 25.7 25.7 -USGS 01491000 00010 68076 8 8 2011 2011 1 2011 26.6 2011 26.6 26.6 26.6 -USGS 01491000 00010 68076 8 14 2011 2011 1 2011 22.7 2011 22.7 22.7 22.7 -USGS 01491000 00010 68076 8 15 2011 2011 1 2011 22.5 2011 22.5 22.5 22.5 -USGS 01491000 00010 68076 8 16 2011 2011 1 2011 22.3 2011 22.3 22.3 22.3 -USGS 01491000 00010 68076 8 17 2011 2011 1 2011 22.6 2011 22.6 22.6 22.6 -USGS 01491000 00010 68076 8 18 2011 2011 1 2011 23.6 2011 23.6 23.6 23.6 -USGS 01491000 00010 68076 8 19 2011 2011 1 2011 23.6 2011 23.6 23.6 23.6 -USGS 01491000 00010 68076 8 20 2011 2011 1 2011 22.1 2011 22.1 22.1 22.1 -USGS 01491000 00010 68076 8 21 2011 2011 1 2011 22.8 2011 22.8 22.8 22.8 -USGS 01491000 00010 68076 8 22 2011 2011 1 2011 23.2 2011 23.2 23.2 23.2 -USGS 01491000 00010 68076 8 23 2011 2011 1 2011 22.0 2011 22.0 22 22 -USGS 01491000 00010 68076 8 24 2011 2011 1 2011 21.8 2011 21.8 21.8 21.8 -USGS 01491000 00010 68076 8 25 2011 2011 1 2011 22.6 2011 22.6 22.6 22.6 -USGS 01491000 00010 68076 8 26 2011 2011 1 2011 22.8 2011 22.8 22.8 22.8 -USGS 01491000 00010 68076 8 27 2011 2011 1 2011 23.1 2011 23.1 23.1 23.1 -USGS 01491000 00010 68076 8 28 2011 2011 1 2011 22.8 2011 22.8 22.8 22.8 -USGS 01491000 00010 68076 8 29 2011 2011 1 2011 22.4 2011 22.4 22.4 22.4 -USGS 01491000 00010 68076 8 30 2011 2011 1 2011 21.6 2011 21.6 21.6 21.6 -USGS 01491000 00010 68076 8 31 2011 2011 1 2011 21.2 2011 21.2 21.2 21.2 -USGS 01491000 00010 68076 9 1 2011 2011 1 2011 21.2 2011 21.2 21.2 21.2 -USGS 01491000 00010 68076 9 2 2011 2011 1 2011 20.9 2011 20.9 20.9 20.9 -USGS 01491000 00010 68076 9 3 2011 2011 1 2011 20.9 2011 20.9 20.9 20.9 -USGS 01491000 00010 68076 9 4 2011 2011 1 2011 21.9 2011 21.9 21.9 21.9 -USGS 01491000 00010 68076 9 5 2011 2011 1 2011 22.7 2011 22.7 22.7 22.7 -USGS 01491000 00010 68076 9 6 2011 2011 1 2011 21.9 2011 21.9 21.9 21.9 -USGS 01491000 00010 68076 9 7 2011 2011 1 2011 21.2 2011 21.2 21.2 21.2 -USGS 01491000 00010 68076 9 8 2011 2011 1 2011 22.2 2011 22.2 22.2 22.2 -USGS 01491000 00010 68076 9 9 2011 2011 1 2011 22.2 2011 22.2 22.2 22.2 -USGS 01491000 00010 68076 9 10 2011 2011 1 2011 22.5 2011 22.5 22.5 22.5 -USGS 01491000 00010 68076 9 11 2011 2011 1 2011 22.7 2011 22.7 22.7 22.7 -USGS 01491000 00010 68076 9 12 2011 2011 1 2011 22.3 2011 22.3 22.3 22.3 -USGS 01491000 00010 68076 9 13 2011 2011 1 2011 22.1 2011 22.1 22.1 22.1 -USGS 01491000 00010 68076 9 14 2011 2011 1 2011 22.5 2011 22.5 22.5 22.5 -USGS 01491000 00010 68076 9 15 2011 2011 1 2011 22.7 2011 22.7 22.7 22.7 -USGS 01491000 00010 68076 9 16 2011 2011 1 2011 19.6 2011 19.6 19.6 19.6 -USGS 01491000 00010 68076 9 17 2011 2011 1 2011 17.9 2011 17.9 17.9 17.9 -USGS 01491000 00010 68076 9 18 2011 2011 1 2011 17.2 2011 17.2 17.2 17.2 -USGS 01491000 00010 68076 9 19 2011 2011 1 2011 17.2 2011 17.2 17.2 17.2 -USGS 01491000 00010 68076 9 20 2011 2011 1 2011 17.8 2011 17.8 17.8 17.8 -USGS 01491000 00010 68076 9 21 2011 2011 1 2011 18.6 2011 18.6 18.6 18.6 -USGS 01491000 00010 68076 9 22 2011 2011 1 2011 20.0 2011 20.0 20 20 -USGS 01491000 00010 68076 9 23 2011 2011 1 2011 21.0 2011 21.0 21 21 -USGS 01491000 00010 68076 9 24 2011 2011 1 2011 21.1 2011 21.1 21.1 21.1 -USGS 01491000 00010 68076 9 25 2011 2011 1 2011 21.3 2011 21.3 21.3 21.3 -USGS 01491000 00010 68076 9 26 2011 2011 1 2011 21.6 2011 21.6 21.6 21.6 -USGS 01491000 00010 68076 9 27 2011 2011 1 2011 22.1 2011 22.1 22.1 22.1 -USGS 01491000 00010 68076 9 28 2011 2011 1 2011 22.3 2011 22.3 22.3 22.3 -USGS 01491000 00010 68076 9 29 2011 2011 1 2011 22.2 2011 22.2 22.2 22.2 -USGS 01491000 00010 68076 9 30 2011 2011 1 2011 21.0 2011 21.0 21 21 -USGS 01491000 00010 68076 10 1 2011 2012 2 2011 20.5 2012 19.3 19.9 19.9 -USGS 01491000 00010 68076 10 2 2011 2012 2 2011 18.9 2012 16.5 17.7 17.7 -USGS 01491000 00010 68076 10 3 2011 2012 2 2011 17.0 2012 14.4 15.7 15.7 -USGS 01491000 00010 68076 10 4 2011 2012 2 2011 15.5 2012 14.1 14.8 14.8 -USGS 01491000 00010 68076 10 5 2011 2012 2 2012 15.2 2011 14.4 14.8 14.8 -USGS 01491000 00010 68076 10 6 2011 2012 2 2012 15.5 2011 14.1 14.8 14.8 -USGS 01491000 00010 68076 10 7 2011 2012 2 2012 15.0 2011 14.5 14.7 14.7 -USGS 01491000 00010 68076 10 8 2011 2012 2 2011 15.2 2011 15.2 15.2 15.2 -USGS 01491000 00010 68076 10 9 2011 2012 2 2012 15.8 2011 15.7 15.8 15.8 -USGS 01491000 00010 68076 10 10 2011 2012 2 2012 16.8 2011 15.9 16.4 16.4 -USGS 01491000 00010 68076 10 11 2011 2012 2 2012 17.7 2011 17.1 17.4 17.4 -USGS 01491000 00010 68076 10 12 2011 2012 2 2011 18.0 2011 18.0 18 18 -USGS 01491000 00010 68076 10 13 2011 2012 2 2012 18.3 2011 17.2 17.7 17.7 -USGS 01491000 00010 68076 10 14 2011 2012 2 2012 18.9 2011 15.3 17.1 17.1 -USGS 01491000 00010 68076 10 15 2011 2012 2 2012 17.5 2011 14.2 15.9 15.9 -USGS 01491000 00010 68076 10 16 2011 2012 2 2012 16.4 2011 13.5 14.9 14.9 -USGS 01491000 00010 68076 10 17 2011 2012 2 2012 16.6 2011 13.1 14.9 14.9 -USGS 01491000 00010 68076 10 18 2011 2012 2 2012 16.3 2011 13.5 14.9 14.9 -USGS 01491000 00010 68076 10 19 2011 2012 2 2012 16.9 2011 13.8 15.3 15.3 -USGS 01491000 00010 68076 10 20 2011 2012 2 2012 17.2 2011 13.1 15.1 15.1 -USGS 01491000 00010 68076 10 21 2011 2012 2 2012 15.4 2011 13.1 14.2 14.2 -USGS 01491000 00010 68076 10 22 2011 2012 2 2012 14.2 2011 12.3 13.3 13.3 -USGS 01491000 00010 68076 10 23 2011 2012 2 2012 13.6 2011 11.5 12.6 12.6 -USGS 01491000 00010 68076 10 24 2011 2012 2 2012 13.5 2011 13.0 13.3 13.3 -USGS 01491000 00010 68076 10 25 2011 2012 2 2011 14.6 2012 13.8 14.2 14.2 -USGS 01491000 00010 68076 10 26 2011 2012 2 2011 16.0 2012 13.8 14.9 14.9 -USGS 01491000 00010 68076 10 27 2011 2012 2 2011 17.7 2012 14.7 16.2 16.2 -USGS 01491000 00010 68076 10 28 2011 2012 2 2011 18.5 2012 13.2 15.9 15.9 -USGS 01491000 00010 68076 10 29 2011 2012 2 2011 16.3 2012 11.0 13.7 13.7 -USGS 01491000 00010 68076 10 30 2011 2012 2 2011 13.4 2012 8.8 11.1 11.1 -USGS 01491000 00010 68076 10 31 2011 2012 2 2011 12.7 2012 8.2 10.4 10.4 -USGS 01491000 00010 68076 11 1 2011 2012 2 2011 11.3 2012 9.9 10.6 10.6 -USGS 01491000 00010 68076 11 2 2011 2012 2 2012 9.8 2011 9.6 9.7 9.7 -USGS 01491000 00010 68076 11 3 2011 2012 2 2012 10.2 2011 9.0 9.6 9.6 -USGS 01491000 00010 68076 11 4 2011 2012 2 2012 10.5 2011 10.3 10.4 10.4 -USGS 01491000 00010 68076 11 5 2011 2012 2 2011 10.6 2012 9.5 10.1 10.1 -USGS 01491000 00010 68076 11 6 2011 2012 2 2011 9.8 2012 9.0 9.4 9.4 -USGS 01491000 00010 68076 11 7 2011 2012 2 2012 9.3 2011 8.9 9.1 9.1 -USGS 01491000 00010 68076 11 8 2011 2012 2 2012 9.9 2011 8.6 9.3 9.3 -USGS 01491000 00010 68076 11 9 2011 2012 2 2012 10.4 2011 9.0 9.7 9.7 -USGS 01491000 00010 68076 11 10 2011 2012 2 2012 11.8 2011 9.5 10.6 10.6 -USGS 01491000 00010 68076 11 11 2011 2012 2 2012 10.7 2011 9.3 10 10 -USGS 01491000 00010 68076 11 12 2011 2012 2 2012 9.1 2011 8.5 8.8 8.8 -USGS 01491000 00010 68076 11 13 2011 2012 2 2012 9.5 2011 8.4 8.9 8.9 -USGS 01491000 00010 68076 11 14 2011 2012 2 2012 10.9 2011 8.5 9.7 9.7 -USGS 01491000 00010 68076 11 15 2011 2012 2 2012 12.9 2011 9.5 11.2 11.2 -USGS 01491000 00010 68076 11 16 2011 2012 2 2012 13.8 2011 10.6 12.2 12.2 -USGS 01491000 00010 68076 11 17 2011 2012 2 2012 12.9 2011 11.9 12.4 12.4 -USGS 01491000 00010 68076 11 18 2011 2012 2 2011 10.8 2012 9.2 10 10 -USGS 01491000 00010 68076 11 19 2011 2012 2 2011 9.6 2012 7.5 8.6 8.6 -USGS 01491000 00010 68076 11 20 2011 2012 2 2012 9.1 2011 8.9 9 9 -USGS 01491000 00010 68076 11 21 2011 2012 2 2012 11.4 2011 8.9 10.2 10.2 -USGS 01491000 00010 68076 11 22 2011 2012 2 2012 12.1 2011 9.4 10.7 10.7 -USGS 01491000 00010 68076 11 23 2011 2012 2 2012 13.2 2011 10.7 11.9 11.9 -USGS 01491000 00010 68076 11 24 2011 2012 2 2012 11.3 2011 10.3 10.8 10.8 -USGS 01491000 00010 68076 11 25 2011 2012 2 2012 10.1 2011 9.1 9.6 9.6 -USGS 01491000 00010 68076 11 26 2011 2012 2 2011 9.9 2012 9.6 9.7 9.7 -USGS 01491000 00010 68076 11 27 2011 2012 2 2012 10.1 2011 8.3 9.2 9.2 -USGS 01491000 00010 68076 11 28 2011 2012 2 2012 11.9 2011 6.7 9.3 9.3 -USGS 01491000 00010 68076 11 29 2011 2012 2 2012 13.6 2011 6.0 9.8 9.8 -USGS 01491000 00010 68076 11 30 2011 2012 2 2012 11.9 2011 7.3 9.6 9.6 -USGS 01491000 00010 68076 12 1 2011 2012 2 2011 10.1 2012 9.4 9.7 9.7 -USGS 01491000 00010 68076 12 2 2011 2012 2 2011 8.2 2012 7.7 7.9 7.9 -USGS 01491000 00010 68076 12 3 2011 2012 2 2012 7.1 2011 6.8 6.9 6.9 -USGS 01491000 00010 68076 12 4 2011 2012 2 2012 7.0 2011 5.4 6.2 6.2 -USGS 01491000 00010 68076 12 5 2011 2012 2 2012 8.5 2011 4.9 6.7 6.7 -USGS 01491000 00010 68076 12 6 2011 2012 2 2012 11.1 2011 4.0 7.6 7.6 -USGS 01491000 00010 68076 12 7 2011 2012 2 2012 13.3 2011 3.7 8.5 8.5 -USGS 01491000 00010 68076 12 8 2011 2012 2 2012 11.1 2011 2.5 6.8 6.8 -USGS 01491000 00010 68076 12 9 2011 2012 2 2012 8.4 2011 1.5 4.9 4.9 -USGS 01491000 00010 68076 12 10 2011 2012 2 2012 8.2 2011 1.7 4.9 4.9 -USGS 01491000 00010 68076 12 11 2011 2012 2 2012 6.5 2011 3.1 4.8 4.8 -USGS 01491000 00010 68076 12 12 2011 2012 2 2012 5.2 2011 5.1 5.2 5.2 -USGS 01491000 00010 68076 12 13 2011 2012 2 2011 5.4 2012 5.2 5.3 5.3 -USGS 01491000 00010 68076 12 14 2011 2012 2 2012 5.8 2011 3.2 4.5 4.5 -USGS 01491000 00010 68076 12 15 2011 2012 2 2012 8.1 2011 0.2 4.1 4.1 -USGS 01491000 00010 68076 12 16 2011 2012 2 2012 9.8 2011 -0.2 4.8 4.8 -USGS 01491000 00010 68076 12 17 2011 2012 2 2012 8.2 2011 0.1 4.1 4.1 -USGS 01491000 00010 68076 12 18 2011 2012 2 2012 6.6 2011 0.3 3.4 3.4 -USGS 01491000 00010 68076 12 19 2011 2012 2 2012 5.2 2011 1.1 3.2 3.2 -USGS 01491000 00010 68076 12 20 2011 2012 2 2012 7.0 2011 1.1 4 4 -USGS 01491000 00010 68076 12 21 2011 2012 2 2012 8.6 2011 1.2 4.9 4.9 -USGS 01491000 00010 68076 12 22 2011 2012 2 2012 10.6 2011 1.7 6.1 6.1 -USGS 01491000 00010 68076 12 23 2011 2012 2 2012 11.1 2011 1.9 6.5 6.5 -USGS 01491000 00010 68076 12 24 2011 2012 2 2012 9.1 2011 1.8 5.5 5.5 -USGS 01491000 00010 68076 12 25 2011 2012 2 2012 6.6 2011 2.0 4.3 4.3 -USGS 01491000 00010 68076 12 26 2011 2012 2 2012 6.1 2011 1.8 3.9 3.9 -USGS 01491000 00010 68076 12 27 2011 2012 2 2012 6.0 2011 0.3 3.2 3.2 -USGS 01491000 00010 68076 12 28 2011 2012 2 2012 7.1 2011 0.3 3.7 3.7 -USGS 01491000 00010 68076 12 29 2011 2012 2 2012 5.3 2011 0.6 2.9 2.9 -USGS 01491000 00010 68076 12 30 2011 2012 2 2012 5.0 2011 0.8 2.9 2.9 -USGS 01491000 00010 68076 12 31 2011 2012 2 2012 6.9 2011 1.7 4.3 4.3 -USGS 01491000 00060 68077 1 1 1948 2019 72 1961 1700 1966 12.0 206 23 38 60 66 114 219 246 378 1080 -USGS 01491000 00060 68077 1 2 1948 2019 72 1961 2200 1966 14.0 235 22 36 66 67 122 238 268 586 796 -USGS 01491000 00060 68077 1 3 1948 2019 72 1961 1190 1966 17.0 206 25 41 65 68 127 244 286 483 758 -USGS 01491000 00060 68077 1 4 1948 2019 72 1976 792 1966 17.0 182 25 46 63 66 131 231 250 424 617 -USGS 01491000 00060 68077 1 5 1948 2019 72 1976 568 1966 17.0 166 26 42 63 69 133 234 258 347 404 -USGS 01491000 00060 68077 1 6 1948 2019 72 1952 800 1988 25.0 166 30 44 64 73 126 214 227 352 402 -USGS 01491000 00060 68077 1 7 1948 2019 72 1949 831 1988 21.0 162 32 44 68 81 125 202 225 277 429 -USGS 01491000 00060 68077 1 8 1948 2019 72 2007 628 1988 20.0 166 30 41 65 76 140 205 232 350 484 -USGS 01491000 00060 68077 1 9 1948 2019 72 2007 1370 1988 24.0 181 31 41 63 73 138 229 249 323 476 -USGS 01491000 00060 68077 1 10 1948 2019 72 1953 964 1988 24.0 184 31 41 67 76 132 228 252 376 610 -USGS 01491000 00060 68077 1 11 1948 2019 72 1953 938 1966 20.0 176 29 48 70 82 131 229 250 402 458 -USGS 01491000 00060 68077 1 12 1948 2019 72 2014 1030 1966 17.0 182 26 45 75 85 132 204 237 361 597 -USGS 01491000 00060 68077 1 13 1948 2019 72 1991 920 1966 14.0 184 32 45 74 84 141 196 225 368 681 -USGS 01491000 00060 68077 1 14 1948 2019 72 1948 1540 1966 17.0 186 30 53 74 93 135 216 235 365 480 -USGS 01491000 00060 68077 1 15 1948 2019 72 1948 980 1966 14.0 191 29 48 77 96 135 210 233 407 732 -USGS 01491000 00060 68077 1 16 1948 2019 72 1958 718 1966 14.0 179 27 43 84 96 156 220 235 373 506 -USGS 01491000 00060 68077 1 17 1948 2019 72 2013 599 1966 13.0 167 27 43 75 86 151 204 220 334 449 -USGS 01491000 00060 68077 1 18 1948 2019 72 1978 1040 1966 13.0 167 28 49 82 90 144 183 197 327 428 -USGS 01491000 00060 68077 1 19 1948 2019 72 2015 1480 1966 13.0 195 35 43 77 88 147 190 249 352 519 -USGS 01491000 00060 68077 1 20 1948 2019 72 1996 2090 1966 21.0 212 36 46 80 91 141 228 241 375 813 -USGS 01491000 00060 68077 1 21 1948 2019 72 1978 1600 1966 17.0 220 37 53 80 90 142 211 258 601 762 -USGS 01491000 00060 68077 1 22 1948 2019 72 1979 1760 1966 13.0 217 38 56 75 90 136 211 266 519 656 -USGS 01491000 00060 68077 1 23 1948 2019 72 1949 1160 1966 19.0 195 37 60 82 89 147 234 302 377 532 -USGS 01491000 00060 68077 1 24 1948 2019 72 1998 898 1966 21.0 207 36 56 86 95 145 268 305 443 737 -USGS 01491000 00060 68077 1 25 1948 2019 72 2015 1340 1966 19.0 230 37 55 87 95 147 262 328 503 825 -USGS 01491000 00060 68077 1 26 1948 2019 72 1978 1760 1966 13.0 251 38 55 90 95 149 325 360 545 925 -USGS 01491000 00060 68077 1 27 1948 2019 72 1978 1540 1966 13.0 239 35 57 82 97 150 305 409 520 731 -USGS 01491000 00060 68077 1 28 1948 2019 72 1976 1700 1966 17.0 239 34 58 80 95 142 275 335 641 764 -USGS 01491000 00060 68077 1 29 1948 2019 72 1998 2710 1966 13.0 264 33 56 80 95 141 239 278 555 1170 -USGS 01491000 00060 68077 1 30 1948 2019 72 1998 1250 1966 10.0 206 38 51 81 92 140 237 249 407 765 -USGS 01491000 00060 68077 1 31 1948 2019 72 1973 650 1966 12.0 167 41 59 87 93 133 208 227 281 403 -USGS 01491000 00060 68077 2 1 1948 2019 72 1949 937 1966 13.0 164 42 64 88 97 136 202 213 258 389 -USGS 01491000 00060 68077 2 2 1948 2019 72 1949 684 1966 13.0 174 46 65 89 98 149 199 222 343 502 -USGS 01491000 00060 68077 2 3 1948 2019 72 1973 2320 1966 13.0 207 43 76 96 101 143 211 241 385 502 -USGS 01491000 00060 68077 2 4 1948 2019 72 1973 1510 1966 13.0 215 41 77 100 104 146 246 313 400 665 -USGS 01491000 00060 68077 2 5 1948 2019 72 1998 1480 1966 13.0 233 41 68 99 104 150 254 286 460 739 -USGS 01491000 00060 68077 2 6 1948 2019 72 1998 1630 1966 13.0 227 45 65 94 99 137 270 304 489 784 -USGS 01491000 00060 68077 2 7 1948 2019 72 2004 1670 1966 13.0 214 47 76 94 102 149 238 294 419 539 -USGS 01491000 00060 68077 2 8 1948 2019 72 2004 1110 1966 14.0 209 50 76 98 105 160 277 330 387 492 -USGS 01491000 00060 68077 2 9 1948 2019 72 1971 735 1966 16.0 195 51 77 95 101 151 256 279 413 472 -USGS 01491000 00060 68077 2 10 1948 2019 72 1961 573 1966 20.0 179 50 80 92 101 146 230 257 345 408 -USGS 01491000 00060 68077 2 11 1948 2019 72 2018 2210 1966 32.0 194 52 81 93 97 141 196 237 294 404 -USGS 01491000 00060 68077 2 12 1948 2019 72 2018 3300 2002 34.6 213 55 80 98 103 150 211 242 278 441 -USGS 01491000 00060 68077 2 13 1948 2019 72 2018 1220 2002 33.0 208 63 82 98 112 160 218 231 318 684 -USGS 01491000 00060 68077 2 14 1948 2019 72 1971 801 2002 32.1 215 70 81 102 113 159 250 270 400 733 -USGS 01491000 00060 68077 2 15 1948 2019 72 2014 1010 2002 31.4 224 66 77 101 114 178 254 291 545 655 -USGS 01491000 00060 68077 2 16 1948 2019 72 1984 1380 2002 31.5 246 58 75 103 109 175 271 338 453 826 -USGS 01491000 00060 68077 2 17 1948 2019 72 1964 808 2002 31.2 229 65 82 96 106 179 265 296 495 768 -USGS 01491000 00060 68077 2 18 1948 2019 72 1961 641 2002 30.2 217 64 87 104 108 183 269 305 398 536 -USGS 01491000 00060 68077 2 19 1948 2019 72 1961 987 2002 29.2 237 58 85 102 109 178 295 351 507 647 -USGS 01491000 00060 68077 2 20 1948 2019 72 1964 1670 2002 29.7 258 58 82 99 112 169 258 292 716 900 -USGS 01491000 00060 68077 2 21 1948 2019 72 1964 944 2002 30.2 223 60 80 99 106 157 264 330 499 605 -USGS 01491000 00060 68077 2 22 1948 2019 72 1996 716 2002 30.4 224 59 79 96 106 161 289 333 507 617 -USGS 01491000 00060 68077 2 23 1948 2019 72 2003 1550 2002 30.0 246 60 76 98 114 174 293 324 572 664 -USGS 01491000 00060 68077 2 24 1948 2019 72 2003 2720 2002 29.7 319 61 83 108 120 172 299 327 538 1510 -USGS 01491000 00060 68077 2 25 1948 2019 72 1979 2960 2002 29.4 333 64 89 111 120 176 283 321 843 1460 -USGS 01491000 00060 68077 2 26 1948 2019 72 1979 5900 2002 29.0 333 57 98 113 123 170 284 350 615 924 -USGS 01491000 00060 68077 2 27 1948 2019 72 1979 4120 2002 28.7 287 57 98 109 112 170 271 340 505 755 -USGS 01491000 00060 68077 2 28 1948 2019 72 1979 1820 2002 28.2 241 58 89 102 109 161 239 260 488 633 -USGS 01491000 00060 68077 2 29 1948 2016 18 1972 387 1968 58.0 179 95 111 118 151 209 231 380 -USGS 01491000 00060 68077 3 1 1948 2019 72 1958 1370 2002 27.8 229 69 84 99 110 157 233 309 558 645 -USGS 01491000 00060 68077 3 2 1948 2019 72 1987 1350 2002 28.4 237 73 81 98 106 172 271 304 541 735 -USGS 01491000 00060 68077 3 3 1948 2019 72 1994 2830 1950 42.0 273 73 83 100 105 158 282 382 526 660 -USGS 01491000 00060 68077 3 4 1948 2019 72 1994 3260 1950 42.0 276 60 83 98 105 166 275 361 567 766 -USGS 01491000 00060 68077 3 5 1948 2019 72 1993 1520 2002 40.3 262 61 82 102 107 164 311 365 641 881 -USGS 01491000 00060 68077 3 6 1948 2019 72 2003 1230 2002 36.0 240 67 86 114 121 177 275 287 497 747 -USGS 01491000 00060 68077 3 7 1948 2019 72 2003 1430 2002 34.3 271 63 87 111 121 194 318 369 558 814 -USGS 01491000 00060 68077 3 8 1948 2019 72 2018 999 2002 33.7 273 68 88 110 122 190 351 443 630 826 -USGS 01491000 00060 68077 3 9 1948 2019 72 2008 1130 2002 36.2 275 75 89 113 116 190 346 378 655 798 -USGS 01491000 00060 68077 3 10 1948 2019 72 1998 1330 2002 34.7 254 72 93 107 113 176 293 356 567 723 -USGS 01491000 00060 68077 3 11 1948 2019 72 1994 1050 2002 32.4 233 68 90 104 110 180 298 365 469 634 -USGS 01491000 00060 68077 3 12 1948 2019 72 1949 990 2002 31.6 241 70 86 105 110 173 279 328 526 724 -USGS 01491000 00060 68077 3 13 1948 2019 72 1963 1670 1966 36.0 260 72 83 101 113 180 296 350 513 838 -USGS 01491000 00060 68077 3 14 1948 2019 72 2010 3300 1966 38.0 317 74 87 106 127 205 295 371 758 1050 -USGS 01491000 00060 68077 3 15 1948 2019 72 1978 2100 1966 39.0 333 72 85 102 130 208 442 479 879 1150 -USGS 01491000 00060 68077 3 16 1948 2019 72 1978 1270 2002 38.8 272 69 82 109 134 190 330 363 638 757 -USGS 01491000 00060 68077 3 17 1948 2019 72 2007 1320 2002 37.1 256 67 81 130 136 197 271 340 441 805 -USGS 01491000 00060 68077 3 18 1948 2019 72 1993 1950 1966 38.0 263 66 79 123 130 183 293 322 458 877 -USGS 01491000 00060 68077 3 19 1948 2019 72 1968 1500 1966 39.0 259 69 83 115 131 179 307 352 516 800 -USGS 01491000 00060 68077 3 20 1948 2019 72 1975 1740 1966 40.0 276 72 79 120 134 203 307 345 549 888 -USGS 01491000 00060 68077 3 21 1948 2019 72 1998 1460 1966 38.0 273 71 91 120 133 209 305 389 479 742 -USGS 01491000 00060 68077 3 22 1948 2019 72 2000 2350 1966 38.0 329 67 102 133 149 201 328 367 585 1460 -USGS 01491000 00060 68077 3 23 1948 2019 72 2000 2010 1966 38.0 306 65 84 142 149 208 328 424 644 900 -USGS 01491000 00060 68077 3 24 1948 2019 72 1964 980 1966 38.0 277 68 77 125 146 205 359 393 581 798 -USGS 01491000 00060 68077 3 25 1948 2019 72 1989 2160 1966 42.0 270 64 89 123 140 186 304 379 497 721 -USGS 01491000 00060 68077 3 26 1948 2019 72 1989 1080 1966 39.0 242 62 91 127 138 177 301 319 498 702 -USGS 01491000 00060 68077 3 27 1948 2019 72 1978 2490 1966 39.0 252 71 101 121 127 179 269 289 417 607 -USGS 01491000 00060 68077 3 28 1948 2019 72 1978 2120 1966 38.0 272 78 103 119 127 173 268 286 555 961 -USGS 01491000 00060 68077 3 29 1948 2019 72 1994 4120 1966 38.0 298 77 102 114 120 172 247 263 604 952 -USGS 01491000 00060 68077 3 30 1948 2019 72 1994 2340 1966 36.0 294 75 93 107 116 164 262 329 595 1200 -USGS 01491000 00060 68077 3 31 1948 2019 72 2014 2160 1966 36.0 272 77 91 108 119 157 286 338 559 1010 -USGS 01491000 00060 68077 4 1 1948 2019 72 1958 1100 1966 34.0 248 77 91 111 121 155 284 316 662 808 -USGS 01491000 00060 68077 4 2 1948 2019 72 1996 1800 1966 33.0 261 79 95 107 115 165 285 389 580 675 -USGS 01491000 00060 68077 4 3 1948 2019 72 2005 1810 1966 33.0 253 79 93 108 115 166 308 347 473 702 -USGS 01491000 00060 68077 4 4 1948 2019 72 2005 1200 1966 33.0 226 74 89 109 112 169 259 297 470 573 -USGS 01491000 00060 68077 4 5 1948 2019 72 1984 1250 1966 33.0 214 71 85 105 119 172 249 283 409 460 -USGS 01491000 00060 68077 4 6 1948 2019 72 1984 1900 1966 32.0 216 68 80 111 118 168 247 263 312 407 -USGS 01491000 00060 68077 4 7 1948 2019 72 1984 889 1966 32.0 206 71 78 121 126 171 236 269 340 508 -USGS 01491000 00060 68077 4 8 1948 2019 72 2005 1530 1966 30.0 242 69 76 123 128 170 253 290 496 840 -USGS 01491000 00060 68077 4 9 1948 2019 72 2005 1780 1966 27.0 246 70 77 115 121 156 250 281 477 807 -USGS 01491000 00060 68077 4 10 1948 2019 72 1983 1070 1966 26.0 225 67 79 103 114 153 240 269 567 735 -USGS 01491000 00060 68077 4 11 1948 2019 72 1983 2230 1966 28.0 233 57 73 102 109 143 234 281 466 629 -USGS 01491000 00060 68077 4 12 1948 2019 72 1983 1400 1966 30.0 208 59 70 91 111 141 231 267 376 658 -USGS 01491000 00060 68077 4 13 1948 2019 72 1983 742 1963 48.0 204 63 69 100 111 148 235 287 401 621 -USGS 01491000 00060 68077 4 14 1948 2019 72 2004 2050 1963 48.0 244 65 75 96 110 157 245 270 450 860 -USGS 01491000 00060 68077 4 15 1948 2019 72 2004 2100 1963 62.0 246 66 74 95 103 160 260 270 543 733 -USGS 01491000 00060 68077 4 16 1948 2019 72 2007 4170 1966 55.0 299 65 71 90 99 163 270 330 501 1100 -USGS 01491000 00060 68077 4 17 1948 2019 72 2007 2330 1950 48.0 288 58 69 97 101 154 309 395 635 814 -USGS 01491000 00060 68077 4 18 1948 2019 72 1983 936 1950 42.0 215 55 64 89 96 157 241 281 480 711 -USGS 01491000 00060 68077 4 19 1948 2019 72 2000 675 1966 45.0 178 54 61 84 92 141 224 268 333 458 -USGS 01491000 00060 68077 4 20 1948 2019 72 2000 522 1966 42.0 163 53 58 83 92 132 210 240 283 402 -USGS 01491000 00060 68077 4 21 1948 2019 72 2015 605 1966 40.0 162 51 57 82 88 125 216 239 298 410 -USGS 01491000 00060 68077 4 22 1948 2019 72 2000 538 1977 48.0 156 51 61 80 86 117 195 217 277 405 -USGS 01491000 00060 68077 4 23 1948 2019 72 2000 537 1985 45.0 150 54 62 74 87 118 184 200 282 354 -USGS 01491000 00060 68077 4 24 1948 2019 72 1972 520 1985 44.0 147 53 56 80 90 122 173 205 254 325 -USGS 01491000 00060 68077 4 25 1948 2019 72 1983 1020 1985 46.0 153 52 61 82 95 129 177 197 248 306 -USGS 01491000 00060 68077 4 26 1948 2019 72 1952 840 1985 48.0 160 52 57 78 91 132 183 191 277 346 -USGS 01491000 00060 68077 4 27 1948 2019 72 1952 1310 1985 46.0 165 51 60 80 85 125 181 202 254 413 -USGS 01491000 00060 68077 4 28 1948 2019 72 1952 2370 1985 43.0 179 49 57 82 87 129 189 205 303 353 -USGS 01491000 00060 68077 4 29 1948 2019 72 1952 1650 1985 37.0 173 48 62 83 84 130 179 198 263 379 -USGS 01491000 00060 68077 4 30 1948 2019 72 1952 922 1985 36.0 158 47 62 80 84 125 174 186 268 461 -USGS 01491000 00060 68077 5 1 1948 2019 72 2014 1490 1985 33.0 161 51 74 78 83 117 168 178 242 472 -USGS 01491000 00060 68077 5 2 1948 2019 72 2014 887 1985 34.0 156 56 67 77 79 115 160 178 236 612 -USGS 01491000 00060 68077 5 3 1948 2019 72 1989 1620 1977 37.0 161 56 68 74 76 113 161 169 252 502 -USGS 01491000 00060 68077 5 4 1948 2019 72 1989 707 1977 34.0 149 54 60 70 72 118 160 181 298 387 -USGS 01491000 00060 68077 5 5 1948 2019 72 1975 830 1977 37.0 151 49 51 64 68 117 187 200 259 462 -USGS 01491000 00060 68077 5 6 1948 2019 72 1948 868 1957 39.0 160 46 48 62 64 112 182 198 333 549 -USGS 01491000 00060 68077 5 7 1948 2019 72 1989 1210 1957 39.0 166 43 49 58 62 100 163 186 417 664 -USGS 01491000 00060 68077 5 8 1948 2019 72 1958 1230 1957 39.0 162 41 45 53 60 106 157 180 409 625 -USGS 01491000 00060 68077 5 9 1948 2019 72 1958 911 1955 36.0 152 38 43 54 61 104 164 210 315 489 -USGS 01491000 00060 68077 5 10 1948 2019 72 1996 701 1957 34.0 144 37 39 50 64 105 163 196 329 446 -USGS 01491000 00060 68077 5 11 1948 2019 72 1990 766 1957 34.0 141 37 41 51 66 105 154 177 307 466 -USGS 01491000 00060 68077 5 12 1948 2019 72 2008 918 1977 35.0 144 37 41 56 66 94 159 174 268 522 -USGS 01491000 00060 68077 5 13 1948 2019 72 2008 2000 1977 31.0 161 38 40 55 64 97 147 181 384 485 -USGS 01491000 00060 68077 5 14 1948 2019 72 2008 921 1977 29.0 142 38 43 53 56 99 171 190 291 440 -USGS 01491000 00060 68077 5 15 1948 2019 72 2008 526 1977 25.0 123 38 43 52 59 97 148 182 240 333 -USGS 01491000 00060 68077 5 16 1948 2019 72 1972 400 1977 27.0 118 34 39 54 61 94 153 172 230 318 -USGS 01491000 00060 68077 5 17 1948 2019 72 2018 408 1977 25.0 126 35 38 49 54 88 158 188 322 375 -USGS 01491000 00060 68077 5 18 1948 2019 72 2018 957 1977 23.0 130 35 39 50 55 87 138 184 257 361 -USGS 01491000 00060 68077 5 19 1948 2019 72 2018 1890 1977 27.0 137 34 38 50 51 89 162 172 222 325 -USGS 01491000 00060 68077 5 20 1948 2019 72 2018 2250 1965 28.0 146 34 39 45 47 94 153 172 234 353 -USGS 01491000 00060 68077 5 21 1948 2019 72 1953 1200 1965 27.0 145 33 37 41 48 91 143 165 252 613 -USGS 01491000 00060 68077 5 22 1948 2019 72 1953 685 1977 22.0 126 28 37 51 55 89 134 160 246 432 -USGS 01491000 00060 68077 5 23 1948 2019 72 1983 607 1977 20.0 122 31 38 52 59 85 128 153 289 406 -USGS 01491000 00060 68077 5 24 1948 2019 72 1989 788 1977 20.0 120 29 36 52 56 85 124 145 251 399 -USGS 01491000 00060 68077 5 25 1948 2019 72 1989 775 1977 22.0 117 27 33 44 51 81 144 160 248 333 -USGS 01491000 00060 68077 5 26 1948 2019 72 1997 1270 1959 24.0 151 24 33 48 51 77 164 197 332 562 -USGS 01491000 00060 68077 5 27 1948 2019 72 1997 1250 1964 21.0 165 27 32 43 52 80 173 191 414 936 -USGS 01491000 00060 68077 5 28 1948 2019 72 2003 637 1964 20.0 125 24 29 48 51 78 150 166 295 529 -USGS 01491000 00060 68077 5 29 1948 2019 72 1968 594 1959 20.0 116 23 29 46 50 78 130 154 267 438 -USGS 01491000 00060 68077 5 30 1948 2019 72 1990 1700 1964 20.0 150 26 32 46 48 77 144 169 262 612 -USGS 01491000 00060 68077 5 31 1948 2019 72 1984 1410 1959 17.0 149 25 30 43 46 76 163 182 310 692 -USGS 01491000 00060 68077 6 1 1948 2019 72 1948 1190 1959 19.0 141 22 28 41 44 72 144 168 279 611 -USGS 01491000 00060 68077 6 2 1948 2019 72 1952 1700 1964 23.0 146 24 31 39 43 69 158 182 279 637 -USGS 01491000 00060 68077 6 3 1948 2019 72 1952 913 1999 20.0 125 25 32 44 45 73 144 189 267 455 -USGS 01491000 00060 68077 6 4 1948 2019 72 1974 764 1999 18.0 111 23 31 41 42 77 142 161 229 299 -USGS 01491000 00060 68077 6 5 1948 2019 72 1979 652 1977 18.0 113 23 31 40 40 71 151 166 226 421 -USGS 01491000 00060 68077 6 6 1948 2019 72 2009 611 1977 18.0 110 20 30 38 45 70 142 149 197 376 -USGS 01491000 00060 68077 6 7 1948 2019 72 2009 515 1999 18.0 103 22 28 36 38 70 134 148 226 306 -USGS 01491000 00060 68077 6 8 1948 2019 72 2013 2730 1999 17.0 144 21 25 35 37 64 129 140 232 393 -USGS 01491000 00060 68077 6 9 1948 2019 72 2013 1710 1999 15.0 124 23 26 34 36 64 123 137 234 360 -USGS 01491000 00060 68077 6 10 1948 2019 72 2013 676 1999 13.0 105 20 25 34 39 62 113 124 223 480 -USGS 01491000 00060 68077 6 11 1948 2019 72 2009 757 1999 13.0 111 19 25 32 36 62 104 122 248 661 -USGS 01491000 00060 68077 6 12 1948 2019 72 2018 746 1999 13.0 116 19 25 32 35 62 94 105 348 642 -USGS 01491000 00060 68077 6 13 1948 2019 72 1979 599 1964 16.0 109 20 25 33 34 61 87 112 397 482 -USGS 01491000 00060 68077 6 14 1948 2019 72 2013 983 1964 17.0 116 19 24 30 35 56 84 152 301 534 -USGS 01491000 00060 68077 6 15 1948 2019 72 2013 747 1964 17.0 92 20 23 31 34 51 88 138 211 368 -USGS 01491000 00060 68077 6 16 1948 2019 72 2013 440 1977 19.0 78 22 24 28 30 52 82 92 191 260 -USGS 01491000 00060 68077 6 17 1948 2019 72 2001 3140 1977 18.0 119 22 25 28 30 53 80 115 189 306 -USGS 01491000 00060 68077 6 18 1948 2019 72 2001 3830 1986 15.0 146 20 26 28 30 50 110 139 303 465 -USGS 01491000 00060 68077 6 19 1948 2019 72 2013 3400 1986 13.0 159 20 22 28 29 50 117 128 326 757 -USGS 01491000 00060 68077 6 20 1948 2019 72 1996 2460 1986 12.0 153 19 24 26 29 51 103 122 274 660 -USGS 01491000 00060 68077 6 21 1948 2019 72 2003 2220 1986 15.0 148 19 21 27 32 50 91 126 373 768 -USGS 01491000 00060 68077 6 22 1948 2019 72 1983 1670 1977 15.0 138 17 21 27 30 47 88 112 369 713 -USGS 01491000 00060 68077 6 23 1948 2019 72 1972 2370 1977 12.0 138 17 21 27 30 50 79 101 294 813 -USGS 01491000 00060 68077 6 24 1948 2019 72 1972 1960 1977 10.0 111 16 18 26 27 48 76 96 273 410 -USGS 01491000 00060 68077 6 25 1948 2019 72 1972 1030 1977 11.0 90 17 20 25 26 45 81 113 237 312 -USGS 01491000 00060 68077 6 26 1948 2019 72 2006 1330 2012 10.7 91 14 17 22 24 43 76 95 192 338 -USGS 01491000 00060 68077 6 27 1948 2019 72 2006 2460 2012 10.5 99 13 16 21 22 41 74 94 162 269 -USGS 01491000 00060 68077 6 28 1948 2019 72 2006 1820 1977 8.80 84 13 16 20 21 39 70 78 159 258 -USGS 01491000 00060 68077 6 29 1948 2019 72 2006 1390 2012 8.58 74 13 16 19 21 38 61 70 156 228 -USGS 01491000 00060 68077 6 30 1948 2019 72 2006 603 2012 7.15 64 13 15 19 20 35 61 92 146 203 -USGS 01491000 00060 68077 7 1 1948 2019 72 1972 510 2012 6.23 64 13 14 17 20 38 76 96 145 220 -USGS 01491000 00060 68077 7 2 1948 2019 72 1972 359 2012 7.14 58 11 12 19 20 35 65 84 140 225 -USGS 01491000 00060 68077 7 3 1948 2019 72 2013 495 1976 7.90 58 11 13 17 18 38 59 78 129 216 -USGS 01491000 00060 68077 7 4 1948 2019 72 2013 478 1985 9.40 60 11 13 17 19 35 61 78 136 231 -USGS 01491000 00060 68077 7 5 1948 2019 72 1978 322 2012 7.32 57 11 12 15 16 34 62 77 162 226 -USGS 01491000 00060 68077 7 6 1948 2019 72 2001 380 2012 6.12 62 10 12 15 17 34 66 85 194 228 -USGS 01491000 00060 68077 7 7 1948 2019 72 2006 571 2012 4.16 60 8.6 12 15 16 34 56 77 157 246 -USGS 01491000 00060 68077 7 8 1948 2019 72 2006 407 2012 1.53 55 10 12 16 17 34 64 74 137 228 -USGS 01491000 00060 68077 7 9 1948 2019 72 1969 376 2012 5.67 58 9.1 11 15 17 34 66 73 140 252 -USGS 01491000 00060 68077 7 10 1948 2019 72 2003 604 1999 7.60 69 8.6 11 18 20 33 58 67 142 363 -USGS 01491000 00060 68077 7 11 1948 2019 72 2003 1000 2012 4.50 75 9 11 17 21 38 65 78 153 313 -USGS 01491000 00060 68077 7 12 1948 2019 72 2013 530 2012 2.40 69 7.8 11 19 21 34 64 77 141 389 -USGS 01491000 00060 68077 7 13 1948 2019 72 2013 3110 2012 1.80 111 10 13 16 19 32 56 81 203 404 -USGS 01491000 00060 68077 7 14 1948 2019 72 1975 2510 2012 1.12 130 9.8 13 17 19 29 47 75 308 571 -USGS 01491000 00060 68077 7 15 1948 2019 72 1975 2090 2012 7.88 104 9.5 12 17 19 32 58 76 282 442 -USGS 01491000 00060 68077 7 16 1948 2019 72 1975 1470 1986 4.70 80 6.9 13 18 18 32 67 90 148 325 -USGS 01491000 00060 68077 7 17 1948 2019 72 1975 963 2012 2.99 72 5.9 11 17 18 28 71 81 206 295 -USGS 01491000 00060 68077 7 18 1948 2019 72 1975 643 2012 1.40 62 7 11 14 16 30 66 79 182 226 -USGS 01491000 00060 68077 7 19 1948 2019 72 1975 388 1999 3.60 56 6.3 11 14 15 33 55 72 165 224 -USGS 01491000 00060 68077 7 20 1948 2019 72 1975 257 1999 4.90 52 7.7 9.8 14 16 28 54 63 172 220 -USGS 01491000 00060 68077 7 21 1948 2019 72 1975 487 1999 3.60 54 7.6 10 14 15 30 55 58 133 175 -USGS 01491000 00060 68077 7 22 1948 2019 72 1975 887 2002 5.48 59 6.9 9 13 16 27 60 77 131 199 -USGS 01491000 00060 68077 7 23 1948 2019 72 1975 505 1977 4.00 57 7 9.4 14 15 29 68 71 133 203 -USGS 01491000 00060 68077 7 24 1948 2019 72 1958 480 1977 2.40 55 7.5 9.7 13 15 33 58 65 126 252 -USGS 01491000 00060 68077 7 25 1948 2019 72 1958 660 1977 2.90 59 6.8 9.1 13 15 32 51 59 117 230 -USGS 01491000 00060 68077 7 26 1948 2019 72 2018 1390 1966 5.50 65 6.5 8 13 16 30 47 56 103 197 -USGS 01491000 00060 68077 7 27 1948 2019 72 2018 814 1966 4.60 61 6 8.5 12 14 27 45 55 140 284 -USGS 01491000 00060 68077 7 28 1948 2019 72 1991 790 2012 3.63 60 5.1 7.2 11 14 25 51 67 117 248 -USGS 01491000 00060 68077 7 29 1948 2019 72 1991 405 1977 3.10 58 5.9 6.4 11 12 27 69 80 153 275 -USGS 01491000 00060 68077 7 30 1948 2019 72 1969 818 2011 2.77 72 6.1 7.7 12 13 30 85 105 168 196 -USGS 01491000 00060 68077 7 31 1948 2019 72 1969 454 2012 0.91 59 6.3 8.9 12 13 30 71 79 135 258 -USGS 01491000 00060 68077 8 1 1948 2019 72 1958 560 2012 3.35 58 5.6 8.4 11 13 32 67 99 149 186 -USGS 01491000 00060 68077 8 2 1948 2019 72 1958 740 2002 3.38 69 6.5 7.5 11 12 30 63 75 173 372 -USGS 01491000 00060 68077 8 3 1948 2019 72 1978 552 1999 3.80 64 6.3 8.4 12 12 30 65 72 161 311 -USGS 01491000 00060 68077 8 4 1948 2019 72 1967 6160 1999 3.20 157 5.3 7.1 10 12 32 55 79 151 427 -USGS 01491000 00060 68077 8 5 1948 2019 72 1967 5260 1999 2.60 155 4.7 5.9 12 14 29 61 89 143 638 -USGS 01491000 00060 68077 8 6 1948 2019 72 1967 3030 1999 2.00 120 4.7 8 11 14 28 53 87 161 690 -USGS 01491000 00060 68077 8 7 1948 2019 72 1967 1390 1999 2.20 86 3.8 7.9 12 13 26 68 83 213 430 -USGS 01491000 00060 68077 8 8 1948 2019 72 2017 670 2002 2.10 76 4.1 7 12 14 26 69 80 215 390 -USGS 01491000 00060 68077 8 9 1948 2019 72 1952 992 2012 1.77 69 4.7 6.6 12 13 26 62 69 153 321 -USGS 01491000 00060 68077 8 10 1948 2019 72 1952 505 2002 2.40 54 4.3 7.2 11 13 26 57 75 148 202 -USGS 01491000 00060 68077 8 11 1948 2019 72 1969 297 2002 2.10 51 4.2 7 12 14 26 59 78 147 230 -USGS 01491000 00060 68077 8 12 1948 2019 72 1998 422 1999 1.20 59 3.9 6.5 10 14 27 70 88 145 237 -USGS 01491000 00060 68077 8 13 1948 2019 72 1955 800 1999 1.00 81 3.9 6.6 10 13 28 90 112 209 403 -USGS 01491000 00060 68077 8 14 1948 2019 72 1996 1550 2008 2.38 110 4.7 6.3 9.4 13 28 92 114 184 789 -USGS 01491000 00060 68077 8 15 1948 2019 72 1955 750 2008 3.02 83 5 6.9 10 14 28 87 104 185 443 -USGS 01491000 00060 68077 8 16 1948 2019 72 2000 547 2002 2.30 64 5.1 6.8 11 12 25 65 99 138 355 -USGS 01491000 00060 68077 8 17 1948 2019 72 1958 366 2002 0.92 56 5.4 6.6 10 12 23 72 84 152 260 -USGS 01491000 00060 68077 8 18 1948 2019 72 2003 382 2002 0.56 54 5.3 6.6 11 14 25 58 75 148 220 -USGS 01491000 00060 68077 8 19 1948 2019 72 2017 430 2002 0.35 55 4.3 6.2 11 13 27 56 65 155 250 -USGS 01491000 00060 68077 8 20 1948 2019 72 2017 539 2002 0.49 57 4.9 8.8 13 15 26 58 73 175 201 -USGS 01491000 00060 68077 8 21 1948 2019 72 1997 469 2002 0.42 57 4.5 8.7 12 14 30 56 86 144 216 -USGS 01491000 00060 68077 8 22 1948 2019 72 2009 1060 2002 1.26 66 5.1 7.3 12 15 32 67 84 126 167 -USGS 01491000 00060 68077 8 23 1948 2019 72 2009 2610 2002 0.43 87 4.5 8 12 14 26 62 80 111 208 -USGS 01491000 00060 68077 8 24 1948 2019 72 2009 1350 2002 1.00 71 5.5 8 12 15 26 52 68 106 337 -USGS 01491000 00060 68077 8 25 1948 2019 72 1958 1570 2002 1.50 79 6.1 7 12 14 27 46 57 92 388 -USGS 01491000 00060 68077 8 26 1948 2019 72 1958 4210 1966 2.80 123 4.9 8.5 12 14 26 45 60 90 238 -USGS 01491000 00060 68077 8 27 1948 2019 72 1958 3080 1966 2.30 104 5.1 8.1 12 13 25 44 62 96 323 -USGS 01491000 00060 68077 8 28 1948 2019 72 2011 8700 1966 2.10 198 6.4 8 11 13 23 41 56 81 920 -USGS 01491000 00060 68077 8 29 1948 2019 72 2011 6800 1966 1.50 164 6.7 8.3 12 14 22 42 64 117 654 -USGS 01491000 00060 68077 8 30 1948 2019 72 2011 3000 1966 1.90 94 6.4 8.5 11 12 22 45 62 119 383 -USGS 01491000 00060 68077 8 31 1948 2019 72 2011 914 1966 2.10 57 5.8 6.9 11 11 23 50 57 99 295 -USGS 01491000 00060 68077 9 1 1948 2019 72 2011 507 1966 2.50 48 5.4 7.8 11 13 24 52 61 97 203 -USGS 01491000 00060 68077 9 2 1948 2019 72 1952 328 1966 2.80 47 4.9 8 9.7 13 23 49 68 133 162 -USGS 01491000 00060 68077 9 3 1948 2019 72 2011 260 1966 2.30 46 4.6 7.9 12 13 24 51 58 131 181 -USGS 01491000 00060 68077 9 4 1948 2019 72 2000 250 1966 2.80 43 4.8 7.6 12 12 23 51 64 105 158 -USGS 01491000 00060 68077 9 5 1948 2019 72 2000 348 1966 2.50 42 5.1 8.1 12 14 24 49 58 94 148 -USGS 01491000 00060 68077 9 6 1948 2019 72 2000 253 1987 3.30 39 5.1 7.1 10 13 24 44 51 97 150 -USGS 01491000 00060 68077 9 7 1948 2019 72 2017 314 1995 4.90 42 6.4 7.4 10 12 24 41 47 80 196 -USGS 01491000 00060 68077 9 8 1948 2019 72 2011 467 1995 4.40 42 6.8 7.8 11 12 23 43 53 71 181 -USGS 01491000 00060 68077 9 9 1948 2019 72 2011 717 1966 4.90 43 5.6 6.9 11 12 21 43 51 73 134 -USGS 01491000 00060 68077 9 10 1948 2019 72 2011 705 2016 3.33 41 7.1 8.9 11 13 22 42 49 76 118 -USGS 01491000 00060 68077 9 11 1948 2019 72 1950 824 2016 2.03 52 6.4 8.8 12 13 23 45 56 89 222 -USGS 01491000 00060 68077 9 12 1948 2019 72 1960 1330 2016 5.55 80 7.1 8.8 12 13 20 50 55 106 625 -USGS 01491000 00060 68077 9 13 1948 2019 72 1960 3400 2016 4.77 100 7.4 8.8 12 14 19 43 51 123 392 -USGS 01491000 00060 68077 9 14 1948 2019 72 1960 1100 2016 3.23 61 7.4 9 11 13 21 40 49 184 288 -USGS 01491000 00060 68077 9 15 1948 2019 72 1960 640 1995 4.90 54 7.1 9.2 13 14 24 47 55 124 251 -USGS 01491000 00060 68077 9 16 1948 2019 72 1999 2600 2016 4.18 94 6.5 8.9 13 14 24 51 58 125 258 -USGS 01491000 00060 68077 9 17 1948 2019 72 1999 5600 1986 5.50 125 8.8 9.6 12 13 23 45 50 110 202 -USGS 01491000 00060 68077 9 18 1948 2019 72 1999 1890 1986 3.30 69 8.5 10 12 13 24 44 49 117 183 -USGS 01491000 00060 68077 9 19 1948 2019 72 2003 967 1966 6.80 65 8.7 11 13 13 23 42 58 140 291 -USGS 01491000 00060 68077 9 20 1948 2019 72 2003 1020 1966 8.40 63 9.7 10 12 12 23 42 49 176 293 -USGS 01491000 00060 68077 9 21 1948 2019 72 2003 568 1986 8.80 53 9.2 10 12 13 23 42 57 131 238 -USGS 01491000 00060 68077 9 22 1948 2019 72 2003 369 1986 9.00 48 9.7 10 12 13 22 52 72 110 216 -USGS 01491000 00060 68077 9 23 1948 2019 72 2003 328 2008 7.36 51 9 9.2 11 14 24 58 81 149 198 -USGS 01491000 00060 68077 9 24 1948 2019 72 1975 818 2008 7.80 63 9 10 11 13 22 49 79 149 343 -USGS 01491000 00060 68077 9 25 1948 2019 72 1975 1230 1970 7.80 68 9.1 10 12 13 23 47 54 128 324 -USGS 01491000 00060 68077 9 26 1948 2019 72 1975 872 1970 7.10 66 8.3 10 12 13 25 45 63 150 331 -USGS 01491000 00060 68077 9 27 1948 2019 72 2000 1170 1964 7.20 74 9.1 9.7 13 13 26 51 67 161 358 -USGS 01491000 00060 68077 9 28 1948 2019 72 1985 1180 2012 7.94 77 9 10 13 15 26 52 72 225 346 -USGS 01491000 00060 68077 9 29 1948 2019 72 1985 585 2012 7.03 67 9.1 11 13 15 27 58 87 213 296 -USGS 01491000 00060 68077 9 30 1948 2019 72 2016 881 2012 8.76 68 10 11 13 15 27 60 83 184 277 -USGS 01491000 00060 68077 10 1 1949 2020 72 2017 1060 2013 8.02 78 8.9 11 13 15 30 68 94 176 229 -USGS 01491000 00060 68077 10 2 1949 2020 72 2011 991 2008 7.91 72 9.2 11 13 14 29 75 115 176 241 -USGS 01491000 00060 68077 10 3 1949 2020 72 2016 426 2008 7.96 65 9.5 11 12 14 28 75 99 199 263 -USGS 01491000 00060 68077 10 4 1949 2020 72 1986 402 1963 8.00 59 9 10 13 14 28 67 88 148 241 -USGS 01491000 00060 68077 10 5 1949 2020 72 1986 348 1987 8.60 51 9.2 10 14 15 25 57 80 140 166 -USGS 01491000 00060 68077 10 6 1949 2020 72 1986 233 1987 7.30 46 9.3 11 14 14 26 67 77 112 155 -USGS 01491000 00060 68077 10 7 1949 2019 71 1972 225 1987 7.10 47 9.2 11 14 16 26 70 80 120 151 -USGS 01491000 00060 68077 10 8 1949 2019 71 1972 192 1987 5.80 45 9.8 10 14 15 28 69 86 96 150 -USGS 01491000 00060 68077 10 9 1949 2019 71 2017 392 1987 6.10 49 9.9 12 14 15 26 66 70 122 165 -USGS 01491000 00060 68077 10 10 1949 2019 71 2017 838 1987 8.10 59 11 12 14 15 28 60 69 113 168 -USGS 01491000 00060 68077 10 11 1949 2019 71 2017 506 1987 7.90 64 11 12 13 16 27 66 79 109 387 -USGS 01491000 00060 68077 10 12 1949 2019 71 2019 1240 2008 8.15 83 9.5 12 13 15 28 66 75 203 484 -USGS 01491000 00060 68077 10 13 1949 2019 71 2019 1500 2008 8.01 81 9.7 11 14 15 28 59 71 168 334 -USGS 01491000 00060 68077 10 14 1949 2019 71 2019 630 2008 8.67 63 9.8 12 14 16 27 57 68 110 322 -USGS 01491000 00060 68077 10 15 1949 2019 71 1980 480 2008 9.15 56 9.9 11 16 16 28 60 69 108 222 -USGS 01491000 00060 68077 10 16 1949 2019 71 1980 315 1988 8.80 50 9.7 12 15 17 31 56 75 119 156 -USGS 01491000 00060 68077 10 17 1949 2019 71 2019 226 2008 9.44 46 10 11 15 16 31 57 75 111 137 -USGS 01491000 00060 68077 10 18 1949 2019 71 2019 202 2009 8.20 46 10 11 14 17 30 60 74 114 146 -USGS 01491000 00060 68077 10 19 1949 2019 71 1997 438 2009 8.61 56 9.9 12 15 17 33 68 89 131 184 -USGS 01491000 00060 68077 10 20 1949 2019 71 1967 752 2009 8.74 70 10 12 16 18 30 75 95 126 259 -USGS 01491000 00060 68077 10 21 1949 2019 71 1967 857 1966 8.80 69 9.8 14 16 17 29 73 94 138 312 -USGS 01491000 00060 68077 10 22 1949 2019 71 1967 396 2008 8.29 59 9.4 13 17 19 29 73 91 147 247 -USGS 01491000 00060 68077 10 23 1949 2019 71 1967 231 2008 8.35 53 9 13 16 18 32 72 90 124 179 -USGS 01491000 00060 68077 10 24 1949 2019 71 1972 290 1966 8.40 54 9.9 12 15 17 31 79 86 139 167 -USGS 01491000 00060 68077 10 25 1949 2019 71 1972 1000 1966 8.40 66 10 12 18 20 38 71 81 137 158 -USGS 01491000 00060 68077 10 26 1949 2019 71 1972 1750 1966 8.40 80 12 13 18 19 35 73 85 143 171 -USGS 01491000 00060 68077 10 27 1949 2019 71 1972 2450 1966 8.00 94 13 14 18 20 37 73 98 137 244 -USGS 01491000 00060 68077 10 28 1949 2019 71 1972 1320 1966 8.40 90 14 15 18 19 34 81 95 132 385 -USGS 01491000 00060 68077 10 29 1949 2019 71 2010 1420 1966 8.20 97 14 15 19 20 33 87 106 183 412 -USGS 01491000 00060 68077 10 30 1949 2019 71 2013 3780 1966 8.00 137 13 15 19 21 35 87 117 266 499 -USGS 01491000 00060 68077 10 31 1949 2019 71 2013 2060 1966 8.40 101 12 14 19 23 41 83 106 236 341 -USGS 01491000 00060 68077 11 1 1949 2019 71 2013 626 1966 8.40 76 12 16 20 22 42 92 102 179 274 -USGS 01491000 00060 68077 11 2 1949 2019 71 1957 2050 1966 8.80 104 12 16 19 21 42 87 97 196 407 -USGS 01491000 00060 68077 11 3 1949 2019 71 1957 3730 1966 8.80 124 13 16 20 21 42 91 120 177 329 -USGS 01491000 00060 68077 11 4 1949 2019 71 1957 1920 1966 8.80 101 12 15 20 23 40 82 106 211 319 -USGS 01491000 00060 68077 11 5 1949 2019 71 1957 920 1966 9.20 87 13 16 22 26 40 87 115 199 352 -USGS 01491000 00060 68077 11 6 1949 2019 71 2019 1230 1966 9.20 92 14 17 22 26 42 88 114 166 365 -USGS 01491000 00060 68077 11 7 1949 2019 71 2004 1130 1966 9.20 97 15 17 24 25 49 92 104 195 351 -USGS 01491000 00060 68077 11 8 1949 2019 71 1952 1390 1988 9.80 111 15 17 21 24 56 107 125 234 480 -USGS 01491000 00060 68077 11 9 1949 2019 71 1952 1070 1966 10.0 107 15 17 20 24 47 116 173 264 465 -USGS 01491000 00060 68077 11 10 1949 2019 71 1973 587 1966 10.0 94 15 16 22 24 47 110 136 215 390 -USGS 01491000 00060 68077 11 11 1949 2019 71 2019 590 1966 10.0 82 15 18 25 30 51 92 122 173 293 -USGS 01491000 00060 68077 11 12 1949 2019 71 2019 403 1966 10.0 79 15 19 26 28 50 88 109 205 279 -USGS 01491000 00060 68077 11 13 1949 2019 71 2010 1570 1966 10.0 108 16 19 24 25 49 84 128 206 462 -USGS 01491000 00060 68077 11 14 1949 2019 71 2010 1260 1966 10.0 121 16 20 24 29 51 94 127 378 523 -USGS 01491000 00060 68077 11 15 1949 2019 71 1973 1430 1966 12.0 119 16 18 26 31 52 103 139 339 524 -USGS 01491000 00060 68077 11 16 1949 2019 71 2019 1420 1966 11.0 115 15 19 26 31 49 98 115 254 462 -USGS 01491000 00060 68077 11 17 1949 2019 71 2019 1210 1966 12.0 114 16 19 24 29 51 100 135 229 559 -USGS 01491000 00060 68077 11 18 1949 2019 71 2003 1550 1966 12.0 110 16 19 24 28 53 100 136 226 449 -USGS 01491000 00060 68077 11 19 1949 2019 71 2003 888 1966 12.0 95 16 20 27 30 53 98 131 191 394 -USGS 01491000 00060 68077 11 20 1949 2019 71 2004 571 1966 11.0 91 16 22 27 30 52 88 117 224 440 -USGS 01491000 00060 68077 11 21 1949 2019 71 1973 944 1966 11.0 99 17 21 27 34 52 96 112 208 358 -USGS 01491000 00060 68077 11 22 1949 2019 71 1973 633 1966 12.0 100 15 22 27 32 55 108 116 271 412 -USGS 01491000 00060 68077 11 23 1949 2019 71 1953 832 1965 12.0 107 15 22 27 31 59 105 123 312 420 -USGS 01491000 00060 68077 11 24 1949 2019 71 2007 711 1965 12.0 100 14 21 27 31 55 110 138 276 338 -USGS 01491000 00060 68077 11 25 1949 2019 71 2019 1190 1966 12.0 112 14 21 27 29 58 120 152 275 356 -USGS 01491000 00060 68077 11 26 1949 2019 71 2019 1120 1966 12.0 133 15 23 29 31 63 124 142 272 664 -USGS 01491000 00060 68077 11 27 1949 2019 71 2019 891 1966 12.0 123 17 23 28 30 68 150 165 288 436 -USGS 01491000 00060 68077 11 28 1949 2019 71 2019 669 1966 12.0 112 19 23 27 31 66 174 189 244 315 -USGS 01491000 00060 68077 11 29 1949 2019 71 1949 745 1966 12.0 114 18 23 30 38 80 148 180 244 401 -USGS 01491000 00060 68077 11 30 1949 2019 71 1949 1220 1966 12.0 123 19 24 30 40 83 150 169 230 334 -USGS 01491000 00060 68077 12 1 1949 2019 71 1949 658 1966 12.0 114 19 26 31 38 78 143 172 239 422 -USGS 01491000 00060 68077 12 2 1949 2019 71 1973 680 1966 12.0 113 18 23 32 36 84 151 172 259 345 -USGS 01491000 00060 68077 12 3 1949 2019 71 2010 861 1966 12.0 120 19 25 31 34 77 132 156 231 454 -USGS 01491000 00060 68077 12 4 1949 2019 71 2010 1080 1966 12.0 122 19 26 30 35 79 138 153 273 415 -USGS 01491000 00060 68077 12 5 1949 2019 71 1949 1440 1966 12.0 126 19 26 30 42 82 137 156 250 437 -USGS 01491000 00060 68077 12 6 1949 2019 71 1949 924 1966 12.0 129 19 28 34 43 92 139 153 238 494 -USGS 01491000 00060 68077 12 7 1949 2019 71 2010 745 1966 12.0 138 19 28 30 50 93 145 173 318 589 -USGS 01491000 00060 68077 12 8 1949 2019 71 2012 3360 1966 11.0 198 21 26 32 54 92 151 183 284 669 -USGS 01491000 00060 68077 12 9 1949 2019 71 2012 1980 1966 12.0 190 24 25 38 52 87 155 183 451 1020 -USGS 01491000 00060 68077 12 10 1949 2019 71 2010 3050 1966 12.0 198 21 25 40 46 94 149 170 447 926 -USGS 01491000 00060 68077 12 11 1949 2019 71 2010 1060 1966 12.0 161 23 25 41 52 99 170 198 442 688 -USGS 01491000 00060 68077 12 12 1949 2019 71 2004 1000 1966 12.0 162 23 27 43 52 103 174 230 442 551 -USGS 01491000 00060 68077 12 13 1949 2019 71 1968 1010 1966 14.0 166 24 28 40 52 99 184 255 401 615 -USGS 01491000 00060 68077 12 14 1949 2019 71 1997 3250 1966 19.0 206 23 29 39 56 95 162 191 418 707 -USGS 01491000 00060 68077 12 15 1949 2019 71 1997 3760 1966 17.0 220 24 28 40 62 97 170 211 441 973 -USGS 01491000 00060 68077 12 16 1949 2019 71 1997 1370 1966 14.0 202 25 28 50 60 100 224 360 565 754 -USGS 01491000 00060 68077 12 17 1949 2019 71 2019 1490 1966 13.0 192 24 28 54 62 101 251 301 490 690 -USGS 01491000 00060 68077 12 18 1949 2019 71 2019 804 1966 13.0 166 24 31 56 62 100 202 271 401 612 -USGS 01491000 00060 68077 12 19 1949 2019 71 1978 1380 1966 12.0 165 25 32 48 58 98 182 241 346 555 -USGS 01491000 00060 68077 12 20 1949 2019 71 1978 1240 1966 12.0 159 24 32 51 58 97 188 217 286 611 -USGS 01491000 00060 68077 12 21 1949 2019 71 1952 1500 1966 12.0 167 24 35 53 61 96 184 212 331 612 -USGS 01491000 00060 68077 12 22 1949 2019 71 1952 3140 1966 12.0 206 23 34 56 63 90 201 252 390 683 -USGS 01491000 00060 68077 12 23 1949 2019 71 1952 1440 1966 12.0 187 23 39 54 60 101 219 296 435 674 -USGS 01491000 00060 68077 12 24 1949 2019 71 1973 1060 1966 12.0 173 26 38 58 66 114 216 266 448 494 -USGS 01491000 00060 68077 12 25 1949 2019 71 1987 1330 1966 14.0 188 26 35 56 63 109 214 259 401 649 -USGS 01491000 00060 68077 12 26 1949 2019 71 2010 1480 1999 20.0 199 27 32 52 58 102 209 256 452 811 -USGS 01491000 00060 68077 12 27 1949 2019 71 2010 2740 1966 19.0 216 25 34 51 56 108 212 244 426 759 -USGS 01491000 00060 68077 12 28 1949 2019 71 2010 1160 1966 14.0 171 25 37 53 62 105 186 229 368 606 -USGS 01491000 00060 68077 12 29 1949 2019 71 2019 1430 1966 12.0 167 24 40 59 63 107 189 232 364 518 -USGS 01491000 00060 68077 12 30 1949 2019 71 2019 869 1966 12.0 173 25 37 63 74 105 215 259 377 597 -USGS 01491000 00060 68077 12 31 1949 2019 71 1949 1570 1966 12.0 189 24 37 58 64 102 223 243 447 626 -USGS 01491000 00095 68080 1 1 2011 2012 2 2011 152 2012 122 137 137 -USGS 01491000 00095 68080 1 2 2011 2012 2 2011 157 2012 125 141 141 -USGS 01491000 00095 68080 1 3 2011 2012 2 2011 151 2012 127 139 139 -USGS 01491000 00095 68080 1 4 2011 2012 2 2011 137 2012 129 133 133 -USGS 01491000 00095 68080 1 5 2011 2012 2 2011 140 2012 132 136 136 -USGS 01491000 00095 68080 1 6 2011 2012 2 2011 151 2012 133 142 142 -USGS 01491000 00095 68080 1 7 2011 2012 2 2011 145 2012 134 140 140 -USGS 01491000 00095 68080 1 8 2011 2012 2 2011 146 2012 134 140 140 -USGS 01491000 00095 68080 1 9 2011 2012 2 2011 147 2012 133 140 140 -USGS 01491000 00095 68080 1 10 2011 2012 2 2011 149 2012 132 141 141 -USGS 01491000 00095 68080 1 11 2011 2012 2 2011 151 2012 132 141 141 -USGS 01491000 00095 68080 1 12 2011 2012 2 2011 150 2012 130 140 140 -USGS 01491000 00095 68080 1 13 2011 2012 2 2011 151 2012 121 136 136 -USGS 01491000 00095 68080 1 14 2011 2012 2 2011 151 2012 115 133 133 -USGS 01491000 00095 68080 1 15 2011 2012 2 2011 152 2012 116 134 134 -USGS 01491000 00095 68080 1 16 2011 2012 2 2011 154 2012 121 138 138 -USGS 01491000 00095 68080 1 17 2011 2012 2 2011 155 2012 124 140 140 -USGS 01491000 00095 68080 1 18 2011 2012 2 2011 156 2012 126 141 141 -USGS 01491000 00095 68080 1 19 2011 2012 2 2011 160 2012 125 142 142 -USGS 01491000 00095 68080 1 20 2011 2012 2 2011 199 2012 126 163 163 -USGS 01491000 00095 68080 1 21 2011 2012 2 2011 184 2012 127 155 155 -USGS 01491000 00095 68080 1 22 2011 2012 2 2011 169 2012 131 150 150 -USGS 01491000 00095 68080 1 23 2011 2012 2 2011 163 2012 137 150 150 -USGS 01491000 00095 68080 1 24 2011 2012 2 2011 163 2012 137 150 150 -USGS 01491000 00095 68080 1 25 2011 2012 2 2011 159 2012 134 146 146 -USGS 01491000 00095 68080 1 26 2011 2012 2 2011 154 2012 132 143 143 -USGS 01491000 00095 68080 1 27 2011 2012 2 2011 144 2012 132 138 138 -USGS 01491000 00095 68080 1 28 2011 2012 2 2011 147 2012 133 140 140 -USGS 01491000 00095 68080 1 29 2011 2012 2 2011 149 2012 134 141 141 -USGS 01491000 00095 68080 1 30 2011 2012 2 2011 150 2012 135 142 142 -USGS 01491000 00095 68080 1 31 2011 2012 2 2011 148 2012 136 142 142 -USGS 01491000 00095 68080 2 1 2011 2012 2 2011 147 2012 137 142 142 -USGS 01491000 00095 68080 2 2 2011 2012 2 2011 143 2012 137 140 140 -USGS 01491000 00095 68080 2 3 2011 2012 2 2012 137 2011 118 128 128 -USGS 01491000 00095 68080 2 4 2011 2012 2 2012 138 2011 113 126 126 -USGS 01491000 00095 68080 2 5 2011 2012 2 2012 137 2011 122 130 130 -USGS 01491000 00095 68080 2 6 2011 2012 2 2012 136 2011 129 133 133 -USGS 01491000 00095 68080 2 7 2011 2012 2 2012 137 2011 135 136 136 -USGS 01491000 00095 68080 2 8 2011 2012 2 2012 137 2011 134 136 136 -USGS 01491000 00095 68080 2 9 2011 2012 2 2012 137 2011 134 136 136 -USGS 01491000 00095 68080 2 10 2011 2012 2 2012 138 2011 135 137 137 -USGS 01491000 00095 68080 2 11 2011 2012 2 2012 138 2011 137 138 138 -USGS 01491000 00095 68080 2 12 2011 2012 2 2011 138 2011 138 138 138 -USGS 01491000 00095 68080 2 13 2011 2012 2 2011 138 2011 138 138 138 -USGS 01491000 00095 68080 2 14 2011 2012 2 2012 139 2011 138 139 139 -USGS 01491000 00095 68080 2 15 2011 2012 2 2012 139 2011 137 138 138 -USGS 01491000 00095 68080 2 16 2011 2012 2 2012 140 2011 138 139 139 -USGS 01491000 00095 68080 2 17 2011 2012 2 2012 139 2011 138 139 139 -USGS 01491000 00095 68080 2 18 2011 2012 2 2012 140 2011 139 140 140 -USGS 01491000 00095 68080 2 19 2011 2012 2 2012 140 2011 139 140 140 -USGS 01491000 00095 68080 2 20 2011 2012 2 2012 140 2011 139 140 140 -USGS 01491000 00095 68080 2 21 2011 2012 2 2012 142 2011 138 140 140 -USGS 01491000 00095 68080 2 22 2011 2012 2 2012 141 2011 135 138 138 -USGS 01491000 00095 68080 2 23 2011 2011 1 2011 135 2011 135 135 135 -USGS 01491000 00095 68080 2 24 2011 2012 2 2012 143 2011 137 140 140 -USGS 01491000 00095 68080 2 25 2011 2012 2 2011 139 2012 135 137 137 -USGS 01491000 00095 68080 2 26 2011 2012 2 2011 150 2012 126 138 138 -USGS 01491000 00095 68080 2 27 2011 2012 2 2011 155 2012 129 142 142 -USGS 01491000 00095 68080 2 28 2011 2012 2 2011 145 2012 132 139 139 -USGS 01491000 00095 68080 2 29 2012 2012 1 2012 131 2012 131 131 131 -USGS 01491000 00095 68080 3 1 2011 2012 2 2011 135 2012 109 122 122 -USGS 01491000 00095 68080 3 2 2011 2012 2 2011 139 2012 89 114 114 -USGS 01491000 00095 68080 3 3 2011 2012 2 2011 129 2012 94 112 112 -USGS 01491000 00095 68080 3 4 2011 2012 2 2011 129 2012 95 112 112 -USGS 01491000 00095 68080 3 5 2011 2012 2 2011 131 2012 97 114 114 -USGS 01491000 00095 68080 3 6 2011 2012 2 2011 130 2012 106 118 118 -USGS 01491000 00095 68080 3 7 2011 2012 2 2011 120 2012 113 117 117 -USGS 01491000 00095 68080 3 8 2011 2012 2 2012 120 2011 110 115 115 -USGS 01491000 00095 68080 3 9 2011 2012 2 2012 124 2011 112 118 118 -USGS 01491000 00095 68080 3 10 2011 2012 2 2012 127 2011 118 122 122 -USGS 01491000 00095 68080 3 11 2011 2012 2 2012 129 2011 117 123 123 -USGS 01491000 00095 68080 3 12 2011 2012 2 2012 132 2011 113 122 122 -USGS 01491000 00095 68080 3 13 2011 2012 2 2012 134 2011 112 123 123 -USGS 01491000 00095 68080 3 14 2011 2012 2 2012 134 2011 116 125 125 -USGS 01491000 00095 68080 3 15 2011 2012 2 2012 136 2011 120 128 128 -USGS 01491000 00095 68080 3 16 2011 2012 2 2012 137 2011 119 128 128 -USGS 01491000 00095 68080 3 17 2012 2012 1 2012 137 2012 137 137 137 -USGS 01491000 00095 68080 3 18 2012 2012 1 2012 137 2012 137 137 137 -USGS 01491000 00095 68080 3 19 2012 2012 1 2012 138 2012 138 138 138 -USGS 01491000 00095 68080 3 20 2012 2012 1 2012 139 2012 139 139 139 -USGS 01491000 00095 68080 3 21 2012 2012 1 2012 140 2012 140 140 140 -USGS 01491000 00095 68080 3 22 2012 2012 1 2012 141 2012 141 141 141 -USGS 01491000 00095 68080 3 23 2012 2012 1 2012 141 2012 141 141 141 -USGS 01491000 00095 68080 3 24 2012 2012 1 2012 141 2012 141 141 141 -USGS 01491000 00095 68080 3 25 2012 2012 1 2012 141 2012 141 141 141 -USGS 01491000 00095 68080 3 26 2012 2012 1 2012 140 2012 140 140 140 -USGS 01491000 00095 68080 3 27 2012 2012 1 2012 140 2012 140 140 140 -USGS 01491000 00095 68080 3 28 2012 2012 1 2012 140 2012 140 140 140 -USGS 01491000 00095 68080 3 29 2012 2012 1 2012 140 2012 140 140 140 -USGS 01491000 00095 68080 3 30 2012 2012 1 2012 140 2012 140 140 140 -USGS 01491000 00095 68080 3 31 2012 2012 1 2012 141 2012 141 141 141 -USGS 01491000 00095 68080 4 1 2012 2012 1 2012 141 2012 141 141 141 -USGS 01491000 00095 68080 4 2 2012 2012 1 2012 139 2012 139 139 139 -USGS 01491000 00095 68080 4 3 2012 2012 1 2012 140 2012 140 140 140 -USGS 01491000 00095 68080 4 4 2012 2012 1 2012 139 2012 139 139 139 -USGS 01491000 00095 68080 4 5 2012 2012 1 2012 141 2012 141 141 141 -USGS 01491000 00095 68080 4 6 2012 2012 1 2012 141 2012 141 141 141 -USGS 01491000 00095 68080 4 7 2012 2012 1 2012 141 2012 141 141 141 -USGS 01491000 00095 68080 4 8 2012 2012 1 2012 142 2012 142 142 142 -USGS 01491000 00095 68080 4 9 2012 2012 1 2012 142 2012 142 142 142 -USGS 01491000 00095 68080 4 10 2012 2012 1 2012 143 2012 143 143 143 -USGS 01491000 00095 68080 4 11 2012 2012 1 2012 143 2012 143 143 143 -USGS 01491000 00095 68080 4 12 2012 2012 1 2012 144 2012 144 144 144 -USGS 01491000 00095 68080 4 13 2012 2012 1 2012 145 2012 145 145 145 -USGS 01491000 00095 68080 4 14 2012 2012 1 2012 145 2012 145 145 145 -USGS 01491000 00095 68080 4 15 2012 2012 1 2012 145 2012 145 145 145 -USGS 01491000 00095 68080 4 16 2012 2012 1 2012 144 2012 144 144 144 -USGS 01491000 00095 68080 4 17 2012 2012 1 2012 145 2012 145 145 145 -USGS 01491000 00095 68080 4 18 2012 2012 1 2012 145 2012 145 145 145 -USGS 01491000 00095 68080 4 19 2012 2012 1 2012 146 2012 146 146 146 -USGS 01491000 00095 68080 4 20 2012 2012 1 2012 145 2012 145 145 145 -USGS 01491000 00095 68080 4 21 2012 2012 1 2012 145 2012 145 145 145 -USGS 01491000 00095 68080 4 22 2012 2012 1 2012 141 2012 141 141 141 -USGS 01491000 00095 68080 4 23 2012 2012 1 2012 138 2012 138 138 138 -USGS 01491000 00095 68080 4 24 2012 2012 1 2012 135 2012 135 135 135 -USGS 01491000 00095 68080 4 25 2012 2012 1 2012 135 2012 135 135 135 -USGS 01491000 00095 68080 4 26 2012 2012 1 2012 137 2012 137 137 137 -USGS 01491000 00095 68080 4 27 2012 2012 1 2012 139 2012 139 139 139 -USGS 01491000 00095 68080 4 28 2011 2012 2 2012 142 2011 122 132 132 -USGS 01491000 00095 68080 4 29 2011 2012 2 2012 143 2011 125 134 134 -USGS 01491000 00095 68080 4 30 2011 2012 2 2012 146 2011 128 137 137 -USGS 01491000 00095 68080 5 1 2011 2012 2 2012 144 2011 131 138 138 -USGS 01491000 00095 68080 5 2 2011 2012 2 2012 146 2011 133 140 140 -USGS 01491000 00095 68080 5 3 2011 2012 2 2012 150 2011 134 142 142 -USGS 01491000 00095 68080 5 4 2011 2012 2 2012 151 2011 132 141 141 -USGS 01491000 00095 68080 5 5 2011 2012 2 2012 151 2011 132 141 141 -USGS 01491000 00095 68080 5 6 2011 2012 2 2012 151 2011 132 141 141 -USGS 01491000 00095 68080 5 7 2011 2012 2 2012 151 2011 133 142 142 -USGS 01491000 00095 68080 5 8 2011 2012 2 2012 153 2011 134 143 143 -USGS 01491000 00095 68080 5 9 2011 2012 2 2012 154 2011 135 144 144 -USGS 01491000 00095 68080 5 10 2011 2011 1 2011 137 2011 137 137 137 -USGS 01491000 00095 68080 5 11 2011 2011 1 2011 138 2011 138 138 138 -USGS 01491000 00095 68080 5 12 2011 2011 1 2011 138 2011 138 138 138 -USGS 01491000 00095 68080 5 13 2011 2011 1 2011 139 2011 139 139 139 -USGS 01491000 00095 68080 5 14 2011 2011 1 2011 140 2011 140 140 140 -USGS 01491000 00095 68080 5 15 2011 2011 1 2011 138 2011 138 138 138 -USGS 01491000 00095 68080 5 16 2011 2011 1 2011 136 2011 136 136 136 -USGS 01491000 00095 68080 5 17 2011 2011 1 2011 139 2011 139 139 139 -USGS 01491000 00095 68080 5 18 2011 2011 1 2011 141 2011 141 141 141 -USGS 01491000 00095 68080 5 19 2011 2011 1 2011 142 2011 142 142 142 -USGS 01491000 00095 68080 5 20 2011 2011 1 2011 139 2011 139 139 139 -USGS 01491000 00095 68080 5 21 2011 2011 1 2011 139 2011 139 139 139 -USGS 01491000 00095 68080 5 22 2011 2011 1 2011 138 2011 138 138 138 -USGS 01491000 00095 68080 5 23 2011 2011 1 2011 139 2011 139 139 139 -USGS 01491000 00095 68080 5 24 2011 2011 1 2011 141 2011 141 141 141 -USGS 01491000 00095 68080 5 25 2011 2011 1 2011 140 2011 140 140 140 -USGS 01491000 00095 68080 5 26 2011 2011 1 2011 141 2011 141 141 141 -USGS 01491000 00095 68080 5 27 2011 2011 1 2011 142 2011 142 142 142 -USGS 01491000 00095 68080 5 28 2011 2011 1 2011 143 2011 143 143 143 -USGS 01491000 00095 68080 5 29 2011 2011 1 2011 143 2011 143 143 143 -USGS 01491000 00095 68080 5 30 2011 2011 1 2011 143 2011 143 143 143 -USGS 01491000 00095 68080 5 31 2011 2011 1 2011 143 2011 143 143 143 -USGS 01491000 00095 68080 6 1 2011 2011 1 2011 143 2011 143 143 143 -USGS 01491000 00095 68080 6 2 2011 2011 1 2011 144 2011 144 144 144 -USGS 01491000 00095 68080 6 3 2011 2011 1 2011 147 2011 147 147 147 -USGS 01491000 00095 68080 6 4 2011 2011 1 2011 149 2011 149 149 149 -USGS 01491000 00095 68080 6 5 2011 2011 1 2011 150 2011 150 150 150 -USGS 01491000 00095 68080 6 6 2011 2011 1 2011 150 2011 150 150 150 -USGS 01491000 00095 68080 6 7 2011 2011 1 2011 150 2011 150 150 150 -USGS 01491000 00095 68080 6 8 2011 2011 1 2011 150 2011 150 150 150 -USGS 01491000 00095 68080 6 9 2011 2011 1 2011 149 2011 149 149 149 -USGS 01491000 00095 68080 6 10 2011 2011 1 2011 148 2011 148 148 148 -USGS 01491000 00095 68080 6 11 2011 2011 1 2011 145 2011 145 145 145 -USGS 01491000 00095 68080 6 12 2011 2011 1 2011 141 2011 141 141 141 -USGS 01491000 00095 68080 6 13 2011 2011 1 2011 140 2011 140 140 140 -USGS 01491000 00095 68080 6 14 2011 2011 1 2011 140 2011 140 140 140 -USGS 01491000 00095 68080 6 15 2011 2011 1 2011 140 2011 140 140 140 -USGS 01491000 00095 68080 6 16 2011 2011 1 2011 140 2011 140 140 140 -USGS 01491000 00095 68080 6 17 2011 2011 1 2011 143 2011 143 143 143 -USGS 01491000 00095 68080 6 18 2011 2011 1 2011 147 2011 147 147 147 -USGS 01491000 00095 68080 6 19 2011 2011 1 2011 149 2011 149 149 149 -USGS 01491000 00095 68080 6 20 2011 2011 1 2011 149 2011 149 149 149 -USGS 01491000 00095 68080 6 21 2011 2011 1 2011 149 2011 149 149 149 -USGS 01491000 00095 68080 6 22 2011 2011 1 2011 147 2011 147 147 147 -USGS 01491000 00095 68080 6 23 2011 2011 1 2011 147 2011 147 147 147 -USGS 01491000 00095 68080 6 24 2011 2011 1 2011 151 2011 151 151 151 -USGS 01491000 00095 68080 6 25 2011 2011 1 2011 155 2011 155 155 155 -USGS 01491000 00095 68080 6 26 2011 2011 1 2011 158 2011 158 158 158 -USGS 01491000 00095 68080 6 27 2011 2011 1 2011 162 2011 162 162 162 -USGS 01491000 00095 68080 6 28 2011 2011 1 2011 162 2011 162 162 162 -USGS 01491000 00095 68080 6 29 2011 2011 1 2011 162 2011 162 162 162 -USGS 01491000 00095 68080 6 30 2011 2011 1 2011 165 2011 165 165 165 -USGS 01491000 00095 68080 7 1 2011 2011 1 2011 165 2011 165 165 165 -USGS 01491000 00095 68080 7 3 2011 2011 1 2011 168 2011 168 168 168 -USGS 01491000 00095 68080 7 4 2011 2011 1 2011 160 2011 160 160 160 -USGS 01491000 00095 68080 7 5 2011 2011 1 2011 163 2011 163 163 163 -USGS 01491000 00095 68080 7 6 2011 2011 1 2011 162 2011 162 162 162 -USGS 01491000 00095 68080 7 7 2011 2011 1 2011 160 2011 160 160 160 -USGS 01491000 00095 68080 7 8 2011 2011 1 2011 155 2011 155 155 155 -USGS 01491000 00095 68080 7 9 2011 2011 1 2011 130 2011 130 130 130 -USGS 01491000 00095 68080 7 10 2011 2011 1 2011 136 2011 136 136 136 -USGS 01491000 00095 68080 7 11 2011 2011 1 2011 142 2011 142 142 142 -USGS 01491000 00095 68080 7 12 2011 2011 1 2011 148 2011 148 148 148 -USGS 01491000 00095 68080 7 13 2011 2011 1 2011 153 2011 153 153 153 -USGS 01491000 00095 68080 7 14 2011 2011 1 2011 154 2011 154 154 154 -USGS 01491000 00095 68080 7 15 2011 2011 1 2011 161 2011 161 161 161 -USGS 01491000 00095 68080 7 16 2011 2011 1 2011 159 2011 159 159 159 -USGS 01491000 00095 68080 7 21 2011 2011 1 2011 99 2011 99 99 99 -USGS 01491000 00095 68080 7 22 2011 2011 1 2011 116 2011 116 116 116 -USGS 01491000 00095 68080 7 23 2011 2011 1 2011 127 2011 127 127 127 -USGS 01491000 00095 68080 7 24 2011 2011 1 2011 136 2011 136 136 136 -USGS 01491000 00095 68080 7 25 2011 2011 1 2011 142 2011 142 142 142 -USGS 01491000 00095 68080 7 26 2011 2011 1 2011 152 2011 152 152 152 -USGS 01491000 00095 68080 8 3 2011 2011 1 2011 161 2011 161 161 161 -USGS 01491000 00095 68080 8 4 2011 2011 1 2011 163 2011 163 163 163 -USGS 01491000 00095 68080 8 5 2011 2011 1 2011 165 2011 165 165 165 -USGS 01491000 00095 68080 8 6 2011 2011 1 2011 166 2011 166 166 166 -USGS 01491000 00095 68080 8 7 2011 2011 1 2011 167 2011 167 167 167 -USGS 01491000 00095 68080 8 8 2011 2011 1 2011 168 2011 168 168 168 -USGS 01491000 00095 68080 8 14 2011 2011 1 2011 121 2011 121 121 121 -USGS 01491000 00095 68080 8 15 2011 2011 1 2011 104 2011 104 104 104 -USGS 01491000 00095 68080 8 16 2011 2011 1 2011 94 2011 94 94 94 -USGS 01491000 00095 68080 8 17 2011 2011 1 2011 98 2011 98 98 98 -USGS 01491000 00095 68080 8 18 2011 2011 1 2011 118 2011 118 118 118 -USGS 01491000 00095 68080 8 19 2011 2011 1 2011 127 2011 127 127 127 -USGS 01491000 00095 68080 8 20 2011 2011 1 2011 104 2011 104 104 104 -USGS 01491000 00095 68080 8 21 2011 2011 1 2011 96 2011 96 96 96 -USGS 01491000 00095 68080 8 22 2011 2011 1 2011 118 2011 118 118 118 -USGS 01491000 00095 68080 8 23 2011 2011 1 2011 134 2011 134 134 134 -USGS 01491000 00095 68080 8 24 2011 2011 1 2011 142 2011 142 142 142 -USGS 01491000 00095 68080 8 25 2011 2011 1 2011 144 2011 144 144 144 -USGS 01491000 00095 68080 8 26 2011 2011 1 2011 137 2011 137 137 137 -USGS 01491000 00095 68080 8 27 2011 2011 1 2011 114 2011 114 114 114 -USGS 01491000 00095 68080 8 28 2011 2011 1 2011 36 2011 36 36 36 -USGS 01491000 00095 68080 8 29 2011 2011 1 2011 39 2011 39 39 39 -USGS 01491000 00095 68080 8 30 2011 2011 1 2011 55 2011 55 55 55 -USGS 01491000 00095 68080 8 31 2011 2011 1 2011 74 2011 74 74 74 -USGS 01491000 00095 68080 9 1 2011 2011 1 2011 94 2011 94 94 94 -USGS 01491000 00095 68080 9 2 2011 2011 1 2011 109 2011 109 109 109 -USGS 01491000 00095 68080 9 3 2011 2011 1 2011 119 2011 119 119 119 -USGS 01491000 00095 68080 9 4 2011 2011 1 2011 126 2011 126 126 126 -USGS 01491000 00095 68080 9 5 2011 2011 1 2011 132 2011 132 132 132 -USGS 01491000 00095 68080 9 6 2011 2011 1 2011 134 2011 134 134 134 -USGS 01491000 00095 68080 9 7 2011 2011 1 2011 132 2011 132 132 132 -USGS 01491000 00095 68080 9 8 2011 2011 1 2011 118 2011 118 118 118 -USGS 01491000 00095 68080 9 9 2011 2011 1 2011 108 2011 108 108 108 -USGS 01491000 00095 68080 9 10 2011 2011 1 2011 103 2011 103 103 103 -USGS 01491000 00095 68080 9 11 2011 2011 1 2011 108 2011 108 108 108 -USGS 01491000 00095 68080 9 12 2011 2011 1 2011 115 2011 115 115 115 -USGS 01491000 00095 68080 9 13 2011 2011 1 2011 119 2011 119 119 119 -USGS 01491000 00095 68080 9 14 2011 2011 1 2011 125 2011 125 125 125 -USGS 01491000 00095 68080 9 15 2011 2011 1 2011 128 2011 128 128 128 -USGS 01491000 00095 68080 9 16 2011 2011 1 2011 132 2011 132 132 132 -USGS 01491000 00095 68080 9 17 2011 2011 1 2011 134 2011 134 134 134 -USGS 01491000 00095 68080 9 18 2011 2011 1 2011 136 2011 136 136 136 -USGS 01491000 00095 68080 9 19 2011 2011 1 2011 138 2011 138 138 138 -USGS 01491000 00095 68080 9 20 2011 2011 1 2011 138 2011 138 138 138 -USGS 01491000 00095 68080 9 21 2011 2011 1 2011 139 2011 139 139 139 -USGS 01491000 00095 68080 9 22 2011 2011 1 2011 139 2011 139 139 139 -USGS 01491000 00095 68080 9 23 2011 2011 1 2011 139 2011 139 139 139 -USGS 01491000 00095 68080 9 24 2011 2011 1 2011 136 2011 136 136 136 -USGS 01491000 00095 68080 9 25 2011 2011 1 2011 134 2011 134 134 134 -USGS 01491000 00095 68080 9 26 2011 2011 1 2011 133 2011 133 133 133 -USGS 01491000 00095 68080 9 27 2011 2011 1 2011 134 2011 134 134 134 -USGS 01491000 00095 68080 9 28 2011 2011 1 2011 122 2011 122 122 122 -USGS 01491000 00095 68080 9 29 2011 2011 1 2011 112 2011 112 112 112 -USGS 01491000 00095 68080 9 30 2011 2011 1 2011 118 2011 118 118 118 -USGS 01491000 00095 68080 10 1 2011 2012 2 2012 121 2011 107 114 114 -USGS 01491000 00095 68080 10 2 2011 2012 2 2012 126 2011 81 103 103 -USGS 01491000 00095 68080 10 3 2011 2012 2 2012 129 2011 98 114 114 -USGS 01491000 00095 68080 10 4 2011 2012 2 2012 131 2011 121 126 126 -USGS 01491000 00095 68080 10 5 2011 2012 2 2011 140 2012 132 136 136 -USGS 01491000 00095 68080 10 6 2011 2012 2 2011 151 2012 134 142 142 -USGS 01491000 00095 68080 10 7 2011 2012 2 2011 156 2012 135 145 145 -USGS 01491000 00095 68080 10 8 2011 2012 2 2011 159 2012 136 147 147 -USGS 01491000 00095 68080 10 9 2011 2012 2 2011 161 2012 138 149 149 -USGS 01491000 00095 68080 10 10 2011 2012 2 2011 161 2012 140 150 150 -USGS 01491000 00095 68080 10 11 2011 2012 2 2011 162 2012 141 151 151 -USGS 01491000 00095 68080 10 12 2011 2012 2 2011 162 2012 141 151 151 -USGS 01491000 00095 68080 10 13 2011 2012 2 2011 163 2012 141 152 152 -USGS 01491000 00095 68080 10 14 2011 2012 2 2011 161 2012 142 151 151 -USGS 01491000 00095 68080 10 15 2011 2012 2 2011 159 2012 142 150 150 -USGS 01491000 00095 68080 10 16 2011 2012 2 2011 158 2012 143 150 150 -USGS 01491000 00095 68080 10 17 2011 2012 2 2011 158 2012 144 151 151 -USGS 01491000 00095 68080 10 18 2011 2012 2 2011 160 2012 145 152 152 -USGS 01491000 00095 68080 10 19 2011 2012 2 2011 162 2012 145 153 153 -USGS 01491000 00095 68080 10 20 2011 2012 2 2011 161 2012 144 152 152 -USGS 01491000 00095 68080 10 21 2011 2012 2 2011 163 2012 145 154 154 -USGS 01491000 00095 68080 10 22 2011 2012 2 2011 165 2012 145 155 155 -USGS 01491000 00095 68080 10 23 2011 2012 2 2011 165 2012 146 155 155 -USGS 01491000 00095 68080 10 24 2011 2012 2 2011 165 2012 147 156 156 -USGS 01491000 00095 68080 10 25 2011 2012 2 2011 165 2012 147 156 156 -USGS 01491000 00095 68080 10 26 2011 2012 2 2011 165 2012 147 156 156 -USGS 01491000 00095 68080 10 27 2011 2012 2 2011 163 2012 147 155 155 -USGS 01491000 00095 68080 10 28 2011 2012 2 2011 162 2012 146 154 154 -USGS 01491000 00095 68080 10 29 2011 2012 2 2011 162 2012 144 153 153 -USGS 01491000 00095 68080 10 30 2011 2012 2 2011 163 2012 137 150 150 -USGS 01491000 00095 68080 10 31 2011 2012 2 2011 164 2012 130 147 147 -USGS 01491000 00095 68080 11 1 2011 2012 2 2011 165 2012 130 147 147 -USGS 01491000 00095 68080 11 2 2011 2012 2 2011 166 2012 134 150 150 -USGS 01491000 00095 68080 11 3 2011 2012 2 2011 167 2012 136 151 151 -USGS 01491000 00095 68080 11 4 2011 2012 2 2011 161 2012 138 149 149 -USGS 01491000 00095 68080 11 5 2011 2012 2 2011 157 2012 139 148 148 -USGS 01491000 00095 68080 11 6 2011 2012 2 2011 152 2012 140 146 146 -USGS 01491000 00095 68080 11 7 2011 2012 2 2011 149 2012 141 145 145 -USGS 01491000 00095 68080 11 8 2011 2012 2 2011 150 2012 142 146 146 -USGS 01491000 00095 68080 11 9 2011 2012 2 2011 153 2012 142 147 147 -USGS 01491000 00095 68080 11 10 2011 2012 2 2011 155 2012 142 148 148 -USGS 01491000 00095 68080 11 11 2011 2012 2 2011 156 2012 142 149 149 -USGS 01491000 00095 68080 11 12 2011 2012 2 2011 155 2012 142 148 148 -USGS 01491000 00095 68080 11 13 2011 2012 2 2011 155 2012 142 148 148 -USGS 01491000 00095 68080 11 14 2011 2012 2 2011 155 2012 143 149 149 -USGS 01491000 00095 68080 11 15 2011 2012 2 2011 156 2012 142 149 149 -USGS 01491000 00095 68080 11 16 2011 2012 2 2011 153 2012 141 147 147 -USGS 01491000 00095 68080 11 17 2011 2012 2 2011 152 2012 139 145 145 -USGS 01491000 00095 68080 11 18 2011 2012 2 2011 152 2012 136 144 144 -USGS 01491000 00095 68080 11 19 2011 2012 2 2011 151 2012 138 144 144 -USGS 01491000 00095 68080 11 20 2011 2012 2 2011 152 2012 139 145 145 -USGS 01491000 00095 68080 11 21 2011 2012 2 2011 153 2012 139 146 146 -USGS 01491000 00095 68080 11 22 2011 2012 2 2011 153 2012 137 145 145 -USGS 01491000 00095 68080 11 23 2011 2012 2 2011 153 2012 132 142 142 -USGS 01491000 00095 68080 11 24 2011 2012 2 2011 154 2012 121 138 138 -USGS 01491000 00095 68080 11 25 2011 2012 2 2011 154 2012 118 136 136 -USGS 01491000 00095 68080 11 26 2011 2012 2 2011 153 2012 121 137 137 -USGS 01491000 00095 68080 11 27 2011 2012 2 2011 153 2012 125 139 139 -USGS 01491000 00095 68080 11 28 2011 2012 2 2011 153 2012 125 139 139 -USGS 01491000 00095 68080 11 29 2011 2012 2 2011 153 2012 123 138 138 -USGS 01491000 00095 68080 11 30 2011 2012 2 2011 153 2012 118 136 136 -USGS 01491000 00095 68080 12 1 2011 2012 2 2011 148 2012 106 127 127 -USGS 01491000 00095 68080 12 2 2011 2012 2 2011 145 2012 108 127 127 -USGS 01491000 00095 68080 12 3 2011 2012 2 2011 143 2012 114 129 129 -USGS 01491000 00095 68080 12 4 2011 2012 2 2011 142 2012 119 131 131 -USGS 01491000 00095 68080 12 5 2011 2012 2 2011 143 2012 123 133 133 -USGS 01491000 00095 68080 12 6 2011 2012 2 2011 144 2012 125 135 135 -USGS 01491000 00095 68080 12 7 2011 2012 2 2011 146 2012 102 124 124 -USGS 01491000 00095 68080 12 8 2011 2012 2 2011 149 2012 47 98 98 -USGS 01491000 00095 68080 12 9 2011 2012 2 2011 152 2012 47 99 99 -USGS 01491000 00095 68080 12 10 2011 2012 2 2011 153 2012 66 110 110 -USGS 01491000 00095 68080 12 11 2011 2012 2 2011 154 2012 81 117 117 -USGS 01491000 00095 68080 12 12 2011 2012 2 2011 149 2012 92 120 120 -USGS 01491000 00095 68080 12 13 2011 2012 2 2011 144 2012 101 122 122 -USGS 01491000 00095 68080 12 14 2011 2012 2 2011 139 2012 108 123 123 -USGS 01491000 00095 68080 12 15 2011 2012 2 2011 144 2012 112 128 128 -USGS 01491000 00095 68080 12 16 2011 2012 2 2011 147 2012 116 132 132 -USGS 01491000 00095 68080 12 17 2011 2012 2 2011 149 2012 119 134 134 -USGS 01491000 00095 68080 12 18 2011 2012 2 2011 150 2012 122 136 136 -USGS 01491000 00095 68080 12 19 2011 2012 2 2011 152 2012 124 138 138 -USGS 01491000 00095 68080 12 20 2011 2012 2 2011 153 2012 126 140 140 -USGS 01491000 00095 68080 12 21 2011 2012 2 2011 156 2012 127 141 141 -USGS 01491000 00095 68080 12 22 2011 2012 2 2011 157 2012 127 142 142 -USGS 01491000 00095 68080 12 23 2011 2012 2 2011 156 2012 123 140 140 -USGS 01491000 00095 68080 12 24 2011 2012 2 2011 157 2012 112 135 135 -USGS 01491000 00095 68080 12 25 2011 2012 2 2011 151 2012 110 131 131 -USGS 01491000 00095 68080 12 26 2011 2012 2 2011 149 2012 118 134 134 -USGS 01491000 00095 68080 12 27 2011 2012 2 2011 155 2012 123 139 139 -USGS 01491000 00095 68080 12 28 2011 2012 2 2011 155 2012 119 137 137 -USGS 01491000 00095 68080 12 29 2011 2012 2 2011 152 2012 113 133 133 -USGS 01491000 00095 68080 12 30 2011 2012 2 2011 153 2012 114 134 134 -USGS 01491000 00095 68080 12 31 2011 2012 2 2011 153 2012 117 135 135 -USGS 01491000 80154 68081 1 1 1981 1991 11 1990 28.0 1986 1.0 8 1 1 2 8 11 11 25 -USGS 01491000 80154 68081 1 2 1981 1991 11 1990 43.0 1986 1.0 12 1 2 2 6 15 31 43 -USGS 01491000 80154 68081 1 3 1981 1991 11 1987 54.0 1983 1.0 11 1 1 1 4 17 19 47 -USGS 01491000 80154 68081 1 4 1981 1991 11 1987 20.0 1983 1.0 8 1 1 2 7 10 14 19 -USGS 01491000 80154 68081 1 5 1981 1991 11 1982 33.0 1983 1.0 9 1 2 3 6 14 16 30 -USGS 01491000 80154 68081 1 6 1981 1991 11 1982 37.0 1983 1.0 10 1 3 4 7 14 15 33 -USGS 01491000 80154 68081 1 7 1981 1991 11 1982 14.0 1983 2.0 8 2 2 3 7 11 11 13 -USGS 01491000 80154 68081 1 8 1981 1991 11 1982 16.0 1988 2.0 7 2 3 4 8 9 10 15 -USGS 01491000 80154 68081 1 9 1981 1991 11 1991 42.0 1988 2.0 11 2 3 4 8 10 15 37 -USGS 01491000 80154 68081 1 10 1981 1991 11 1991 53.0 1988 1.0 11 2 5 5 7 11 13 45 -USGS 01491000 80154 68081 1 11 1981 1991 11 1991 26.0 1988 1.0 9 1 3 4 8 13 18 25 -USGS 01491000 80154 68081 1 12 1981 1991 11 1991 46.0 1988 1.0 11 1 4 5 6 10 17 41 -USGS 01491000 80154 68081 1 13 1981 1991 11 1991 39.0 1988 1.0 9 1 3 4 5 11 13 34 -USGS 01491000 80154 68081 1 14 1981 1991 11 1991 25.0 1986 1.0 7 1 2 3 5 9 9 22 -USGS 01491000 80154 68081 1 15 1981 1991 11 1989 13.0 1985 1.0 5 1 1 2 4 7 11 13 -USGS 01491000 80154 68081 1 16 1981 1991 11 1989 24.0 1988 1.0 6 1 2 3 4 5 8 21 -USGS 01491000 80154 68081 1 17 1981 1991 11 1989 22.0 1988 1.0 7 1 3 4 4 8 15 21 -USGS 01491000 80154 68081 1 18 1981 1991 11 1991 17.0 1985 1.0 7 1 3 4 5 6 11 17 -USGS 01491000 80154 68081 1 19 1981 1991 11 1987 13.0 1985 1.0 6 2 4 4 5 11 11 13 -USGS 01491000 80154 68081 1 20 1981 1991 11 1988 35.0 1985 1.0 10 1 3 4 6 10 22 34 -USGS 01491000 80154 68081 1 21 1981 1991 11 1988 40.0 1985 1.0 10 1 3 4 5 10 17 36 -USGS 01491000 80154 68081 1 22 1981 1991 11 1988 42.0 1985 1.0 9 1 3 4 6 8 12 36 -USGS 01491000 80154 68081 1 23 1981 1991 11 1988 23.0 1985 1.0 7 1 3 4 6 7 8 20 -USGS 01491000 80154 68081 1 24 1981 1991 11 1988 15.0 1985 2.0 6 2 3 4 5 8 8 14 -USGS 01491000 80154 68081 1 25 1981 1991 11 1986 13.0 1985 2.0 7 2 4 4 7 9 10 12 -USGS 01491000 80154 68081 1 26 1981 1991 11 1986 36.0 1985 2.0 10 2 4 4 6 15 20 34 -USGS 01491000 80154 68081 1 27 1981 1991 11 1986 52.0 1985 3.0 13 3 4 4 5 17 27 48 -USGS 01491000 80154 68081 1 28 1981 1991 11 1986 33.0 1985 3.0 10 3 4 4 5 16 17 30 -USGS 01491000 80154 68081 1 29 1981 1991 11 1986 23.0 1985 2.0 8 2 4 4 6 10 11 21 -USGS 01491000 80154 68081 1 30 1981 1991 11 1986 17.0 1985 1.0 6 1 3 3 5 7 8 15 -USGS 01491000 80154 68081 1 31 1981 1991 11 1986 11.0 1983 3.0 5 3 3 3 5 7 8 11 -USGS 01491000 80154 68081 2 1 1981 1991 11 1982 32.0 1983 2.0 8 2 3 4 5 8 9 28 -USGS 01491000 80154 68081 2 2 1981 1991 11 1982 31.0 1983 2.0 8 2 3 3 5 10 14 28 -USGS 01491000 80154 68081 2 3 1981 1991 11 1985 24.0 1991 3.0 10 3 4 5 6 20 21 24 -USGS 01491000 80154 68081 2 4 1981 1991 11 1981 39.0 1991 3.0 13 3 4 5 8 19 26 37 -USGS 01491000 80154 68081 2 5 1981 1991 11 1981 25.0 1991 4.0 11 4 5 5 8 15 16 23 -USGS 01491000 80154 68081 2 6 1981 1991 11 1986 15.0 1991 4.0 9 4 5 5 11 12 12 14 -USGS 01491000 80154 68081 2 7 1981 1991 11 1986 12.0 1989 4.0 7 4 4 5 7 10 10 12 -USGS 01491000 80154 68081 2 8 1981 1991 11 1983 12.0 1981 3.0 7 3 3 4 7 10 11 12 -USGS 01491000 80154 68081 2 9 1981 1991 11 1983 31.0 1981 4.0 9 4 4 4 7 10 10 27 -USGS 01491000 80154 68081 2 10 1981 1991 11 1983 30.0 1991 4.0 9 4 5 5 6 11 15 27 -USGS 01491000 80154 68081 2 11 1981 1991 11 1983 17.0 1985 4.0 8 4 5 5 7 12 14 17 -USGS 01491000 80154 68081 2 12 1981 1991 11 1988 91.0 1984 4.0 21 4 5 5 6 31 44 83 -USGS 01491000 80154 68081 2 13 1981 1991 11 1988 96.0 1984 4.0 23 4 4 5 6 51 56 89 -USGS 01491000 80154 68081 2 14 1981 1991 11 1988 42.0 1987 3.0 14 3 4 4 6 27 28 39 -USGS 01491000 80154 68081 2 15 1981 1991 11 1984 34.0 1987 3.0 11 3 5 5 8 14 15 30 -USGS 01491000 80154 68081 2 16 1981 1991 11 1984 47.0 1986 3.0 11 3 5 5 7 10 10 40 -USGS 01491000 80154 68081 2 17 1981 1991 11 1984 13.0 1986 3.0 8 3 5 6 7 9 10 13 -USGS 01491000 80154 68081 2 18 1981 1991 11 1982 19.0 1990 3.0 9 3 4 5 8 12 13 18 -USGS 01491000 80154 68081 2 19 1981 1991 11 1982 26.0 1991 2.0 10 2 3 3 9 15 17 25 -USGS 01491000 80154 68081 2 20 1981 1991 11 1982 36.0 1985 2.0 10 2 3 4 8 12 14 32 -USGS 01491000 80154 68081 2 21 1981 1991 11 1982 23.0 1990 2.0 9 2 3 4 9 10 16 22 -USGS 01491000 80154 68081 2 22 1981 1991 11 1989 59.0 1991 2.0 12 2 3 4 8 12 16 51 -USGS 01491000 80154 68081 2 23 1981 1991 11 1989 61.0 1990 2.0 12 2 4 4 7 12 15 52 -USGS 01491000 80154 68081 2 24 1981 1991 11 1989 33.0 1988 2.0 10 2 3 4 7 12 13 29 -USGS 01491000 80154 68081 2 25 1981 1991 11 1981 14.0 1990 3.0 8 3 4 4 8 14 14 14 -USGS 01491000 80154 68081 2 26 1981 1991 11 1983 14.0 1986 2.0 7 2 3 3 6 10 11 13 -USGS 01491000 80154 68081 2 27 1981 1991 11 1983 14.0 1986 2.0 6 2 3 4 5 9 10 13 -USGS 01491000 80154 68081 2 28 1981 1991 11 1983 14.0 1988 1.0 6 1 3 4 6 8 10 13 -USGS 01491000 80154 68081 2 29 1984 1988 2 1984 12.0 1988 1.0 7 7 -USGS 01491000 80154 68081 3 1 1981 1991 11 1987 31.0 1986 2.0 9 2 2 3 6 14 14 28 -USGS 01491000 80154 68081 3 2 1981 1991 11 1987 45.0 1986 2.0 10 2 2 3 5 11 16 40 -USGS 01491000 80154 68081 3 3 1981 1991 11 1987 28.0 1986 1.0 9 1 3 3 8 9 19 28 -USGS 01491000 80154 68081 3 4 1981 1991 11 1983 18.0 1986 1.0 8 1 3 4 6 14 16 18 -USGS 01491000 80154 68081 3 5 1981 1991 11 1981 30.0 1986 1.0 8 1 2 3 5 11 12 27 -USGS 01491000 80154 68081 3 6 1981 1991 11 1981 15.0 1986 2.0 7 2 3 3 6 10 12 15 -USGS 01491000 80154 68081 3 7 1981 1991 11 1989 32.0 1986 2.0 11 2 4 4 9 15 21 31 -USGS 01491000 80154 68081 3 8 1981 1991 11 1982 55.0 1986 1.0 14 1 3 4 9 27 28 50 -USGS 01491000 80154 68081 3 9 1981 1991 11 1982 37.0 1988 1.0 11 1 2 3 6 18 21 34 -USGS 01491000 80154 68081 3 10 1981 1991 11 1983 21.0 1988 2.0 9 2 3 3 6 14 17 21 -USGS 01491000 80154 68081 3 11 1981 1991 11 1983 14.0 1988 1.0 7 1 2 3 7 12 12 14 -USGS 01491000 80154 68081 3 12 1981 1991 11 1983 18.0 1988 1.0 7 1 3 3 5 10 13 17 -USGS 01491000 80154 68081 3 13 1981 1991 11 1983 19.0 1988 1.0 7 1 2 3 6 11 11 17 -USGS 01491000 80154 68081 3 14 1981 1991 11 1984 59.0 1990 3.0 12 3 4 4 7 12 13 50 -USGS 01491000 80154 68081 3 15 1981 1991 11 1984 38.0 1985 2.0 10 2 2 3 6 11 17 35 -USGS 01491000 80154 68081 3 16 1981 1991 11 1987 18.0 1988 1.0 9 1 3 3 6 16 17 18 -USGS 01491000 80154 68081 3 17 1981 1991 11 1982 11.0 1988 1.0 7 1 3 4 8 10 10 11 -USGS 01491000 80154 68081 3 18 1981 1991 11 1982 25.0 1988 2.0 9 3 5 6 7 10 12 23 -USGS 01491000 80154 68081 3 19 1981 1991 11 1983 42.0 1988 1.0 13 1 4 6 9 19 20 38 -USGS 01491000 80154 68081 3 20 1981 1991 11 1983 36.0 1988 2.0 10 2 4 5 7 14 15 32 -USGS 01491000 80154 68081 3 21 1981 1991 11 1983 44.0 1985 1.0 9 1 3 5 6 9 10 37 -USGS 01491000 80154 68081 3 22 1981 1991 11 1983 66.0 1985 2.0 12 2 3 4 7 10 10 55 -USGS 01491000 80154 68081 3 23 1981 1991 11 1983 36.0 1988 2.0 9 2 3 3 7 11 12 31 -USGS 01491000 80154 68081 3 24 1981 1991 11 1989 28.0 1986 1.0 10 1 2 3 6 20 20 26 -USGS 01491000 80154 68081 3 25 1981 1991 11 1989 66.0 1986 1.0 13 1 2 3 6 14 16 56 -USGS 01491000 80154 68081 3 26 1981 1991 11 1989 23.0 1986 1.0 9 1 2 3 9 12 16 22 -USGS 01491000 80154 68081 3 27 1981 1991 11 1984 20.0 1986 3.0 9 3 3 4 7 12 14 19 -USGS 01491000 80154 68081 3 28 1981 1991 11 1983 43.0 1985 3.0 11 3 3 4 8 15 15 37 -USGS 01491000 80154 68081 3 29 1981 1991 11 1983 42.0 1986 3.0 12 3 3 4 7 13 26 41 -USGS 01491000 80154 68081 3 30 1981 1991 11 1984 40.0 1986 2.0 12 2 4 5 7 15 25 38 -USGS 01491000 80154 68081 3 31 1981 1991 11 1984 21.0 1986 3.0 10 3 5 6 7 18 19 21 -USGS 01491000 80154 68081 4 1 1981 1991 11 1982 13.0 1986 3.0 9 3 5 6 8 12 12 13 -USGS 01491000 80154 68081 4 2 1981 1991 11 1982 14.0 1986 3.0 7 3 4 6 8 9 9 13 -USGS 01491000 80154 68081 4 3 1981 1991 11 1981 22.0 1988 2.0 10 2 4 6 9 14 18 22 -USGS 01491000 80154 68081 4 4 1981 1991 11 1983 30.0 1986 3.0 12 3 5 6 10 16 21 29 -USGS 01491000 80154 68081 4 5 1981 1991 11 1984 58.0 1986 3.0 15 4 6 7 9 17 19 50 -USGS 01491000 80154 68081 4 6 1981 1991 11 1984 37.0 1986 3.0 12 4 6 6 9 17 18 33 -USGS 01491000 80154 68081 4 7 1981 1991 11 1982 24.0 1986 3.0 12 3 5 6 8 21 22 24 -USGS 01491000 80154 68081 4 8 1981 1991 11 1989 25.0 1986 3.0 12 4 6 7 9 15 19 24 -USGS 01491000 80154 68081 4 9 1981 1991 11 1989 26.0 1985 4.0 11 4 5 7 9 14 16 24 -USGS 01491000 80154 68081 4 10 1981 1991 11 1983 42.0 1986 2.0 12 3 5 5 7 14 16 37 -USGS 01491000 80154 68081 4 11 1981 1991 11 1983 38.0 1986 2.0 11 2 4 5 8 10 17 35 -USGS 01491000 80154 68081 4 12 1981 1991 11 1983 18.0 1986 3.0 8 3 5 5 7 9 11 17 -USGS 01491000 80154 68081 4 13 1981 1991 11 1981 24.0 1985 2.0 8 2 3 5 6 10 15 23 -USGS 01491000 80154 68081 4 14 1981 1991 11 1981 20.0 1985 2.0 9 2 4 5 6 19 20 20 -USGS 01491000 80154 68081 4 15 1981 1991 11 1981 21.0 1990 4.0 10 4 5 5 7 18 19 21 -USGS 01491000 80154 68081 4 16 1981 1991 11 1983 61.0 1988 3.0 13 3 5 5 7 16 17 52 -USGS 01491000 80154 68081 4 17 1981 1991 11 1983 42.0 1988 3.0 11 3 5 6 8 14 15 37 -USGS 01491000 80154 68081 4 18 1981 1991 11 1983 21.0 1988 2.0 11 3 5 5 9 17 19 21 -USGS 01491000 80154 68081 4 19 1981 1991 11 1983 16.0 1988 3.0 9 4 6 6 10 13 13 15 -USGS 01491000 80154 68081 4 20 1981 1991 11 1983 15.0 1988 3.0 8 3 5 5 7 13 13 15 -USGS 01491000 80154 68081 4 21 1981 1991 11 1981 12.0 1985 5.0 8 5 5 6 7 12 12 12 -USGS 01491000 80154 68081 4 22 1981 1991 11 1991 16.0 1985 5.0 9 5 6 6 7 11 13 16 -USGS 01491000 80154 68081 4 23 1981 1991 11 1991 15.0 1987 5.0 8 5 6 6 7 12 12 14 -USGS 01491000 80154 68081 4 24 1981 1991 11 1983 19.0 1988 4.0 9 4 5 6 7 13 14 18 -USGS 01491000 80154 68081 4 25 1981 1991 11 1983 34.0 1988 2.0 11 3 5 5 7 14 19 32 -USGS 01491000 80154 68081 4 26 1981 1991 11 1983 24.0 1988 3.0 10 3 4 5 8 13 15 23 -USGS 01491000 80154 68081 4 27 1981 1991 11 1982 16.0 1986 3.0 8 3 3 4 7 14 14 16 -USGS 01491000 80154 68081 4 28 1981 1991 11 1982 24.0 1986 3.0 9 3 4 5 6 12 13 22 -USGS 01491000 80154 68081 4 29 1981 1991 11 1982 19.0 1985 4.0 8 4 4 5 7 11 12 18 -USGS 01491000 80154 68081 4 30 1981 1991 11 1982 15.0 1988 4.0 9 4 6 6 8 11 12 14 -USGS 01491000 80154 68081 5 1 1981 1991 11 1984 14.0 1988 2.0 9 3 5 5 9 12 13 14 -USGS 01491000 80154 68081 5 2 1981 1991 11 1989 32.0 1988 2.0 11 3 5 5 8 15 17 29 -USGS 01491000 80154 68081 5 3 1981 1991 11 1989 40.0 1986 2.0 12 2 3 5 8 17 18 36 -USGS 01491000 80154 68081 5 4 1981 1991 11 1989 20.0 1986 1.0 10 1 3 5 9 16 17 19 -USGS 01491000 80154 68081 5 5 1981 1991 11 1983 20.0 1986 2.0 10 2 3 5 10 14 15 19 -USGS 01491000 80154 68081 5 6 1981 1991 11 1989 30.0 1986 2.0 11 3 5 6 9 16 18 28 -USGS 01491000 80154 68081 5 7 1981 1991 11 1989 45.0 1986 3.0 14 3 6 7 11 16 20 40 -USGS 01491000 80154 68081 5 8 1981 1991 11 1989 21.0 1986 3.0 11 4 6 6 7 17 18 20 -USGS 01491000 80154 68081 5 9 1981 1991 11 1987 16.0 1986 5.0 9 5 5 6 7 14 14 16 -USGS 01491000 80154 68081 5 10 1981 1991 11 1987 15.0 1986 5.0 9 5 6 7 8 11 13 15 -USGS 01491000 80154 68081 5 11 1981 1991 11 1990 60.0 1986 4.0 14 4 5 6 10 12 15 51 -USGS 01491000 80154 68081 5 12 1981 1991 11 1981 77.0 1986 4.0 17 4 5 6 8 11 28 70 -USGS 01491000 80154 68081 5 13 1981 1991 11 1981 46.0 1986 2.0 11 2 5 6 7 10 14 40 -USGS 01491000 80154 68081 5 14 1981 1991 11 1981 20.0 1986 2.0 8 3 5 5 7 9 11 19 -USGS 01491000 80154 68081 5 15 1981 1991 11 1990 12.0 1986 3.0 8 3 5 6 8 11 11 12 -USGS 01491000 80154 68081 5 16 1981 1991 11 1981 55.0 1988 2.0 12 2 4 5 8 11 12 47 -USGS 01491000 80154 68081 5 17 1981 1991 11 1981 64.0 1988 4.0 15 4 5 5 9 14 18 55 -USGS 01491000 80154 68081 5 18 1981 1991 11 1981 27.0 1984 5.0 11 5 5 5 10 16 18 25 -USGS 01491000 80154 68081 5 19 1981 1991 11 1981 17.0 1986 4.0 10 4 6 7 10 11 13 17 -USGS 01491000 80154 68081 5 20 1981 1991 11 1981 21.0 1984 4.0 10 4 5 6 9 13 17 21 -USGS 01491000 80154 68081 5 21 1981 1991 11 1981 21.0 1983 4.0 9 4 4 5 8 13 14 20 -USGS 01491000 80154 68081 5 22 1981 1991 11 1981 23.0 1986 4.0 9 4 6 6 8 10 12 21 -USGS 01491000 80154 68081 5 23 1981 1991 11 1985 48.0 1986 4.0 15 4 6 6 9 23 27 44 -USGS 01491000 80154 68081 5 24 1981 1991 11 1989 51.0 1986 3.0 15 3 5 5 9 23 24 46 -USGS 01491000 80154 68081 5 25 1981 1991 11 1989 35.0 1986 3.0 12 4 6 6 8 14 18 32 -USGS 01491000 80154 68081 5 26 1981 1991 11 1989 21.0 1986 2.0 11 3 6 7 11 13 15 20 -USGS 01491000 80154 68081 5 27 1981 1991 11 1981 18.0 1986 2.0 11 3 6 8 11 15 16 18 -USGS 01491000 80154 68081 5 28 1981 1991 11 1989 19.0 1986 4.0 10 4 5 7 10 15 16 18 -USGS 01491000 80154 68081 5 29 1981 1991 11 1990 68.0 1986 3.0 15 3 5 7 11 16 17 58 -USGS 01491000 80154 68081 5 30 1981 1991 11 1990 70.0 1986 2.0 18 3 5 6 11 19 35 65 -USGS 01491000 80154 68081 5 31 1981 1991 11 1984 57.0 1986 2.0 15 2 5 7 10 18 22 51 -USGS 01491000 80154 68081 6 1 1981 1991 11 1984 26.0 1986 2.0 12 3 7 7 12 15 16 24 -USGS 01491000 80154 68081 6 2 1981 1991 11 1982 32.0 1986 2.0 12 2 4 5 11 16 17 29 -USGS 01491000 80154 68081 6 3 1981 1991 11 1982 40.0 1986 4.0 14 4 7 8 11 12 23 38 -USGS 01491000 80154 68081 6 4 1981 1991 11 1981 26.0 1986 4.0 11 4 5 6 9 12 18 25 -USGS 01491000 80154 68081 6 5 1981 1991 11 1981 20.0 1986 3.0 10 3 4 5 11 12 13 19 -USGS 01491000 80154 68081 6 6 1981 1991 11 1989 26.0 1986 2.0 11 3 5 5 10 14 18 25 -USGS 01491000 80154 68081 6 7 1981 1991 11 1981 29.0 1986 2.0 12 2 4 5 9 17 21 28 -USGS 01491000 80154 68081 6 8 1981 1991 11 1981 25.0 1986 2.0 10 2 3 4 8 13 15 23 -USGS 01491000 80154 68081 6 9 1981 1991 11 1981 21.0 1986 2.0 9 2 4 5 8 10 12 19 -USGS 01491000 80154 68081 6 10 1981 1991 11 1981 19.0 1986 1.0 8 1 4 6 7 10 11 17 -USGS 01491000 80154 68081 6 11 1981 1991 11 1981 17.0 1986 1.0 7 1 3 4 7 8 9 16 -USGS 01491000 80154 68081 6 12 1981 1991 11 1981 18.0 1986 1.0 7 1 3 4 7 8 9 16 -USGS 01491000 80154 68081 6 13 1981 1991 11 1981 23.0 1986 1.0 7 1 3 4 7 8 9 20 -USGS 01491000 80154 68081 6 14 1981 1991 11 1982 19.0 1986 2.0 7 2 3 3 5 10 14 19 -USGS 01491000 80154 68081 6 15 1981 1991 11 1982 25.0 1986 3.0 9 3 3 4 5 11 15 23 -USGS 01491000 80154 68081 6 16 1981 1991 11 1989 25.0 1984 4.0 9 4 4 5 5 13 19 25 -USGS 01491000 80154 68081 6 17 1981 1991 11 1989 22.0 1986 4.0 8 4 4 5 6 11 15 21 -USGS 01491000 80154 68081 6 18 1981 1991 11 1991 42.0 1986 3.0 14 3 5 5 8 23 26 39 -USGS 01491000 80154 68081 6 19 1981 1991 11 1991 28.0 1986 3.0 13 3 4 5 9 22 22 27 -USGS 01491000 80154 68081 6 20 1981 1991 11 1988 21.0 1986 3.0 12 3 4 4 13 19 20 21 -USGS 01491000 80154 68081 6 21 1981 1991 11 1983 36.0 1986 2.0 12 2 4 4 7 20 21 33 -USGS 01491000 80154 68081 6 22 1981 1991 11 1989 39.0 1986 2.0 12 2 4 5 6 14 23 37 -USGS 01491000 80154 68081 6 23 1981 1991 11 1989 40.0 1986 1.0 10 1 4 5 6 10 15 36 -USGS 01491000 80154 68081 6 24 1981 1991 11 1989 27.0 1986 1.0 9 1 3 4 7 11 15 25 -USGS 01491000 80154 68081 6 25 1981 1991 11 1989 21.0 1986 1.0 9 1 3 4 7 12 17 21 -USGS 01491000 80154 68081 6 26 1981 1991 11 1984 18.0 1986 2.0 9 2 3 3 5 17 17 18 -USGS 01491000 80154 68081 6 27 1981 1991 11 1981 41.0 1985 2.0 11 2 2 3 6 17 18 36 -USGS 01491000 80154 68081 6 28 1981 1991 11 1981 28.0 1986 1.0 8 1 3 3 6 11 13 25 -USGS 01491000 80154 68081 6 29 1981 1991 11 1981 17.0 1986 1.0 8 1 3 4 5 12 15 17 -USGS 01491000 80154 68081 6 30 1981 1991 11 1981 14.0 1986 2.0 7 2 2 3 6 11 13 14 -USGS 01491000 80154 68081 7 1 1981 1991 11 1981 19.0 1985 2.0 7 2 2 2 7 9 10 17 -USGS 01491000 80154 68081 7 2 1981 1991 11 1981 17.0 1991 1.0 6 1 3 3 5 7 9 16 -USGS 01491000 80154 68081 7 3 1981 1991 11 1981 14.0 1991 2.0 5 2 3 3 4 6 8 13 -USGS 01491000 80154 68081 7 4 1981 1991 11 1982 23.0 1986 2.0 8 2 3 4 6 13 15 22 -USGS 01491000 80154 68081 7 5 1981 1991 11 1982 27.0 1986 2.0 9 2 3 4 7 11 13 25 -USGS 01491000 80154 68081 7 6 1981 1991 11 1981 12.0 1986 1.0 7 1 3 3 9 10 11 12 -USGS 01491000 80154 68081 7 7 1981 1991 11 1988 11.0 1985 2.0 6 2 2 2 7 9 9 11 -USGS 01491000 80154 68081 7 8 1981 1991 11 1988 13.0 1985 3.0 6 3 3 4 6 8 8 12 -USGS 01491000 80154 68081 7 9 1981 1991 11 1981 9.0 1985 3.0 5 3 3 4 5 7 7 9 -USGS 01491000 80154 68081 7 10 1981 1991 11 1981 9.0 1984 3.0 5 3 3 3 4 7 8 9 -USGS 01491000 80154 68081 7 11 1981 1991 11 1990 17.0 1984 2.0 6 2 2 3 5 7 8 15 -USGS 01491000 80154 68081 7 12 1981 1991 11 1981 13.0 1991 1.0 6 1 2 3 5 8 10 13 -USGS 01491000 80154 68081 7 13 1981 1991 11 1987 16.0 1991 1.0 7 1 2 3 5 12 13 15 -USGS 01491000 80154 68081 7 14 1981 1991 11 1990 12.0 1983 1.0 6 1 1 2 5 9 10 12 -USGS 01491000 80154 68081 7 15 1981 1991 11 1990 18.0 1983 1.0 5 1 1 2 4 6 8 16 -USGS 01491000 80154 68081 7 16 1981 1991 11 1989 16.0 1983 1.0 5 1 2 3 3 9 12 16 -USGS 01491000 80154 68081 7 17 1981 1991 11 1989 35.0 1983 1.0 8 1 2 2 5 8 9 30 -USGS 01491000 80154 68081 7 18 1981 1991 11 1989 20.0 1983 1.0 7 1 2 2 4 9 13 19 -USGS 01491000 80154 68081 7 19 1981 1991 11 1984 15.0 1982 2.0 6 2 2 2 5 9 10 14 -USGS 01491000 80154 68081 7 20 1981 1991 11 1983 27.0 1982 2.0 8 2 2 2 5 8 13 25 -USGS 01491000 80154 68081 7 21 1981 1991 11 1984 19.0 1986 1.0 6 1 2 3 5 7 11 18 -USGS 01491000 80154 68081 7 22 1981 1991 11 1984 24.0 1986 1.0 7 1 3 3 5 9 9 21 -USGS 01491000 80154 68081 7 23 1981 1991 11 1984 17.0 1986 1.0 6 1 2 3 6 9 9 15 -USGS 01491000 80154 68081 7 24 1981 1991 11 1989 13.0 1986 1.0 6 1 2 3 5 8 8 12 -USGS 01491000 80154 68081 7 25 1981 1991 11 1989 11.0 1986 1.0 6 1 2 3 5 7 8 11 -USGS 01491000 80154 68081 7 26 1981 1991 11 1989 11.0 1986 1.0 5 1 2 3 5 8 9 11 -USGS 01491000 80154 68081 7 27 1981 1991 11 1989 34.0 1986 1.0 9 1 2 3 4 8 16 32 -USGS 01491000 80154 68081 7 28 1981 1991 11 1989 34.0 1986 1.0 9 1 3 4 5 10 19 32 -USGS 01491000 80154 68081 7 29 1981 1991 11 1981 28.0 1983 1.0 8 1 2 3 6 11 12 25 -USGS 01491000 80154 68081 7 30 1981 1991 11 1981 34.0 1983 1.0 7 1 2 3 5 7 8 29 -USGS 01491000 80154 68081 7 31 1981 1991 11 1981 22.0 1983 2.0 6 2 2 2 4 9 10 20 -USGS 01491000 80154 68081 8 1 1981 1991 11 1981 15.0 1983 1.0 6 1 2 2 4 10 10 14 -USGS 01491000 80154 68081 8 2 1981 1991 11 1981 13.0 1983 1.0 5 1 1 2 4 6 8 12 -USGS 01491000 80154 68081 8 3 1981 1991 11 1981 13.0 1983 1.0 4 1 2 2 3 5 7 12 -USGS 01491000 80154 68081 8 4 1981 1991 11 1986 13.0 1983 1.0 5 1 1 2 3 7 10 13 -USGS 01491000 80154 68081 8 5 1981 1991 11 1981 13.0 1983 1.0 4 1 1 1 2 6 7 12 -USGS 01491000 80154 68081 8 6 1981 1991 11 1981 12.0 1983 1.0 4 1 1 1 3 6 8 12 -USGS 01491000 80154 68081 8 7 1981 1991 11 1982 16.0 1985 2.0 5 2 2 2 4 6 7 14 -USGS 01491000 80154 68081 8 8 1981 1991 11 1981 9.0 1984 2.0 5 2 2 2 5 7 8 9 -USGS 01491000 80154 68081 8 9 1981 1991 11 1985 12.0 1983 2.0 6 2 2 2 4 10 11 12 -USGS 01491000 80154 68081 8 10 1981 1991 11 1985 12.0 1983 2.0 6 2 2 3 5 9 9 11 -USGS 01491000 80154 68081 8 11 1981 1991 11 1981 11.0 1983 1.0 6 1 3 3 4 8 9 11 -USGS 01491000 80154 68081 8 12 1981 1991 11 1981 9.0 1984 3.0 5 3 3 3 5 6 7 9 -USGS 01491000 80154 68081 8 13 1981 1991 11 1983 10.0 1984 2.0 5 2 2 2 5 7 8 10 -USGS 01491000 80154 68081 8 14 1981 1991 11 1990 29.0 1991 1.0 7 1 2 3 3 9 9 25 -USGS 01491000 80154 68081 8 15 1981 1991 11 1982 16.0 1991 1.0 6 1 3 4 4 7 8 15 -USGS 01491000 80154 68081 8 16 1981 1991 11 1981 10.0 1991 1.0 5 1 2 3 5 6 8 10 -USGS 01491000 80154 68081 8 17 1981 1991 11 1981 8.0 1983 1.0 5 1 2 4 5 6 6 8 -USGS 01491000 80154 68081 8 18 1981 1991 11 1981 7.0 1983 1.0 5 1 2 3 5 6 7 7 -USGS 01491000 80154 68081 8 19 1981 1991 11 1984 11.0 1983 1.0 5 1 2 3 6 7 8 10 -USGS 01491000 80154 68081 8 20 1981 1991 11 1984 11.0 1983 1.0 5 1 1 2 6 6 7 10 -USGS 01491000 80154 68081 8 21 1981 1991 11 1988 11.0 1983 1.0 5 1 1 2 4 7 9 11 -USGS 01491000 80154 68081 8 22 1981 1991 11 1984 10.0 1983 1.0 5 1 2 3 5 7 8 10 -USGS 01491000 80154 68081 8 23 1981 1991 11 1983 29.0 1991 1.0 7 1 3 4 5 6 8 25 -USGS 01491000 80154 68081 8 24 1981 1991 11 1983 12.0 1991 1.0 5 1 3 4 4 5 6 11 -USGS 01491000 80154 68081 8 25 1981 1991 11 1981 9.0 1991 1.0 4 1 2 3 5 6 6 8 -USGS 01491000 80154 68081 8 26 1981 1991 11 1982 5.0 1991 1.0 3 1 2 2 4 5 5 5 -USGS 01491000 80154 68081 8 27 1981 1991 11 1987 6.0 1991 1.0 4 1 3 3 4 4 5 6 -USGS 01491000 80154 68081 8 28 1981 1991 11 1984 8.0 1982 1.0 4 1 1 2 4 6 6 8 -USGS 01491000 80154 68081 8 29 1981 1991 11 1981 9.0 1982 1.0 5 1 1 2 4 8 9 9 -USGS 01491000 80154 68081 8 30 1981 1991 11 1983 14.0 1982 1.0 6 1 2 3 7 10 11 13 -USGS 01491000 80154 68081 8 31 1981 1991 11 1985 11.0 1982 1.0 5 1 2 2 4 8 9 11 -USGS 01491000 80154 68081 9 1 1981 1991 11 1985 33.0 1982 1.0 7 1 2 2 4 7 8 28 -USGS 01491000 80154 68081 9 2 1981 1991 11 1985 20.0 1982 1.0 5 1 1 2 3 7 8 18 -USGS 01491000 80154 68081 9 3 1981 1991 11 1981 8.0 1982 1.0 4 1 1 2 3 7 7 8 -USGS 01491000 80154 68081 9 4 1981 1991 11 1981 7.0 1990 1.0 4 1 1 2 3 7 7 7 -USGS 01491000 80154 68081 9 5 1981 1991 11 1985 8.0 1982 1.0 3 1 1 1 2 6 7 8 -USGS 01491000 80154 68081 9 6 1981 1991 11 1985 14.0 1982 1.0 4 1 1 1 2 7 7 13 -USGS 01491000 80154 68081 9 7 1981 1991 11 1981 7.0 1982 1.0 3 1 1 1 2 7 7 7 -USGS 01491000 80154 68081 9 8 1981 1991 11 1981 6.0 1982 1.0 3 1 1 1 2 5 6 6 -USGS 01491000 80154 68081 9 9 1981 1991 11 1981 14.0 1990 1.0 4 1 1 2 2 5 6 12 -USGS 01491000 80154 68081 9 10 1981 1991 11 1984 17.0 1983 1.0 4 1 1 1 2 6 6 15 -USGS 01491000 80154 68081 9 11 1981 1991 11 1984 21.0 1983 1.0 4 1 1 1 2 5 6 18 -USGS 01491000 80154 68081 9 12 1981 1991 11 1984 18.0 1982 1.0 4 1 1 1 2 5 6 16 -USGS 01491000 80154 68081 9 13 1981 1991 11 1984 16.0 1983 1.0 4 1 1 1 2 5 6 14 -USGS 01491000 80154 68081 9 14 1981 1991 11 1984 16.0 1983 1.0 5 1 2 3 4 5 6 14 -USGS 01491000 80154 68081 9 15 1981 1991 11 1984 20.0 1983 1.0 5 1 1 2 3 5 7 18 -USGS 01491000 80154 68081 9 16 1981 1991 11 1984 15.0 1982 1.0 4 1 1 1 2 4 8 14 -USGS 01491000 80154 68081 9 17 1981 1991 11 1981 15.0 1982 1.0 4 1 1 1 2 4 5 13 -USGS 01491000 80154 68081 9 18 1981 1991 11 1981 31.0 1982 1.0 5 1 1 1 2 5 6 26 -USGS 01491000 80154 68081 9 19 1981 1991 11 1981 40.0 1983 1.0 7 1 1 1 2 4 11 35 -USGS 01491000 80154 68081 9 20 1981 1991 11 1989 30.0 1982 1.0 7 1 1 1 1 4 19 30 -USGS 01491000 80154 68081 9 21 1981 1991 11 1981 14.0 1982 1.0 4 1 1 1 2 4 10 14 -USGS 01491000 80154 68081 9 22 1981 1991 11 1981 10.0 1988 1.0 3 1 1 1 2 4 6 10 -USGS 01491000 80154 68081 9 23 1981 1991 11 1981 12.0 1988 1.0 4 1 1 2 4 5 6 11 -USGS 01491000 80154 68081 9 24 1981 1991 11 1981 8.0 1982 1.0 3 1 1 1 2 5 5 7 -USGS 01491000 80154 68081 9 25 1981 1991 11 1987 7.0 1982 1.0 3 1 1 1 2 5 6 7 -USGS 01491000 80154 68081 9 26 1981 1991 11 1987 11.0 1982 1.0 4 1 1 1 2 7 9 11 -USGS 01491000 80154 68081 9 27 1981 1991 11 1985 41.0 1984 1.0 9 1 1 1 3 6 23 40 -USGS 01491000 80154 68081 9 28 1981 1991 11 1985 44.0 1983 1.0 7 1 1 1 2 7 9 37 -USGS 01491000 80154 68081 9 29 1981 1991 11 1985 25.0 1982 1.0 5 1 1 1 1 6 7 22 -USGS 01491000 80154 68081 9 30 1981 1990 10 1985 14.0 1984 1.0 5 1 1 1 4 6 8 14 -USGS 01491000 80154 68081 10 1 1981 1991 11 1986 12.0 1984 1.0 5 1 1 2 4 7 9 12 -USGS 01491000 80154 68081 10 2 1981 1991 11 1986 12.0 1984 1.0 5 1 1 2 4 5 7 11 -USGS 01491000 80154 68081 10 3 1981 1991 11 1986 17.0 1984 1.0 6 1 2 3 4 8 9 15 -USGS 01491000 80154 68081 10 4 1981 1991 11 1986 28.0 1984 1.0 7 1 1 2 6 10 10 24 -USGS 01491000 80154 68081 10 5 1981 1991 11 1986 20.0 1991 1.0 5 1 2 2 5 5 5 17 -USGS 01491000 80154 68081 10 6 1981 1991 11 1986 10.0 1991 1.0 5 1 2 3 4 6 7 9 -USGS 01491000 80154 68081 10 7 1981 1991 11 1982 9.0 1991 1.0 4 1 3 3 4 6 6 8 -USGS 01491000 80154 68081 10 8 1981 1991 11 1982 9.0 1991 1.0 4 1 2 2 3 5 6 9 -USGS 01491000 80154 68081 10 9 1981 1991 11 1982 10.0 1984 1.0 3 1 1 1 2 5 7 10 -USGS 01491000 80154 68081 10 10 1981 1991 11 1983 5.0 1984 1.0 3 1 1 1 4 4 5 5 -USGS 01491000 80154 68081 10 11 1981 1991 11 1984 8.0 1986 1.0 4 1 1 2 4 4 5 8 -USGS 01491000 80154 68081 10 12 1981 1991 11 1984 10.0 1991 1.0 4 1 2 2 3 5 6 9 -USGS 01491000 80154 68081 10 13 1981 1991 11 1983 7.0 1985 1.0 4 1 1 2 3 5 6 7 -USGS 01491000 80154 68081 10 14 1981 1991 11 1987 8.0 1991 1.0 4 1 2 2 3 4 5 7 -USGS 01491000 80154 68081 10 15 1981 1991 11 1989 8.0 1988 1.0 4 1 1 2 3 5 6 8 -USGS 01491000 80154 68081 10 16 1981 1991 11 1987 9.0 1988 1.0 3 1 1 1 3 4 5 8 -USGS 01491000 80154 68081 10 17 1981 1991 11 1982 7.0 1985 1.0 3 1 1 1 2 4 5 7 -USGS 01491000 80154 68081 10 18 1981 1991 11 1984 8.0 1983 1.0 3 1 1 1 2 4 6 8 -USGS 01491000 80154 68081 10 19 1981 1991 11 1991 41.0 1983 1.0 7 1 1 1 3 7 7 34 -USGS 01491000 80154 68081 10 20 1981 1991 11 1982 7.0 1983 1.0 3 1 1 2 2 5 6 7 -USGS 01491000 80154 68081 10 21 1981 1991 11 1982 16.0 1985 1.0 4 1 1 1 2 4 7 15 -USGS 01491000 80154 68081 10 22 1981 1991 11 1982 9.0 1988 1.0 4 1 1 2 2 5 7 9 -USGS 01491000 80154 68081 10 23 1981 1991 11 1982 9.0 1986 1.0 4 1 1 2 4 4 5 8 -USGS 01491000 80154 68081 10 24 1981 1991 11 1984 11.0 1986 1.0 4 1 1 2 4 8 9 11 -USGS 01491000 80154 68081 10 25 1981 1991 11 1982 12.0 1983 1.0 5 1 1 1 3 9 11 12 -USGS 01491000 80154 68081 10 26 1981 1991 11 1981 72.0 1985 1.0 10 1 1 1 3 7 11 60 -USGS 01491000 80154 68081 10 27 1981 1991 11 1981 42.0 1985 1.0 7 1 1 1 3 6 8 35 -USGS 01491000 80154 68081 10 28 1981 1991 11 1981 17.0 1985 1.0 4 1 1 2 3 6 7 15 -USGS 01491000 80154 68081 10 29 1981 1991 11 1981 11.0 1986 1.0 4 1 1 2 3 4 5 10 -USGS 01491000 80154 68081 10 30 1981 1991 11 1981 8.0 1983 1.0 3 1 1 1 2 4 6 8 -USGS 01491000 80154 68081 10 31 1981 1991 11 1982 10.0 1986 1.0 3 1 1 2 2 3 6 10 -USGS 01491000 80154 68081 11 1 1981 1991 11 1989 11.0 1984 1.0 4 1 1 2 3 8 9 11 -USGS 01491000 80154 68081 11 2 1981 1991 11 1982 8.0 1988 1.0 4 1 2 2 3 5 6 8 -USGS 01491000 80154 68081 11 3 1981 1991 11 1982 7.0 1983 1.0 3 1 1 1 3 4 5 7 -USGS 01491000 80154 68081 11 4 1981 1991 11 1982 9.0 1983 1.0 4 1 1 2 3 6 6 8 -USGS 01491000 80154 68081 11 5 1981 1991 11 1982 7.0 1988 1.0 4 1 2 3 4 4 5 7 -USGS 01491000 80154 68081 11 6 1981 1991 11 1989 17.0 1984 2.0 5 2 2 2 3 5 8 16 -USGS 01491000 80154 68081 11 7 1981 1991 11 1989 10.0 1982 1.0 4 1 1 2 2 6 7 9 -USGS 01491000 80154 68081 11 8 1981 1991 11 1981 13.0 1982 1.0 4 1 1 2 3 4 6 12 -USGS 01491000 80154 68081 11 9 1981 1991 11 1990 8.0 1982 1.0 3 1 1 2 2 4 5 7 -USGS 01491000 80154 68081 11 10 1981 1991 11 1990 13.0 1982 1.0 4 1 1 1 2 5 6 12 -USGS 01491000 80154 68081 11 11 1981 1991 11 1990 11.0 1982 1.0 4 1 2 2 3 5 6 10 -USGS 01491000 80154 68081 11 12 1981 1991 11 1990 8.0 1982 1.0 3 1 1 1 3 4 6 8 -USGS 01491000 80154 68081 11 13 1981 1991 11 1990 8.0 1982 1.0 3 1 1 1 3 6 7 8 -USGS 01491000 80154 68081 11 14 1981 1991 11 1983 7.0 1982 1.0 3 1 1 1 3 3 4 6 -USGS 01491000 80154 68081 11 15 1981 1991 11 1984 5.0 1982 1.0 3 1 1 1 3 4 4 5 -USGS 01491000 80154 68081 11 16 1981 1991 11 1984 9.0 1982 1.0 3 1 1 1 3 4 5 8 -USGS 01491000 80154 68081 11 17 1981 1991 11 1984 8.0 1982 1.0 3 1 1 1 3 4 5 7 -USGS 01491000 80154 68081 11 18 1981 1991 11 1981 7.0 1982 1.0 4 1 1 1 4 5 6 7 -USGS 01491000 80154 68081 11 19 1981 1991 11 1981 15.0 1982 2.0 4 2 2 2 3 4 4 13 -USGS 01491000 80154 68081 11 20 1981 1991 11 1981 13.0 1988 1.0 4 1 1 2 3 5 6 12 -USGS 01491000 80154 68081 11 21 1981 1991 11 1984 71.0 1988 1.0 11 1 1 2 4 10 11 59 -USGS 01491000 80154 68081 11 22 1981 1991 11 1984 47.0 1988 1.0 9 1 2 3 4 11 13 41 -USGS 01491000 80154 68081 11 23 1981 1991 11 1984 23.0 1988 1.0 7 1 2 2 4 10 11 21 -USGS 01491000 80154 68081 11 24 1981 1991 11 1984 20.0 1988 1.0 6 1 2 2 4 9 12 19 -USGS 01491000 80154 68081 11 25 1981 1991 11 1984 30.0 1988 1.0 7 1 1 2 5 7 9 26 -USGS 01491000 80154 68081 11 26 1981 1991 11 1984 33.0 1985 1.0 7 1 1 1 4 9 10 28 -USGS 01491000 80154 68081 11 27 1981 1991 11 1984 28.0 1983 1.0 8 1 1 1 4 10 20 28 -USGS 01491000 80154 68081 11 28 1981 1991 11 1989 89.0 1985 1.0 15 1 3 4 5 14 18 75 -USGS 01491000 80154 68081 11 29 1981 1991 11 1989 53.0 1985 2.0 12 2 3 4 6 19 20 47 -USGS 01491000 80154 68081 11 30 1981 1991 11 1989 44.0 1984 3.0 14 3 4 4 9 18 29 43 -USGS 01491000 80154 68081 12 1 1981 1991 11 1983 26.0 1984 3.0 11 3 3 3 9 17 22 26 -USGS 01491000 80154 68081 12 2 1981 1991 11 1983 20.0 1990 2.0 9 2 3 4 4 15 16 19 -USGS 01491000 80154 68081 12 3 1981 1991 11 1982 36.0 1985 2.0 9 2 2 3 4 12 13 32 -USGS 01491000 80154 68081 12 4 1981 1991 11 1982 25.0 1985 1.0 8 1 2 2 6 10 11 22 -USGS 01491000 80154 68081 12 5 1981 1991 11 1984 22.0 1985 1.0 7 1 1 2 6 10 11 20 -USGS 01491000 80154 68081 12 6 1981 1991 11 1983 28.0 1988 1.0 8 1 2 3 5 10 13 25 -USGS 01491000 80154 68081 12 7 1981 1991 11 1983 23.0 1988 1.0 7 1 3 4 4 10 10 20 -USGS 01491000 80154 68081 12 8 1981 1991 11 1983 17.0 1988 1.0 6 1 2 3 4 10 10 16 -USGS 01491000 80154 68081 12 9 1981 1991 11 1983 14.0 1988 1.0 6 1 2 2 4 11 11 13 -USGS 01491000 80154 68081 12 10 1981 1991 11 1987 12.0 1988 1.0 5 1 2 2 4 8 9 11 -USGS 01491000 80154 68081 12 11 1981 1991 11 1987 14.0 1988 1.0 5 1 2 2 4 6 7 13 -USGS 01491000 80154 68081 12 12 1981 1991 11 1987 16.0 1988 1.0 5 1 2 2 4 7 8 14 -USGS 01491000 80154 68081 12 13 1981 1991 11 1984 35.0 1988 1.0 7 1 2 3 4 5 12 31 -USGS 01491000 80154 68081 12 14 1981 1991 11 1984 60.0 1988 1.0 10 1 3 3 4 10 11 50 -USGS 01491000 80154 68081 12 15 1981 1991 11 1984 32.0 1990 2.0 8 2 3 3 3 11 15 29 -USGS 01491000 80154 68081 12 16 1981 1991 11 1982 27.0 1985 2.0 10 2 2 3 5 21 24 27 -USGS 01491000 80154 68081 12 17 1981 1991 11 1983 56.0 1985 1.0 11 1 2 4 4 11 23 51 -USGS 01491000 80154 68081 12 18 1981 1991 11 1983 36.0 1988 1.0 8 1 2 3 4 6 14 33 -USGS 01491000 80154 68081 12 19 1981 1991 11 1983 19.0 1985 1.0 6 1 2 3 4 7 9 17 -USGS 01491000 80154 68081 12 20 1981 1991 11 1982 10.0 1985 1.0 5 1 1 2 4 6 8 10 -USGS 01491000 80154 68081 12 21 1981 1991 11 1982 8.0 1988 1.0 4 1 2 2 4 5 6 8 -USGS 01491000 80154 68081 12 22 1981 1991 11 1982 7.0 1988 1.0 4 1 2 2 3 6 7 7 -USGS 01491000 80154 68081 12 23 1981 1991 11 1984 21.0 1986 1.0 5 1 1 1 4 6 7 18 -USGS 01491000 80154 68081 12 24 1981 1991 11 1984 17.0 1986 1.0 5 1 1 2 3 9 9 15 -USGS 01491000 80154 68081 12 25 1981 1991 11 1987 84.0 1986 1.0 13 1 1 2 6 11 13 70 -USGS 01491000 80154 68081 12 26 1981 1991 11 1987 107 1986 1.0 15 1 2 2 6 11 12 88 -USGS 01491000 80154 68081 12 27 1981 1991 11 1987 49.0 1988 1.0 9 1 1 2 6 9 9 41 -USGS 01491000 80154 68081 12 28 1981 1991 11 1987 24.0 1988 1.0 7 1 1 2 3 10 11 21 -USGS 01491000 80154 68081 12 29 1981 1991 11 1984 31.0 1988 1.0 8 1 1 2 3 14 15 28 -USGS 01491000 80154 68081 12 30 1981 1991 11 1984 28.0 1983 2.0 8 2 2 2 4 13 14 25 -USGS 01491000 80154 68081 12 31 1981 1991 11 1984 11.0 1986 1.0 5 1 2 2 4 9 10 11 -USGS 01491000 80155 68082 1 1 1981 1991 11 1990 36.0 1988 0.07 5.1 0.09 0.18 0.19 1.2 4.7 5.6 30 -USGS 01491000 80155 68082 1 2 1981 1991 11 1987 102 1988 0.15 18 0.15 0.21 0.28 0.87 7 50 97 -USGS 01491000 80155 68082 1 3 1981 1991 11 1987 178 1988 0.07 19 0.09 0.2 0.21 0.56 9.5 13 146 -USGS 01491000 80155 68082 1 4 1981 1991 11 1987 36.0 1988 0.07 5.4 0.1 0.31 0.48 1.2 6.6 7.9 31 -USGS 01491000 80155 68082 1 5 1981 1991 11 1982 33.0 1988 0.07 5.8 0.09 0.29 0.43 1.4 3 12 30 -USGS 01491000 80155 68082 1 6 1981 1991 11 1982 32.0 1988 0.13 5.2 0.15 0.46 0.83 1.4 3.6 8 28 -USGS 01491000 80155 68082 1 7 1981 1991 11 1982 8.20 1988 0.11 2.8 0.18 0.71 1.1 1.5 4.7 6.4 8.1 -USGS 01491000 80155 68082 1 8 1981 1991 11 1982 7.70 1988 0.11 2.5 0.24 0.87 1 1.5 4.5 5.2 7.3 -USGS 01491000 80155 68082 1 9 1981 1991 11 1991 35.0 1988 0.13 5.5 0.22 0.62 0.65 2.6 4.6 6.7 30 -USGS 01491000 80155 68082 1 10 1981 1991 11 1991 79.0 1988 0.06 9.6 0.15 0.67 0.92 1.9 5.3 7.5 65 -USGS 01491000 80155 68082 1 11 1981 1991 11 1991 28.0 1988 0.06 6 0.12 0.4 0.47 2.1 9.3 13 25 -USGS 01491000 80155 68082 1 12 1981 1991 11 1991 111 1988 0.06 14 0.14 0.49 0.53 1.6 6.7 14 93 -USGS 01491000 80155 68082 1 13 1981 1991 11 1991 97.0 1988 0.06 11 0.12 0.39 0.45 2.4 6.4 7.5 79 -USGS 01491000 80155 68082 1 14 1981 1991 11 1991 31.0 1988 0.06 4.5 0.08 0.27 0.43 2.2 4.3 4.5 26 -USGS 01491000 80155 68082 1 15 1981 1991 11 1991 10.0 1988 0.11 2.4 0.12 0.14 0.15 1.1 3.4 4.4 9 -USGS 01491000 80155 68082 1 16 1981 1991 11 1989 14.0 1988 0.05 2.8 0.09 0.32 0.42 0.83 2.4 5.3 13 -USGS 01491000 80155 68082 1 17 1981 1991 11 1991 23.0 1988 0.05 4 0.13 0.47 0.52 1.2 2 8 21 -USGS 01491000 80155 68082 1 18 1981 1991 11 1991 20.0 1985 0.14 3.4 0.14 0.24 0.38 1.3 2.9 5.2 17 -USGS 01491000 80155 68082 1 19 1981 1991 11 1987 13.0 1985 0.14 3.1 0.2 0.42 0.43 1.4 4.4 6.7 12 -USGS 01491000 80155 68082 1 20 1981 1991 11 1987 71.0 1985 0.12 9.1 0.19 0.55 0.71 2.2 4.4 9.6 59 -USGS 01491000 80155 68082 1 21 1981 1991 11 1987 44.0 1985 0.10 7.5 0.22 0.69 0.7 1.7 3.6 16 40 -USGS 01491000 80155 68082 1 22 1981 1991 11 1988 22.0 1985 0.10 4.8 0.22 0.73 0.78 1.9 2.6 12 21 -USGS 01491000 80155 68082 1 23 1981 1991 11 1988 7.50 1985 0.11 2.5 0.22 0.77 0.94 2.1 2.8 5.4 7.4 -USGS 01491000 80155 68082 1 24 1981 1991 11 1988 3.50 1985 0.23 1.7 0.38 1 1.1 1.7 2.4 2.5 3.3 -USGS 01491000 80155 68082 1 25 1981 1991 11 1987 4.20 1985 0.24 2.1 0.39 1 1.1 1.8 3.2 3.4 4.1 -USGS 01491000 80155 68082 1 26 1981 1991 11 1986 38.0 1985 0.25 8.6 0.37 0.88 0.95 1.9 18 23 36 -USGS 01491000 80155 68082 1 27 1981 1991 11 1986 137 1985 0.34 20 0.42 0.82 0.9 1.9 21 36 119 -USGS 01491000 80155 68082 1 28 1981 1991 11 1986 66.0 1985 0.36 9.7 0.44 0.8 0.85 1.9 12 15 56 -USGS 01491000 80155 68082 1 29 1981 1991 11 1986 25.0 1985 0.24 4.5 0.36 0.9 1 1.9 6.6 6.7 21 -USGS 01491000 80155 68082 1 30 1981 1991 11 1986 13.0 1985 0.11 2.8 0.21 0.64 0.69 1.4 3.6 4.6 11 -USGS 01491000 80155 68082 1 31 1981 1991 11 1986 6.50 1985 0.35 2.3 0.38 0.54 0.62 1.3 3.5 5.1 6.4 -USGS 01491000 80155 68082 2 1 1981 1991 11 1982 37.0 1983 0.41 4.8 0.44 0.57 0.58 1.2 3 4 31 -USGS 01491000 80155 68082 2 2 1981 1991 11 1982 41.0 1983 0.40 5.8 0.44 0.72 0.92 1.7 5.1 6.1 34 -USGS 01491000 80155 68082 2 3 1981 1991 11 1982 23.0 1991 0.80 6.4 0.84 1.2 1.5 2.5 6.2 15 23 -USGS 01491000 80155 68082 2 4 1981 1991 11 1982 31.0 1991 0.80 8.2 0.92 1.6 2 4.1 10 18 29 -USGS 01491000 80155 68082 2 5 1981 1991 11 1982 20.0 1991 1.20 6.8 1.2 1.9 2.6 4.8 10 15 20 -USGS 01491000 80155 68082 2 6 1981 1991 11 1986 18.0 1991 1.20 5.5 1.2 1.5 1.6 2.5 9.1 11 17 -USGS 01491000 80155 68082 2 7 1981 1991 11 1986 11.0 1981 1.10 3.7 1.1 1.1 1.2 2.5 5.8 6.2 10 -USGS 01491000 80155 68082 2 8 1981 1991 11 1986 9.60 1981 0.54 3.7 0.63 1.1 1.2 2.5 6.5 6.7 9.1 -USGS 01491000 80155 68082 2 9 1981 1991 11 1983 18.0 1981 0.81 4.9 0.87 1.2 1.3 1.9 6.9 11 17 -USGS 01491000 80155 68082 2 10 1981 1991 11 1982 14.0 1981 1.00 5.1 1 1.2 1.2 2.1 12 13 14 -USGS 01491000 80155 68082 2 11 1981 1991 11 1982 13.0 1985 0.93 3.8 1 1.6 1.7 2.5 6 6.2 12 -USGS 01491000 80155 68082 2 12 1981 1991 11 1988 117 1989 1.40 16 1.4 1.5 1.6 3.4 16 20 98 -USGS 01491000 80155 68082 2 13 1981 1991 11 1988 248 1989 1.10 33 1.1 1.4 1.6 2.9 24 54 213 -USGS 01491000 80155 68082 2 14 1981 1991 11 1988 61.0 1991 1.50 11 1.5 1.6 1.6 2.2 9 23 55 -USGS 01491000 80155 68082 2 15 1981 1991 11 1984 77.0 1991 1.90 11 1.9 2 2 3.5 7.3 8.7 64 -USGS 01491000 80155 68082 2 16 1981 1991 11 1984 179 1986 1.40 19 1.5 2.1 2.5 2.7 4.3 4.5 144 -USGS 01491000 80155 68082 2 17 1981 1991 11 1984 30.0 1986 1.30 5.7 1.3 1.7 2 2.9 5.7 6.4 25 -USGS 01491000 80155 68082 2 18 1981 1991 11 1984 17.0 1991 0.80 5.7 0.86 1.6 2.3 2.9 8.5 12 16 -USGS 01491000 80155 68082 2 19 1981 1991 11 1982 31.0 1991 0.55 9.2 0.64 1 1.1 2.8 18 24 30 -USGS 01491000 80155 68082 2 20 1981 1991 11 1982 74.0 1985 0.64 12 0.65 1.1 1.8 2.8 11 19 64 -USGS 01491000 80155 68082 2 21 1981 1991 11 1982 41.0 1990 0.65 7.7 0.7 1.1 1.5 3.9 9.1 9.4 35 -USGS 01491000 80155 68082 2 22 1981 1991 11 1989 72.0 1991 0.47 12 0.56 1 1.1 3.7 7.1 19 63 -USGS 01491000 80155 68082 2 23 1981 1991 11 1989 97.0 1990 0.65 13 0.71 1 1.1 3.8 5.9 13 81 -USGS 01491000 80155 68082 2 24 1981 1991 11 1989 38.0 1988 0.93 8.1 0.96 1.1 1.1 5.7 11 11 33 -USGS 01491000 80155 68082 2 25 1981 1991 11 1984 14.0 1990 1.00 5.5 1 1.2 1.4 5.3 10 11 13 -USGS 01491000 80155 68082 2 26 1981 1991 11 1983 9.10 1990 0.89 3.8 0.93 1.1 1.2 3.4 5.7 6.1 8.5 -USGS 01491000 80155 68082 2 27 1981 1991 11 1983 7.60 1985 1.00 3.1 1 1.1 1.1 2.1 5.3 5.8 7.3 -USGS 01491000 80155 68082 2 28 1981 1991 11 1983 6.50 1988 0.37 2.9 0.49 0.98 1 2.1 5 5.7 6.4 -USGS 01491000 80155 68082 2 29 1984 1988 2 1984 12.0 1988 0.35 6.2 6.2 -USGS 01491000 80155 68082 3 1 1981 1991 11 1987 63.0 1988 0.66 8.7 0.67 0.79 0.89 2 6.4 9.8 53 -USGS 01491000 80155 68082 3 2 1981 1991 11 1987 167 1991 0.48 19 0.52 0.8 1 1.9 7.2 12 137 -USGS 01491000 80155 68082 3 3 1981 1991 11 1983 35.0 1986 0.48 7.3 0.54 0.83 0.89 2.6 4.6 17 33 -USGS 01491000 80155 68082 3 4 1981 1991 11 1987 27.0 1986 0.46 5.4 0.49 0.7 0.83 2.4 3.4 10 25 -USGS 01491000 80155 68082 3 5 1981 1991 11 1987 13.0 1986 0.44 3.6 0.48 0.66 0.71 2.4 6.9 7.1 12 -USGS 01491000 80155 68082 3 6 1981 1991 11 1987 10.0 1985 0.66 3.6 0.7 0.95 1.1 2.8 5.6 6.1 9.3 -USGS 01491000 80155 68082 3 7 1981 1991 11 1989 57.0 1985 0.80 10 0.8 1 1.3 4.8 8.9 17 50 -USGS 01491000 80155 68082 3 8 1981 1991 11 1982 86.0 1986 0.37 16 0.43 0.71 0.78 3.2 19 35 78 -USGS 01491000 80155 68082 3 9 1981 1991 11 1982 56.0 1988 0.31 10 0.33 0.61 0.92 1.8 15 16 48 -USGS 01491000 80155 68082 3 10 1981 1991 11 1983 20.0 1985 0.58 6 0.59 0.69 0.79 2.1 11 14 19 -USGS 01491000 80155 68082 3 11 1981 1991 11 1983 12.0 1988 0.31 4.3 0.36 0.55 0.55 2.7 8.1 10 12 -USGS 01491000 80155 68082 3 12 1981 1991 11 1989 15.0 1988 0.28 4.2 0.34 0.66 0.78 1.4 5.1 10 15 -USGS 01491000 80155 68082 3 13 1981 1991 11 1983 19.0 1988 0.27 4.7 0.32 0.61 0.77 1.5 8.8 8.9 17 -USGS 01491000 80155 68082 3 14 1981 1991 11 1984 171 1990 0.76 19 0.76 0.95 1.2 4.5 9.6 10 139 -USGS 01491000 80155 68082 3 15 1981 1991 11 1984 102 1985 0.37 15 0.4 0.61 0.75 3.1 7.2 24 89 -USGS 01491000 80155 68082 3 16 1981 1991 11 1986 27.0 1988 0.25 7 0.3 0.6 0.73 3.1 7.7 17 26 -USGS 01491000 80155 68082 3 17 1981 1991 11 1984 9.70 1988 0.23 3.9 0.28 0.7 1 3.4 7.1 8.1 9.5 -USGS 01491000 80155 68082 3 18 1981 1991 11 1982 21.0 1988 0.45 5.4 0.53 1 1.3 3.8 6.9 7.9 19 -USGS 01491000 80155 68082 3 19 1981 1991 11 1983 111 1988 0.22 16 0.24 0.67 1.2 5.1 15 15 92 -USGS 01491000 80155 68082 3 20 1981 1991 11 1983 92.0 1988 0.44 12 0.44 0.67 0.99 4 7.9 10 76 -USGS 01491000 80155 68082 3 21 1981 1991 11 1983 101 1985 0.15 12 0.16 0.61 1.2 3.1 5.5 5.6 82 -USGS 01491000 80155 68082 3 22 1981 1991 11 1983 252 1985 0.29 26 0.31 0.95 1.8 3 6.1 8 203 -USGS 01491000 80155 68082 3 23 1981 1991 11 1983 74.0 1988 0.38 9.5 0.41 0.79 1.2 2.3 5.6 6.4 61 -USGS 01491000 80155 68082 3 24 1981 1991 11 1989 62.0 1988 0.19 11 0.23 0.49 0.63 1.9 19 20 54 -USGS 01491000 80155 68082 3 25 1981 1991 11 1989 387 1988 0.19 39 0.23 0.74 1.3 1.9 11 14 313 -USGS 01491000 80155 68082 3 26 1981 1991 11 1989 71.0 1986 0.35 12 0.37 0.8 1.3 1.9 7.5 25 64 -USGS 01491000 80155 68082 3 27 1981 1991 11 1984 44.0 1985 0.95 8 0.96 1.1 1.2 3 5.7 14 39 -USGS 01491000 80155 68082 3 28 1981 1991 11 1983 76.0 1985 0.67 12 0.74 1.1 1.2 3.7 11 18 65 -USGS 01491000 80155 68082 3 29 1981 1991 11 1984 168 1985 0.87 25 0.88 0.95 0.96 3.3 5.9 55 152 -USGS 01491000 80155 68082 3 30 1981 1991 11 1984 219 1986 0.60 26 0.68 1 1.1 2.5 10 25 182 -USGS 01491000 80155 68082 3 31 1981 1991 11 1984 56.0 1986 0.88 10 0.92 1.3 1.5 2.8 16 20 49 -USGS 01491000 80155 68082 4 1 1981 1991 11 1984 17.0 1986 0.84 5.6 0.95 1.5 1.6 5.3 8.3 9.9 16 -USGS 01491000 80155 68082 4 2 1981 1991 11 1984 7.60 1986 0.81 4 0.83 1.4 2.2 4 5.9 6 7.3 -USGS 01491000 80155 68082 4 3 1981 1991 11 1990 21.0 1988 0.58 6.3 0.62 1.5 2.6 4 8.1 11 19 -USGS 01491000 80155 68082 4 4 1981 1991 11 1983 45.0 1986 0.75 10 0.84 1.8 2.6 4.5 8 25 43 -USGS 01491000 80155 68082 4 5 1981 1991 11 1984 200 1986 0.74 24 1 2.1 2.1 4.6 12 17 164 -USGS 01491000 80155 68082 4 6 1981 1991 11 1984 200 1986 0.86 23 0.95 1.5 1.7 6.1 9.7 10 162 -USGS 01491000 80155 68082 4 7 1981 1991 11 1984 54.0 1986 1.00 11 1 1.4 1.6 5.5 17 18 47 -USGS 01491000 80155 68082 4 8 1981 1991 11 1989 55.0 1986 0.98 12 1 2 3.3 4.4 15 20 49 -USGS 01491000 80155 68082 4 9 1981 1991 11 1989 69.0 1985 0.82 12 0.94 2 2.8 6.8 9.3 10 57 -USGS 01491000 80155 68082 4 10 1981 1991 11 1983 140 1986 0.50 18 0.6 1.7 2.7 5.2 6.9 15 116 -USGS 01491000 80155 68082 4 11 1981 1991 11 1983 232 1986 0.51 25 0.56 1.5 2.6 3.2 7.1 8.8 188 -USGS 01491000 80155 68082 4 12 1981 1991 11 1983 67.0 1986 0.74 9 0.77 1.5 2.3 2.7 5.6 5.9 55 -USGS 01491000 80155 68082 4 13 1981 1991 11 1983 34.0 1985 0.35 6.3 0.37 1 1.9 2.5 5.8 11 30 -USGS 01491000 80155 68082 4 14 1981 1991 11 1983 24.0 1985 0.33 6.9 0.48 1.4 1.9 2.4 13 19 24 -USGS 01491000 80155 68082 4 15 1981 1991 11 1984 28.0 1985 0.84 6.8 0.97 1.7 2 2.6 15 16 26 -USGS 01491000 80155 68082 4 16 1981 1991 11 1983 363 1988 0.96 39 0.97 1.3 1.7 2.4 11 22 296 -USGS 01491000 80155 68082 4 17 1981 1991 11 1983 268 1985 0.84 30 0.85 1.5 2.3 2.9 15 25 221 -USGS 01491000 80155 68082 4 18 1981 1991 11 1983 51.0 1988 0.56 9.9 0.6 1.5 2.5 3.3 10 17 45 -USGS 01491000 80155 68082 4 19 1981 1991 11 1983 23.0 1985 0.86 6.1 0.86 1.4 2.1 3.2 9.6 9.8 20 -USGS 01491000 80155 68082 4 20 1981 1991 11 1983 15.0 1985 0.69 4.8 0.72 1.2 1.7 2.4 6.3 9.7 14 -USGS 01491000 80155 68082 4 21 1981 1991 11 1983 10.0 1985 0.66 4 0.79 1.5 1.8 3.1 6.2 6.7 9.4 -USGS 01491000 80155 68082 4 22 1981 1991 11 1991 15.0 1985 0.66 4.3 0.83 1.6 1.8 4 5 5.6 13 -USGS 01491000 80155 68082 4 23 1981 1991 11 1991 15.0 1985 0.85 4.1 0.96 1.5 1.6 3.2 5.5 6.3 13 -USGS 01491000 80155 68082 4 24 1981 1991 11 1983 22.0 1985 0.71 5.1 0.75 1.1 1.4 2.9 6.2 8.3 20 -USGS 01491000 80155 68082 4 25 1981 1991 11 1983 94.0 1988 0.44 12 0.53 1.1 1.4 2.7 11 12 78 -USGS 01491000 80155 68082 4 26 1981 1991 11 1983 54.0 1988 0.62 8.2 0.7 1.1 1.2 3.6 6.9 8.8 45 -USGS 01491000 80155 68082 4 27 1981 1991 11 1983 18.0 1988 0.58 4.5 0.61 0.73 0.75 3.2 6.1 7.1 16 -USGS 01491000 80155 68082 4 28 1981 1991 11 1982 22.0 1985 0.58 4.8 0.6 0.85 1.1 2.5 4.1 8.2 20 -USGS 01491000 80155 68082 4 29 1981 1991 11 1982 20.0 1985 0.40 4.4 0.5 1.2 1.6 2.6 3.6 7.1 18 -USGS 01491000 80155 68082 4 30 1981 1991 11 1982 11.0 1985 0.68 3.8 0.72 1.1 1.3 3.1 4.6 6.1 10 -USGS 01491000 80155 68082 5 1 1981 1991 11 1982 7.10 1988 0.42 3.8 0.43 0.67 1 3.3 6.3 6.7 7.1 -USGS 01491000 80155 68082 5 2 1981 1991 11 1989 84.0 1988 0.39 11 0.4 0.66 0.97 3.4 6.6 7.1 69 -USGS 01491000 80155 68082 5 3 1981 1991 11 1989 181 1986 0.36 20 0.36 0.95 1.8 2.9 7.5 9 147 -USGS 01491000 80155 68082 5 4 1981 1991 11 1989 38.0 1986 0.16 6.5 0.16 0.91 2 2.8 6.7 6.9 32 -USGS 01491000 80155 68082 5 5 1981 1991 11 1989 17.0 1986 0.32 4.9 0.33 0.83 1.5 3.3 6.7 9.3 16 -USGS 01491000 80155 68082 5 6 1981 1991 11 1989 68.0 1986 0.31 9.6 0.49 1.4 1.7 2.9 5.2 9.3 57 -USGS 01491000 80155 68082 5 7 1981 1991 11 1989 151 1986 0.45 18 0.6 1.6 2.2 4.3 11 12 123 -USGS 01491000 80155 68082 5 8 1981 1991 11 1989 38.0 1986 0.42 7.4 0.49 1.4 2.4 3 7.2 13 34 -USGS 01491000 80155 68082 5 9 1981 1991 11 1989 17.0 1986 0.68 4.5 0.7 1.2 1.8 3.1 5.8 6.8 15 -USGS 01491000 80155 68082 5 10 1981 1991 11 1989 11.0 1985 0.62 3.7 0.62 1.3 2.3 3.5 4.9 4.9 9.8 -USGS 01491000 80155 68082 5 11 1981 1991 11 1990 140 1986 0.48 17 0.51 1.2 2.1 3.3 6.1 13 116 -USGS 01491000 80155 68082 5 12 1981 1991 11 1981 101 1986 0.50 19 0.52 1.1 1.9 2.5 16 55 97 -USGS 01491000 80155 68082 5 13 1981 1991 11 1981 67.0 1986 0.23 9.6 0.3 0.84 1.2 2.2 10 13 57 -USGS 01491000 80155 68082 5 14 1981 1991 11 1981 16.0 1986 0.24 4 0.29 0.82 1.3 2.1 5.6 7.6 15 -USGS 01491000 80155 68082 5 15 1981 1991 11 1990 7.10 1986 0.33 3.1 0.41 0.87 1.1 2.2 6.2 6.4 7 -USGS 01491000 80155 68082 5 16 1981 1991 11 1981 44.0 1986 0.36 6.3 0.37 0.46 0.52 2.2 4.8 5.2 36 -USGS 01491000 80155 68082 5 17 1981 1991 11 1981 58.0 1986 0.57 8.9 0.65 1.1 1.3 2 4.4 14 50 -USGS 01491000 80155 68082 5 18 1981 1991 11 1981 16.0 1986 0.53 4.9 0.66 1.3 1.4 2.1 6.3 12 16 -USGS 01491000 80155 68082 5 19 1981 1991 11 1981 7.80 1986 0.40 3.3 0.58 1.3 1.3 3 5 6.3 7.7 -USGS 01491000 80155 68082 5 20 1981 1991 11 1988 17.0 1986 0.44 4.2 0.48 0.84 1.1 3.1 4.4 7.3 15 -USGS 01491000 80155 68082 5 21 1981 1991 11 1988 13.0 1985 0.50 3.5 0.51 0.73 0.97 2 3.6 6.8 12 -USGS 01491000 80155 68082 5 22 1981 1991 11 1983 11.0 1986 0.58 3.7 0.65 1 1.2 2 6.8 7.7 10 -USGS 01491000 80155 68082 5 23 1981 1991 11 1983 47.0 1986 0.55 8.4 0.63 1.1 1.4 3.5 7.5 13 41 -USGS 01491000 80155 68082 5 24 1981 1991 11 1989 109 1986 0.36 14 0.44 1 1.4 2.5 6.6 13 91 -USGS 01491000 80155 68082 5 25 1981 1991 11 1989 76.0 1986 0.34 9.7 0.43 0.97 1.2 2.9 5.3 7.8 63 -USGS 01491000 80155 68082 5 26 1981 1991 11 1989 24.0 1986 0.20 4.7 0.32 0.95 1.2 2.7 4.2 5.8 21 -USGS 01491000 80155 68082 5 27 1981 1991 11 1989 12.0 1986 0.18 4.1 0.26 0.87 1.3 3 7.5 7.7 11 -USGS 01491000 80155 68082 5 28 1981 1991 11 1989 16.0 1986 0.33 4.4 0.37 0.79 1.2 2.7 4.2 10 16 -USGS 01491000 80155 68082 5 29 1981 1991 11 1990 156 1986 0.23 18 0.28 0.74 1.1 2.1 9.8 11 127 -USGS 01491000 80155 68082 5 30 1981 1991 11 1990 314 1986 0.15 42 0.23 0.97 1.6 2.5 6.3 76 276 -USGS 01491000 80155 68082 5 31 1981 1991 11 1984 220 1986 0.15 28 0.2 0.69 1.1 2.4 9.1 40 188 -USGS 01491000 80155 68082 6 1 1981 1991 11 1984 60.0 1986 0.13 9.3 0.24 0.96 1.4 2.9 10 14 51 -USGS 01491000 80155 68082 6 2 1981 1991 11 1984 22.0 1986 0.14 5.8 0.18 0.57 0.93 3.7 10 12 20 -USGS 01491000 80155 68082 6 3 1981 1991 11 1982 21.0 1986 0.26 5.4 0.41 1 1 3.4 8.7 9.2 19 -USGS 01491000 80155 68082 6 4 1981 1991 11 1982 8.40 1986 0.23 3.6 0.34 0.8 0.8 3.1 5.6 6.7 8.2 -USGS 01491000 80155 68082 6 5 1981 1991 11 1984 5.50 1986 0.16 2.9 0.25 0.7 0.85 3.1 5.1 5.3 5.5 -USGS 01491000 80155 68082 6 6 1981 1991 11 1989 13.0 1986 0.10 3.7 0.21 0.66 0.7 2.4 5.3 5.4 11 -USGS 01491000 80155 68082 6 7 1981 1991 11 1989 18.0 1986 0.11 4.4 0.19 0.55 0.57 2.9 6 7.6 16 -USGS 01491000 80155 68082 6 8 1981 1991 11 1989 14.0 1986 0.12 3.3 0.17 0.4 0.42 2.4 4.1 5.2 12 -USGS 01491000 80155 68082 6 9 1981 1991 11 1989 9.40 1986 0.12 2.5 0.15 0.57 1 1.6 3.3 3.8 8.4 -USGS 01491000 80155 68082 6 10 1981 1991 11 1989 6.20 1986 0.05 2.1 0.09 0.43 0.7 2.1 2.5 3.2 5.7 -USGS 01491000 80155 68082 6 11 1981 1991 11 1989 5.60 1986 0.05 1.7 0.09 0.42 0.7 1.2 2.1 2.9 5.2 -USGS 01491000 80155 68082 6 12 1981 1991 11 1989 4.20 1986 0.06 1.4 0.09 0.42 0.76 0.93 1.8 2.7 4 -USGS 01491000 80155 68082 6 13 1981 1991 11 1981 3.80 1986 0.09 1.4 0.11 0.38 0.64 1 2.1 2.8 3.7 -USGS 01491000 80155 68082 6 14 1981 1991 11 1982 8.80 1986 0.16 1.9 0.16 0.24 0.32 1.1 3 3.2 7.7 -USGS 01491000 80155 68082 6 15 1981 1991 11 1982 15.0 1991 0.19 2.5 0.19 0.26 0.35 0.99 2.8 3.2 13 -USGS 01491000 80155 68082 6 16 1981 1991 11 1989 14.0 1986 0.24 2.7 0.26 0.33 0.35 0.69 4.3 5.3 12 -USGS 01491000 80155 68082 6 17 1981 1991 11 1989 21.0 1986 0.21 3 0.24 0.4 0.44 0.96 2.9 3.4 18 -USGS 01491000 80155 68082 6 18 1981 1991 11 1991 29.0 1986 0.12 7 0.16 0.41 0.51 1.3 12 22 29 -USGS 01491000 80155 68082 6 19 1981 1991 11 1989 28.0 1986 0.11 6.8 0.14 0.3 0.34 2.1 10 19 27 -USGS 01491000 80155 68082 6 20 1981 1991 11 1989 15.0 1986 0.10 4.1 0.13 0.26 0.27 1.8 8.1 9.2 14 -USGS 01491000 80155 68082 6 21 1981 1991 11 1983 109 1986 0.08 13 0.11 0.26 0.31 1.6 3.4 15 92 -USGS 01491000 80155 68082 6 22 1981 1991 11 1983 133 1986 0.09 21 0.12 0.35 0.51 0.96 2.4 54 124 -USGS 01491000 80155 68082 6 23 1981 1991 11 1989 118 1986 0.04 15 0.07 0.22 0.26 0.94 2.1 25 103 -USGS 01491000 80155 68082 6 24 1981 1991 11 1989 54.0 1986 0.04 7 0.06 0.26 0.42 0.78 1.3 11 47 -USGS 01491000 80155 68082 6 25 1981 1991 11 1989 34.0 1986 0.06 4.7 0.08 0.27 0.45 0.67 5.1 6.8 29 -USGS 01491000 80155 68082 6 26 1981 1991 11 1989 23.0 1986 0.09 3.7 0.1 0.22 0.34 0.81 5.2 5.5 20 -USGS 01491000 80155 68082 6 27 1981 1991 11 1989 13.0 1986 0.07 3.3 0.07 0.19 0.35 0.91 4.6 9 13 -USGS 01491000 80155 68082 6 28 1981 1991 11 1989 7.80 1986 0.04 1.8 0.06 0.2 0.3 0.79 4.1 4.2 7.1 -USGS 01491000 80155 68082 6 29 1981 1991 11 1989 5.50 1986 0.04 1.5 0.07 0.19 0.21 0.66 2.1 4.1 5.5 -USGS 01491000 80155 68082 6 30 1981 1991 11 1983 6.00 1986 0.10 1.3 0.11 0.16 0.18 0.57 1.6 2.6 5.4 -USGS 01491000 80155 68082 7 1 1981 1991 11 1989 3.30 1985 0.07 1.1 0.07 0.12 0.16 0.43 2.1 2.6 3.2 -USGS 01491000 80155 68082 7 2 1981 1991 11 1989 2.50 1991 0.09 0.9 0.09 0.12 0.15 0.61 1.8 1.8 2.4 -USGS 01491000 80155 68082 7 3 1981 1991 11 1989 1.90 1985 0.14 0.77 0.14 0.17 0.19 0.73 1.3 1.4 1.8 -USGS 01491000 80155 68082 7 4 1981 1991 11 1982 8.80 1986 0.10 1.6 0.11 0.17 0.23 0.98 1.5 2 7.5 -USGS 01491000 80155 68082 7 5 1981 1991 11 1982 9.10 1986 0.08 1.7 0.09 0.16 0.21 0.93 1.4 2.5 7.9 -USGS 01491000 80155 68082 7 6 1981 1991 11 1989 4.50 1986 0.03 1.1 0.05 0.17 0.27 0.97 1.4 1.9 4 -USGS 01491000 80155 68082 7 7 1981 1991 11 1989 4.60 1986 0.05 0.93 0.06 0.12 0.19 0.64 1 1.2 3.9 -USGS 01491000 80155 68082 7 8 1981 1991 11 1989 5.30 1986 0.07 1 0.07 0.16 0.26 0.73 1 1.2 4.5 -USGS 01491000 80155 68082 7 9 1981 1991 11 1989 2.90 1986 0.06 0.7 0.07 0.14 0.16 0.66 0.8 0.85 2.5 -USGS 01491000 80155 68082 7 10 1981 1991 11 1989 2.40 1986 0.07 0.58 0.07 0.11 0.15 0.41 0.73 0.73 2.1 -USGS 01491000 80155 68082 7 11 1981 1991 11 1990 6.20 1986 0.07 1 0.09 0.19 0.22 0.47 0.57 1.3 5.3 -USGS 01491000 80155 68082 7 12 1981 1991 11 1990 2.80 1986 0.04 0.69 0.05 0.14 0.19 0.32 0.95 1.3 2.6 -USGS 01491000 80155 68082 7 13 1981 1991 11 1990 4.20 1986 0.07 0.91 0.07 0.13 0.19 0.41 1.5 1.6 3.7 -USGS 01491000 80155 68082 7 14 1981 1991 11 1990 4.00 1991 0.09 0.75 0.1 0.12 0.13 0.37 0.61 1.2 3.5 -USGS 01491000 80155 68082 7 15 1981 1991 11 1990 7.30 1991 0.08 0.92 0.09 0.12 0.13 0.25 0.41 0.72 6 -USGS 01491000 80155 68082 7 16 1981 1991 11 1989 6.20 1986 0.04 1.2 0.04 0.08 0.11 0.16 0.44 3.1 5.9 -USGS 01491000 80155 68082 7 17 1981 1991 11 1989 27.0 1988 0.03 2.9 0.05 0.11 0.11 0.32 1.6 1.6 22 -USGS 01491000 80155 68082 7 18 1981 1991 11 1989 19.0 1986 0.09 2.1 0.09 0.1 0.11 0.23 0.97 1.3 16 -USGS 01491000 80155 68082 7 19 1981 1991 11 1989 6.90 1986 0.08 1.2 0.08 0.1 0.11 0.44 0.86 2.3 6.2 -USGS 01491000 80155 68082 7 20 1981 1991 11 1983 13.0 1986 0.09 2 0.09 0.09 0.1 0.37 2.8 3.4 11 -USGS 01491000 80155 68082 7 21 1981 1991 11 1983 4.70 1986 0.05 1.2 0.05 0.11 0.18 0.27 2.9 3 4.4 -USGS 01491000 80155 68082 7 22 1981 1991 11 1984 13.0 1986 0.04 1.9 0.06 0.15 0.19 0.38 1.9 2.9 11 -USGS 01491000 80155 68082 7 23 1981 1991 11 1984 9.50 1986 0.04 1.5 0.04 0.08 0.12 0.44 1.1 2.2 8.2 -USGS 01491000 80155 68082 7 24 1981 1991 11 1989 4.30 1986 0.03 0.91 0.03 0.1 0.17 0.42 0.78 1.8 3.9 -USGS 01491000 80155 68082 7 25 1981 1991 11 1989 3.20 1986 0.02 0.7 0.05 0.18 0.19 0.39 0.84 1.2 2.8 -USGS 01491000 80155 68082 7 26 1981 1991 11 1989 3.30 1986 0.03 0.73 0.04 0.11 0.12 0.42 1.1 1.2 2.9 -USGS 01491000 80155 68082 7 27 1981 1991 11 1989 34.0 1986 0.03 5.8 0.05 0.16 0.18 0.33 1.3 17 33 -USGS 01491000 80155 68082 7 28 1981 1991 11 1989 58.0 1986 0.03 10 0.06 0.18 0.19 0.35 1.1 32 57 -USGS 01491000 80155 68082 7 29 1981 1991 11 1991 12.0 1986 0.05 2.8 0.06 0.09 0.1 0.39 5.4 8.8 12 -USGS 01491000 80155 68082 7 30 1981 1991 11 1981 5.70 1985 0.08 1.3 0.08 0.1 0.11 0.28 3.2 3.5 5.3 -USGS 01491000 80155 68082 7 31 1981 1991 11 1989 4.80 1985 0.08 0.94 0.09 0.12 0.13 0.37 1.4 1.8 4.2 -USGS 01491000 80155 68082 8 1 1981 1991 11 1989 4.30 1983 0.08 0.77 0.08 0.09 0.1 0.23 1.1 1.1 3.7 -USGS 01491000 80155 68082 8 2 1981 1991 11 1989 3.70 1985 0.08 0.61 0.08 0.09 0.09 0.21 0.66 0.77 3.1 -USGS 01491000 80155 68082 8 3 1981 1991 11 1989 2.90 1988 0.06 0.51 0.07 0.09 0.1 0.23 0.54 0.7 2.5 -USGS 01491000 80155 68082 8 4 1981 1991 11 1989 2.30 1988 0.03 0.5 0.04 0.1 0.11 0.26 0.71 0.83 2 -USGS 01491000 80155 68082 8 5 1981 1991 11 1989 1.80 1990 0.06 0.36 0.06 0.08 0.08 0.15 0.33 0.53 1.6 -USGS 01491000 80155 68082 8 6 1981 1991 11 1989 1.60 1985 0.03 0.39 0.04 0.07 0.08 0.19 0.58 0.72 1.4 -USGS 01491000 80155 68082 8 7 1981 1991 11 1989 1.50 1985 0.05 0.43 0.06 0.11 0.16 0.23 0.52 0.81 1.4 -USGS 01491000 80155 68082 8 8 1981 1991 11 1989 1.50 1986 0.09 0.41 0.11 0.17 0.18 0.23 0.51 0.65 1.4 -USGS 01491000 80155 68082 8 9 1981 1991 11 1989 2.70 1986 0.08 0.66 0.09 0.15 0.16 0.21 0.68 1.6 2.6 -USGS 01491000 80155 68082 8 10 1981 1991 11 1985 2.20 1986 0.07 0.72 0.07 0.11 0.14 0.41 1.2 1.4 2.1 -USGS 01491000 80155 68082 8 11 1981 1991 11 1990 1.80 1983 0.07 0.54 0.07 0.11 0.13 0.48 0.86 0.87 1.6 -USGS 01491000 80155 68082 8 12 1981 1991 11 1983 1.60 1986 0.08 0.49 0.09 0.12 0.13 0.39 0.75 0.8 1.4 -USGS 01491000 80155 68082 8 13 1981 1991 11 1983 1.90 1986 0.04 0.56 0.05 0.08 0.09 0.25 0.67 1.3 1.9 -USGS 01491000 80155 68082 8 14 1981 1991 11 1990 15.0 1986 0.03 1.8 0.03 0.06 0.08 0.28 0.61 1.8 13 -USGS 01491000 80155 68082 8 15 1981 1991 11 1990 2.70 1987 0.03 0.64 0.03 0.06 0.08 0.18 0.86 1.7 2.6 -USGS 01491000 80155 68082 8 16 1981 1991 11 1989 2.10 1986 0.03 0.48 0.04 0.08 0.12 0.19 0.76 0.87 1.9 -USGS 01491000 80155 68082 8 17 1981 1991 11 1989 2.50 1983 0.07 0.44 0.07 0.07 0.08 0.16 0.58 0.61 2.1 -USGS 01491000 80155 68082 8 18 1981 1991 11 1989 2.20 1988 0.06 0.42 0.06 0.07 0.07 0.27 0.42 0.47 1.9 -USGS 01491000 80155 68082 8 19 1981 1991 11 1989 2.50 1988 0.04 0.49 0.04 0.06 0.08 0.22 0.53 0.69 2.2 -USGS 01491000 80155 68082 8 20 1981 1991 11 1989 3.10 1983 0.07 0.57 0.07 0.1 0.12 0.26 0.56 0.81 2.7 -USGS 01491000 80155 68082 8 21 1981 1991 11 1989 3.00 1983 0.05 0.61 0.05 0.1 0.15 0.23 0.73 1.1 2.7 -USGS 01491000 80155 68082 8 22 1981 1991 11 1989 2.10 1983 0.05 0.51 0.05 0.08 0.12 0.28 0.79 0.84 1.9 -USGS 01491000 80155 68082 8 23 1981 1991 11 1983 4.90 1987 0.10 0.84 0.1 0.13 0.18 0.29 0.78 1.2 4.2 -USGS 01491000 80155 68082 8 24 1981 1991 11 1983 3.00 1991 0.09 0.59 0.09 0.12 0.16 0.24 0.51 0.98 2.7 -USGS 01491000 80155 68082 8 25 1981 1991 11 1989 1.10 1987 0.07 0.36 0.07 0.11 0.14 0.26 0.46 0.65 1 -USGS 01491000 80155 68082 8 26 1981 1991 11 1989 0.76 1987 0.06 0.24 0.06 0.09 0.1 0.18 0.29 0.33 0.68 -USGS 01491000 80155 68082 8 27 1981 1991 11 1989 0.70 1987 0.06 0.23 0.06 0.1 0.13 0.17 0.24 0.34 0.64 -USGS 01491000 80155 68082 8 28 1981 1991 11 1989 0.89 1982 0.04 0.25 0.05 0.08 0.08 0.19 0.33 0.4 0.8 -USGS 01491000 80155 68082 8 29 1981 1991 11 1983 3.10 1982 0.03 0.51 0.04 0.09 0.13 0.17 0.43 0.69 2.7 -USGS 01491000 80155 68082 8 30 1981 1991 11 1983 7.10 1982 0.02 0.99 0.04 0.12 0.12 0.3 0.59 1 5.9 -USGS 01491000 80155 68082 8 31 1981 1991 11 1985 2.30 1982 0.03 0.55 0.04 0.09 0.1 0.3 0.82 1 2.1 -USGS 01491000 80155 68082 9 1 1981 1991 11 1985 8.90 1982 0.03 1 0.04 0.08 0.09 0.24 0.36 0.45 7.2 -USGS 01491000 80155 68082 9 2 1981 1991 11 1985 2.40 1982 0.03 0.43 0.04 0.07 0.07 0.14 0.45 0.65 2.1 -USGS 01491000 80155 68082 9 3 1981 1991 11 1989 1.10 1982 0.04 0.26 0.04 0.05 0.06 0.13 0.32 0.33 0.95 -USGS 01491000 80155 68082 9 4 1981 1991 11 1989 0.96 1982 0.06 0.22 0.06 0.06 0.06 0.16 0.28 0.3 0.83 -USGS 01491000 80155 68082 9 5 1981 1991 11 1989 0.63 1982 0.04 0.18 0.04 0.05 0.06 0.1 0.23 0.36 0.59 -USGS 01491000 80155 68082 9 6 1981 1991 11 1985 0.68 1982 0.04 0.2 0.04 0.06 0.06 0.11 0.25 0.41 0.65 -USGS 01491000 80155 68082 9 7 1981 1991 11 1989 0.51 1982 0.02 0.15 0.03 0.06 0.06 0.1 0.23 0.26 0.46 -USGS 01491000 80155 68082 9 8 1981 1991 11 1989 0.36 1982 0.03 0.13 0.03 0.05 0.06 0.12 0.19 0.21 0.33 -USGS 01491000 80155 68082 9 9 1981 1991 11 1981 1.20 1982 0.05 0.23 0.05 0.05 0.05 0.11 0.23 0.27 1 -USGS 01491000 80155 68082 9 10 1981 1991 11 1984 0.78 1982 0.05 0.21 0.05 0.05 0.05 0.12 0.35 0.36 0.7 -USGS 01491000 80155 68082 9 11 1981 1991 11 1984 1.00 1982 0.05 0.21 0.05 0.05 0.05 0.12 0.24 0.29 0.87 -USGS 01491000 80155 68082 9 12 1981 1991 11 1984 0.92 1982 0.03 0.24 0.03 0.04 0.05 0.06 0.22 0.62 0.91 -USGS 01491000 80155 68082 9 13 1981 1991 11 1984 0.82 1986 0.05 0.2 0.05 0.05 0.05 0.07 0.26 0.39 0.75 -USGS 01491000 80155 68082 9 14 1981 1991 11 1984 0.82 1986 0.07 0.25 0.07 0.09 0.1 0.18 0.25 0.43 0.77 -USGS 01491000 80155 68082 9 15 1981 1991 11 1984 1.20 1986 0.04 0.26 0.04 0.06 0.06 0.14 0.28 0.41 1.1 -USGS 01491000 80155 68082 9 16 1981 1991 11 1981 1.10 1986 0.03 0.28 0.03 0.05 0.06 0.09 0.48 0.7 1.1 -USGS 01491000 80155 68082 9 17 1981 1991 11 1981 2.00 1982 0.04 0.32 0.04 0.04 0.05 0.07 0.22 0.52 1.7 -USGS 01491000 80155 68082 9 18 1981 1991 11 1981 12.0 1982 0.03 1.2 0.03 0.05 0.06 0.09 0.12 0.65 9.8 -USGS 01491000 80155 68082 9 19 1981 1991 11 1981 40.0 1988 0.04 4.2 0.04 0.06 0.06 0.09 0.16 3.1 33 -USGS 01491000 80155 68082 9 20 1981 1991 11 1981 25.0 1988 0.03 4.2 0.03 0.04 0.04 0.07 0.15 13 24 -USGS 01491000 80155 68082 9 21 1981 1991 11 1989 19.0 1988 0.03 2.3 0.03 0.04 0.04 0.1 0.15 3.5 16 -USGS 01491000 80155 68082 9 22 1981 1991 11 1989 7.10 1988 0.03 0.93 0.03 0.05 0.06 0.09 0.4 1.4 6.1 -USGS 01491000 80155 68082 9 23 1981 1991 11 1989 2.60 1988 0.02 0.54 0.03 0.05 0.05 0.16 0.46 1.3 2.5 -USGS 01491000 80155 68082 9 24 1981 1991 11 1989 1.30 1982 0.05 0.32 0.05 0.05 0.05 0.07 0.41 0.82 1.3 -USGS 01491000 80155 68082 9 25 1981 1991 11 1989 1.90 1984 0.03 0.34 0.03 0.05 0.06 0.15 0.25 0.54 1.7 -USGS 01491000 80155 68082 9 26 1981 1991 11 1989 8.70 1982 0.04 1 0.04 0.05 0.06 0.15 0.68 0.84 7.1 -USGS 01491000 80155 68082 9 27 1981 1991 11 1989 52.0 1984 0.04 8.2 0.04 0.06 0.06 0.14 0.65 22 49 -USGS 01491000 80155 68082 9 28 1981 1991 11 1985 139 1988 0.05 14 0.05 0.06 0.07 0.11 0.51 7.4 114 -USGS 01491000 80155 68082 9 29 1981 1991 11 1985 40.0 1988 0.04 4.1 0.04 0.05 0.05 0.08 0.78 2.7 33 -USGS 01491000 80155 68082 9 30 1981 1990 10 1985 10.0 1988 0.04 1.4 0.04 0.05 0.06 0.15 1.3 2.3 9.3 -USGS 01491000 80155 68082 10 1 1981 1991 11 1986 5.80 1991 0.05 0.91 0.06 0.09 0.09 0.2 0.46 1.5 5.1 -USGS 01491000 80155 68082 10 2 1981 1991 11 1986 4.30 1991 0.05 0.85 0.06 0.08 0.09 0.21 0.55 2 4 -USGS 01491000 80155 68082 10 3 1981 1991 11 1986 9.10 1991 0.05 1.8 0.05 0.09 0.12 0.23 0.58 5.3 9 -USGS 01491000 80155 68082 10 4 1981 1991 11 1986 30.0 1991 0.04 3.9 0.05 0.09 0.12 0.23 0.71 6.3 26 -USGS 01491000 80155 68082 10 5 1981 1991 11 1986 19.0 1991 0.04 2.2 0.05 0.11 0.11 0.24 0.58 2.2 16 -USGS 01491000 80155 68082 10 6 1981 1991 11 1986 6.30 1991 0.04 0.96 0.05 0.1 0.11 0.15 0.6 1.5 5.5 -USGS 01491000 80155 68082 10 7 1981 1991 11 1986 2.90 1991 0.04 0.64 0.05 0.11 0.12 0.2 1 1.5 2.7 -USGS 01491000 80155 68082 10 8 1981 1991 11 1990 1.30 1991 0.04 0.4 0.05 0.07 0.08 0.15 0.85 1.1 1.3 -USGS 01491000 80155 68082 10 9 1981 1991 11 1982 0.81 1988 0.03 0.29 0.03 0.04 0.04 0.13 0.66 0.73 0.8 -USGS 01491000 80155 68082 10 10 1981 1991 11 1990 1.40 1988 0.03 0.3 0.03 0.04 0.04 0.19 0.31 0.47 1.2 -USGS 01491000 80155 68082 10 11 1981 1991 11 1990 1.30 1987 0.04 0.3 0.04 0.05 0.06 0.21 0.3 0.42 1.1 -USGS 01491000 80155 68082 10 12 1981 1991 11 1990 0.96 1991 0.04 0.35 0.04 0.05 0.05 0.21 0.74 0.79 0.93 -USGS 01491000 80155 68082 10 13 1981 1991 11 1984 0.95 1991 0.04 0.34 0.04 0.05 0.05 0.26 0.69 0.82 0.94 -USGS 01491000 80155 68082 10 14 1981 1991 11 1990 0.87 1988 0.05 0.32 0.05 0.08 0.11 0.28 0.43 0.63 0.85 -USGS 01491000 80155 68082 10 15 1981 1991 11 1990 0.83 1988 0.03 0.33 0.04 0.07 0.09 0.27 0.51 0.64 0.81 -USGS 01491000 80155 68082 10 16 1981 1991 11 1987 0.46 1988 0.02 0.23 0.03 0.07 0.09 0.26 0.42 0.42 0.45 -USGS 01491000 80155 68082 10 17 1981 1991 11 1986 0.62 1988 0.03 0.22 0.03 0.04 0.04 0.16 0.46 0.47 0.59 -USGS 01491000 80155 68082 10 18 1981 1991 11 1984 0.73 1983 0.04 0.23 0.04 0.04 0.05 0.13 0.38 0.45 0.68 -USGS 01491000 80155 68082 10 19 1981 1991 11 1991 14.0 1983 0.04 1.6 0.04 0.04 0.05 0.18 0.68 0.79 11 -USGS 01491000 80155 68082 10 20 1981 1991 11 1991 2.10 1983 0.04 0.56 0.04 0.04 0.05 0.18 0.7 1.4 2.1 -USGS 01491000 80155 68082 10 21 1981 1991 11 1990 7.20 1988 0.03 0.91 0.03 0.04 0.05 0.17 0.55 1 6 -USGS 01491000 80155 68082 10 22 1981 1991 11 1990 6.30 1988 0.03 0.79 0.04 0.07 0.09 0.2 0.4 0.54 5.2 -USGS 01491000 80155 68082 10 23 1981 1991 11 1990 2.30 1988 0.02 0.47 0.03 0.07 0.08 0.28 0.6 0.62 2 -USGS 01491000 80155 68082 10 24 1981 1991 11 1984 3.00 1988 0.03 0.7 0.03 0.06 0.08 0.21 1.1 1.6 2.8 -USGS 01491000 80155 68082 10 25 1981 1991 11 1984 4.30 1988 0.03 0.9 0.03 0.05 0.05 0.18 1.7 1.7 3.8 -USGS 01491000 80155 68082 10 26 1981 1991 11 1981 85.0 1988 0.02 8.3 0.03 0.08 0.11 0.17 1.6 1.8 68 -USGS 01491000 80155 68082 10 27 1981 1991 11 1981 53.0 1988 0.02 5.2 0.03 0.07 0.1 0.22 1.1 1.2 43 -USGS 01491000 80155 68082 10 28 1981 1991 11 1981 10.0 1985 0.05 1.3 0.06 0.1 0.12 0.18 1.1 1.1 8.2 -USGS 01491000 80155 68082 10 29 1981 1991 11 1981 4.20 1989 0.05 0.7 0.06 0.11 0.12 0.2 0.94 0.98 3.6 -USGS 01491000 80155 68082 10 30 1981 1991 11 1981 2.60 1983 0.05 0.5 0.05 0.06 0.08 0.14 0.65 0.82 2.3 -USGS 01491000 80155 68082 10 31 1981 1991 11 1981 2.20 1989 0.05 0.49 0.05 0.06 0.07 0.19 1 1.1 2 -USGS 01491000 80155 68082 11 1 1981 1991 11 1981 1.90 1988 0.07 0.51 0.07 0.09 0.09 0.14 1 1.1 1.7 -USGS 01491000 80155 68082 11 2 1981 1991 11 1981 1.50 1988 0.03 0.53 0.04 0.08 0.09 0.23 0.89 1.3 1.5 -USGS 01491000 80155 68082 11 3 1981 1991 11 1990 1.50 1988 0.03 0.45 0.03 0.04 0.04 0.23 0.76 1 1.4 -USGS 01491000 80155 68082 11 4 1981 1991 11 1990 1.50 1988 0.03 0.5 0.03 0.06 0.08 0.21 0.95 1.1 1.4 -USGS 01491000 80155 68082 11 5 1981 1991 11 1990 1.80 1988 0.03 0.53 0.06 0.16 0.17 0.39 0.72 0.83 1.6 -USGS 01491000 80155 68082 11 6 1981 1991 11 1989 2.40 1988 0.06 0.69 0.07 0.14 0.18 0.34 1.2 1.3 2.2 -USGS 01491000 80155 68082 11 7 1981 1991 11 1981 1.30 1988 0.05 0.5 0.05 0.09 0.11 0.23 1 1.2 1.3 -USGS 01491000 80155 68082 11 8 1981 1991 11 1981 2.60 1985 0.06 0.57 0.07 0.11 0.11 0.21 0.81 1.1 2.3 -USGS 01491000 80155 68082 11 9 1981 1991 11 1990 3.80 1985 0.06 0.56 0.06 0.09 0.11 0.14 0.49 0.5 3.1 -USGS 01491000 80155 68082 11 10 1981 1991 11 1990 11.0 1985 0.06 1.3 0.06 0.08 0.1 0.14 0.49 0.8 9 -USGS 01491000 80155 68082 11 11 1981 1991 11 1990 8.30 1982 0.10 1.1 0.1 0.1 0.11 0.27 0.53 0.93 6.9 -USGS 01491000 80155 68082 11 12 1981 1991 11 1990 4.50 1985 0.07 0.7 0.07 0.09 0.1 0.24 0.49 0.98 3.9 -USGS 01491000 80155 68082 11 13 1981 1991 11 1990 3.90 1985 0.06 0.67 0.06 0.08 0.09 0.24 0.77 0.97 3.3 -USGS 01491000 80155 68082 11 14 1981 1991 11 1990 1.80 1987 0.05 0.47 0.05 0.07 0.09 0.27 0.55 0.94 1.7 -USGS 01491000 80155 68082 11 15 1981 1991 11 1990 1.70 1987 0.05 0.4 0.05 0.07 0.1 0.25 0.56 0.66 1.5 -USGS 01491000 80155 68082 11 16 1981 1991 11 1984 2.20 1988 0.04 0.47 0.04 0.07 0.1 0.33 0.53 0.72 1.9 -USGS 01491000 80155 68082 11 17 1981 1991 11 1984 3.20 1988 0.04 0.54 0.04 0.07 0.1 0.26 0.45 0.53 2.7 -USGS 01491000 80155 68082 11 18 1981 1991 11 1981 1.60 1988 0.04 0.59 0.04 0.07 0.1 0.38 0.87 1.3 1.6 -USGS 01491000 80155 68082 11 19 1981 1991 11 1981 5.50 1988 0.09 0.83 0.1 0.15 0.16 0.28 0.67 0.74 4.6 -USGS 01491000 80155 68082 11 20 1981 1991 11 1981 4.50 1988 0.04 0.79 0.06 0.15 0.16 0.37 0.67 0.87 3.8 -USGS 01491000 80155 68082 11 21 1981 1991 11 1984 43.0 1988 0.04 4.7 0.06 0.15 0.16 0.36 2.7 2.7 35 -USGS 01491000 80155 68082 11 22 1981 1991 11 1984 37.0 1988 0.04 4.2 0.07 0.19 0.2 0.76 1.9 2.8 30 -USGS 01491000 80155 68082 11 23 1981 1991 11 1984 12.0 1988 0.04 1.9 0.06 0.15 0.16 0.92 2.1 2.3 10 -USGS 01491000 80155 68082 11 24 1981 1991 11 1984 8.70 1988 0.04 1.5 0.06 0.17 0.19 0.69 1.5 2.6 7.6 -USGS 01491000 80155 68082 11 25 1981 1991 11 1984 27.0 1988 0.04 3 0.06 0.15 0.19 0.39 1.3 1.6 22 -USGS 01491000 80155 68082 11 26 1981 1991 11 1984 58.0 1988 0.04 5.9 0.04 0.08 0.12 0.73 0.96 1.9 47 -USGS 01491000 80155 68082 11 27 1981 1991 11 1984 31.0 1988 0.04 4 0.04 0.06 0.06 0.75 2.8 4.9 26 -USGS 01491000 80155 68082 11 28 1981 1991 11 1989 48.0 1985 0.06 6.2 0.06 0.16 0.27 0.75 4.9 7.5 40 -USGS 01491000 80155 68082 11 29 1981 1991 11 1989 51.0 1988 0.14 6.3 0.16 0.27 0.32 1.6 3.5 4.3 42 -USGS 01491000 80155 68082 11 30 1981 1991 11 1989 36.0 1991 0.26 6 0.28 0.47 0.63 1.6 4.7 11 32 -USGS 01491000 80155 68082 12 1 1981 1991 11 1989 13.0 1991 0.24 3.3 0.24 0.45 0.75 1.4 5.5 7.8 12 -USGS 01491000 80155 68082 12 2 1981 1991 11 1989 6.50 1988 0.18 2.2 0.19 0.29 0.37 1.7 4.5 5.1 6.3 -USGS 01491000 80155 68082 12 3 1981 1991 11 1986 5.90 1985 0.17 2.1 0.18 0.23 0.25 1.2 3.9 4.2 5.6 -USGS 01491000 80155 68082 12 4 1981 1991 11 1986 4.50 1985 0.09 1.9 0.09 0.25 0.47 1.8 3 3.4 4.3 -USGS 01491000 80155 68082 12 5 1981 1991 11 1984 24.0 1985 0.08 3.3 0.08 0.18 0.3 1.2 2.4 2.8 20 -USGS 01491000 80155 68082 12 6 1981 1991 11 1984 14.0 1988 0.04 2.8 0.11 0.4 0.44 1.2 1.9 5.7 13 -USGS 01491000 80155 68082 12 7 1981 1991 11 1983 9.00 1988 0.04 2.3 0.09 0.41 0.58 1 1.6 6 9 -USGS 01491000 80155 68082 12 8 1981 1991 11 1983 5.60 1988 0.04 1.5 0.09 0.31 0.36 0.75 1.5 3.4 5.4 -USGS 01491000 80155 68082 12 9 1981 1991 11 1984 5.20 1988 0.04 1.3 0.1 0.4 0.48 0.56 1.9 2.6 4.8 -USGS 01491000 80155 68082 12 10 1981 1991 11 1984 4.20 1988 0.04 1.2 0.09 0.34 0.45 0.6 1.2 2.7 4.1 -USGS 01491000 80155 68082 12 11 1981 1991 11 1987 5.50 1988 0.07 1.2 0.1 0.29 0.43 0.78 0.99 1.8 4.9 -USGS 01491000 80155 68082 12 12 1981 1991 11 1987 7.20 1988 0.08 1.5 0.1 0.21 0.23 0.73 1.2 3 6.6 -USGS 01491000 80155 68082 12 13 1981 1991 11 1984 96.0 1988 0.06 9.9 0.09 0.25 0.33 0.71 1 5.2 78 -USGS 01491000 80155 68082 12 14 1981 1991 11 1984 280 1988 0.05 26 0.09 0.33 0.43 0.86 1.4 3 225 -USGS 01491000 80155 68082 12 15 1981 1991 11 1984 85.0 1988 0.18 8.8 0.21 0.35 0.39 0.58 2.1 3.4 69 -USGS 01491000 80155 68082 12 16 1981 1991 11 1984 29.0 1985 0.21 5.5 0.28 0.56 0.57 0.8 11 13 26 -USGS 01491000 80155 68082 12 17 1981 1991 11 1983 55.0 1985 0.10 8.2 0.13 0.27 0.29 0.84 9.7 16 48 -USGS 01491000 80155 68082 12 18 1981 1991 11 1983 27.0 1988 0.06 4.3 0.09 0.29 0.43 0.78 4.5 8.4 24 -USGS 01491000 80155 68082 12 19 1981 1991 11 1983 8.90 1988 0.06 2.1 0.07 0.18 0.31 0.9 4.6 4.6 8 -USGS 01491000 80155 68082 12 20 1981 1991 11 1983 3.80 1988 0.06 1.5 0.07 0.21 0.38 0.89 3.3 3.4 3.7 -USGS 01491000 80155 68082 12 21 1981 1991 11 1982 2.40 1988 0.07 0.95 0.09 0.27 0.39 0.75 1.7 1.9 2.3 -USGS 01491000 80155 68082 12 22 1981 1991 11 1984 4.90 1988 0.06 1.1 0.11 0.35 0.39 0.59 1.2 1.7 4.3 -USGS 01491000 80155 68082 12 23 1981 1991 11 1984 39.0 1988 0.06 4.2 0.09 0.21 0.22 0.58 0.86 1.8 32 -USGS 01491000 80155 68082 12 24 1981 1991 11 1984 22.0 1988 0.06 2.9 0.09 0.26 0.33 0.68 2 2.6 18 -USGS 01491000 80155 68082 12 25 1981 1991 11 1987 353 1988 0.06 33 0.09 0.28 0.38 0.91 4 4.9 284 -USGS 01491000 80155 68082 12 26 1981 1991 11 1987 448 1988 0.15 42 0.16 0.29 0.43 0.81 2.7 3.1 359 -USGS 01491000 80155 68082 12 27 1981 1991 11 1987 82.0 1988 0.08 8.4 0.1 0.26 0.36 0.84 2.2 3.3 66 -USGS 01491000 80155 68082 12 28 1981 1991 11 1987 22.0 1988 0.08 3.2 0.1 0.23 0.27 0.49 2.7 4.1 19 -USGS 01491000 80155 68082 12 29 1981 1991 11 1984 48.0 1988 0.08 6.1 0.1 0.23 0.28 0.51 4.5 6.5 40 -USGS 01491000 80155 68082 12 30 1981 1991 11 1984 40.0 1988 0.16 5.1 0.18 0.31 0.35 0.66 4.1 5.1 33 -USGS 01491000 80155 68082 12 31 1981 1991 11 1984 7.80 1988 0.13 2 0.14 0.17 0.18 0.75 3.9 4.8 7.3 -USGS 01645000 00060 68476 1 1 1931 2019 89 1976 2980 1931 15.0 166 29 42 53 59 88 165 184 286 581 -USGS 01645000 00060 68476 1 2 1931 2019 89 1979 1750 1931 15.0 148 30 41 52 61 90 150 168 258 414 -USGS 01645000 00060 68476 1 3 1931 2019 89 1936 1370 1931 24.0 149 35 45 57 61 91 155 163 303 544 -USGS 01645000 00060 68476 1 4 1931 2019 89 1944 1410 1931 24.0 136 34 40 57 61 95 151 160 217 385 -USGS 01645000 00060 68476 1 5 1931 2019 89 1949 760 1966 27.0 121 33 38 52 58 91 144 150 252 332 -USGS 01645000 00060 68476 1 6 1931 2019 89 1949 920 1942 23.0 115 35 45 58 64 86 144 158 216 236 -USGS 01645000 00060 68476 1 7 1931 2019 89 1964 570 1931 20.0 119 35 42 61 66 88 145 162 222 316 -USGS 01645000 00060 68476 1 8 1931 2019 89 1979 584 1931 20.0 116 34 39 60 63 94 137 151 191 328 -USGS 01645000 00060 68476 1 9 1931 2019 89 1964 1290 1931 20.0 137 33 39 56 62 98 142 162 195 444 -USGS 01645000 00060 68476 1 10 1931 2019 89 1964 556 1931 20.0 119 34 39 56 60 95 141 154 207 311 -USGS 01645000 00060 68476 1 11 1931 2019 89 2014 839 1931 20.0 114 32 40 56 59 91 133 141 194 293 -USGS 01645000 00060 68476 1 12 1931 2019 89 1991 1030 1931 20.0 125 30 40 55 59 87 138 176 240 386 -USGS 01645000 00060 68476 1 13 1931 2019 89 2018 726 1931 20.0 118 31 40 55 60 86 142 160 226 341 -USGS 01645000 00060 68476 1 14 1931 2019 89 2005 2060 1931 20.0 149 34 39 60 62 91 147 166 222 385 -USGS 01645000 00060 68476 1 15 1931 2019 89 1995 591 1931 20.0 123 32 43 57 62 97 144 154 206 402 -USGS 01645000 00060 68476 1 16 1931 2019 89 1991 779 1966 25.0 121 32 40 57 64 93 135 150 220 315 -USGS 01645000 00060 68476 1 17 1931 2019 89 1991 473 1942 24.0 103 33 38 56 61 92 130 140 179 218 -USGS 01645000 00060 68476 1 18 1931 2019 89 1978 627 1931 24.0 114 32 40 55 60 91 139 144 220 298 -USGS 01645000 00060 68476 1 19 1931 2019 89 1996 5310 1966 25.0 173 38 45 56 66 97 134 147 219 299 -USGS 01645000 00060 68476 1 20 1931 2019 89 1996 2100 1966 25.0 166 41 49 57 64 91 137 144 274 732 -USGS 01645000 00060 68476 1 21 1931 2019 89 1979 2210 1966 24.0 145 34 49 55 60 91 149 153 220 436 -USGS 01645000 00060 68476 1 22 1931 2019 89 1958 534 1966 25.0 121 36 43 57 65 90 140 152 244 376 -USGS 01645000 00060 68476 1 23 1931 2019 89 1998 700 1931 27.0 116 37 41 60 66 90 148 160 206 261 -USGS 01645000 00060 68476 1 24 1931 2019 89 1979 2060 1931 27.0 156 34 39 60 64 99 137 158 318 466 -USGS 01645000 00060 68476 1 25 1931 2019 89 1978 1400 1932 25.0 161 32 38 56 64 94 156 188 339 587 -USGS 01645000 00060 68476 1 26 1931 2019 89 1978 5020 1932 23.0 187 32 39 60 62 101 157 195 267 452 -USGS 01645000 00060 68476 1 27 1931 2019 89 1976 1030 1955 24.0 136 33 45 56 60 100 154 172 218 387 -USGS 01645000 00060 68476 1 28 1931 2019 89 1998 1690 1955 20.0 142 32 39 54 60 90 138 160 283 488 -USGS 01645000 00060 68476 1 29 1931 2019 89 1998 701 1966 23.0 124 32 36 55 62 90 135 151 255 330 -USGS 01645000 00060 68476 1 30 1931 2019 89 1939 1400 1966 23.0 131 31 45 54 61 94 137 163 248 329 -USGS 01645000 00060 68476 1 31 1931 2019 89 2013 4450 1955 23.0 157 33 42 54 63 94 135 155 209 233 -USGS 01645000 00060 68476 2 1 1931 2019 89 2013 726 1931 23.0 126 32 44 55 61 99 144 153 216 325 -USGS 01645000 00060 68476 2 2 1931 2019 89 1973 913 1931 23.0 142 36 42 55 66 101 147 164 317 436 -USGS 01645000 00060 68476 2 3 1931 2019 89 1982 1760 1931 20.0 162 37 47 55 65 108 160 183 288 534 -USGS 01645000 00060 68476 2 4 1931 2019 89 2016 1340 1931 20.0 160 35 47 60 69 102 162 206 437 503 -USGS 01645000 00060 68476 2 5 1931 2019 89 1998 1390 1931 20.0 147 39 50 59 66 100 157 189 255 419 -USGS 01645000 00060 68476 2 6 1931 2019 89 2004 1310 1931 20.0 141 45 49 62 69 103 143 177 233 411 -USGS 01645000 00060 68476 2 7 1931 2019 89 2004 1530 1931 24.0 168 45 50 66 72 109 177 199 300 443 -USGS 01645000 00060 68476 2 8 1931 2019 89 1971 1440 1931 23.0 141 43 50 66 69 100 159 177 247 329 -USGS 01645000 00060 68476 2 9 1931 2019 89 1971 616 1966 30.0 119 45 46 62 67 100 149 157 195 265 -USGS 01645000 00060 68476 2 10 1931 2019 89 1970 664 1966 33.0 121 42 51 63 66 97 144 161 227 272 -USGS 01645000 00060 68476 2 11 1931 2019 89 1981 604 1962 30.0 133 42 50 67 70 102 154 170 270 385 -USGS 01645000 00060 68476 2 12 1931 2019 89 1985 1980 1931 30.0 148 44 52 69 73 105 160 174 252 291 -USGS 01645000 00060 68476 2 13 1931 2019 89 1966 1190 1931 28.0 157 42 52 67 75 108 144 160 223 641 -USGS 01645000 00060 68476 2 14 1931 2019 89 1936 1200 1931 27.0 174 44 51 70 73 121 173 192 338 712 -USGS 01645000 00060 68476 2 15 1931 2019 89 1936 1000 1931 20.0 158 46 55 67 71 118 150 189 302 430 -USGS 01645000 00060 68476 2 16 1931 2019 89 2016 674 1931 22.0 141 47 53 65 79 117 160 177 246 409 -USGS 01645000 00060 68476 2 17 1931 2019 89 1935 588 1931 28.0 133 50 55 74 82 109 147 180 231 316 -USGS 01645000 00060 68476 2 18 1931 2019 89 1998 693 1931 38.0 143 50 60 76 83 120 159 178 270 347 -USGS 01645000 00060 68476 2 19 1931 2019 89 1961 1150 1931 34.0 162 50 59 71 79 120 169 174 270 600 -USGS 01645000 00060 68476 2 20 1931 2019 89 1994 978 1931 31.0 150 45 55 67 80 116 179 198 268 368 -USGS 01645000 00060 68476 2 21 1931 2019 89 1994 659 1931 30.0 145 42 54 70 82 113 183 192 265 388 -USGS 01645000 00060 68476 2 22 1931 2019 89 2003 1400 1931 27.0 159 49 59 70 79 112 159 199 343 421 -USGS 01645000 00060 68476 2 23 1931 2019 89 2003 1660 1931 25.0 178 47 60 78 84 119 198 223 326 520 -USGS 01645000 00060 68476 2 24 1931 2019 89 1979 1490 1931 24.0 189 47 59 76 84 117 172 213 360 625 -USGS 01645000 00060 68476 2 25 1931 2019 89 1979 4210 1931 24.0 201 46 56 75 85 117 167 196 335 590 -USGS 01645000 00060 68476 2 26 1931 2019 89 1979 3870 1931 23.0 200 42 57 70 80 113 174 206 300 500 -USGS 01645000 00060 68476 2 27 1931 2019 89 1979 796 1931 22.0 147 39 55 70 78 104 167 203 287 401 -USGS 01645000 00060 68476 2 28 1931 2019 89 1939 638 1931 22.0 143 42 55 77 81 102 172 195 301 358 -USGS 01645000 00060 68476 2 29 1932 2016 22 2012 468 1932 30.0 141 34 63 76 78 101 181 226 305 447 -USGS 01645000 00060 68476 3 1 1931 2019 89 1987 1320 1932 29.0 155 46 62 73 78 100 172 192 275 430 -USGS 01645000 00060 68476 3 2 1931 2019 89 2007 1140 1932 28.0 147 53 66 74 77 105 163 177 240 392 -USGS 01645000 00060 68476 3 3 1931 2019 89 1934 1210 1932 28.0 168 58 67 72 78 110 170 197 356 467 -USGS 01645000 00060 68476 3 4 1931 2019 89 1993 1470 1931 33.0 171 58 65 75 81 106 167 214 304 463 -USGS 01645000 00060 68476 3 5 1931 2019 89 1993 1410 1931 31.0 179 61 66 79 82 115 177 207 330 590 -USGS 01645000 00060 68476 3 6 1931 2019 89 1963 840 1931 28.0 177 60 67 80 88 123 200 222 358 561 -USGS 01645000 00060 68476 3 7 1931 2019 89 1967 1830 1931 27.0 183 59 70 83 90 123 198 214 301 384 -USGS 01645000 00060 68476 3 8 1931 2019 89 1983 1110 1931 40.0 158 64 72 80 88 130 182 208 257 385 -USGS 01645000 00060 68476 3 9 1931 2019 89 1998 632 1931 46.0 149 65 70 78 86 117 171 185 259 445 -USGS 01645000 00060 68476 3 10 1931 2019 89 1994 1010 1931 34.0 148 64 69 76 82 102 151 159 221 409 -USGS 01645000 00060 68476 3 11 1931 2019 89 2015 1090 1931 29.0 154 60 66 74 81 112 159 182 254 404 -USGS 01645000 00060 68476 3 12 1931 2019 89 1962 1450 1931 27.0 166 59 66 79 84 119 164 182 313 516 -USGS 01645000 00060 68476 3 13 1931 2019 89 2010 642 1931 26.0 163 59 69 80 90 118 188 223 350 455 -USGS 01645000 00060 68476 3 14 1931 2019 89 2010 1120 1931 25.0 178 60 67 85 92 139 204 229 292 492 -USGS 01645000 00060 68476 3 15 1931 2019 89 1953 569 1931 26.0 157 56 65 84 90 132 198 210 288 379 -USGS 01645000 00060 68476 3 16 1931 2019 89 2007 866 1931 29.0 150 54 65 82 86 126 172 182 244 358 -USGS 01645000 00060 68476 3 17 1931 2019 89 1993 1190 1931 39.0 162 56 65 85 89 123 174 202 266 431 -USGS 01645000 00060 68476 3 18 1931 2019 89 1993 1100 1931 40.0 150 56 70 87 91 121 167 181 250 295 -USGS 01645000 00060 68476 3 19 1931 2019 89 1998 1000 1931 37.0 162 56 70 84 93 131 184 199 270 391 -USGS 01645000 00060 68476 3 20 1931 2019 89 2003 765 1931 35.0 162 55 70 86 94 133 191 211 281 394 -USGS 01645000 00060 68476 3 21 1931 2019 89 1998 3140 1931 31.0 223 54 76 83 96 143 194 209 418 750 -USGS 01645000 00060 68476 3 22 1931 2019 89 2019 1610 1931 31.0 203 56 69 86 94 134 210 242 360 646 -USGS 01645000 00060 68476 3 23 1931 2019 89 1991 1770 1931 33.0 209 51 71 84 92 134 183 209 413 657 -USGS 01645000 00060 68476 3 24 1931 2019 89 1993 1590 1931 31.0 195 55 67 82 90 131 180 207 360 751 -USGS 01645000 00060 68476 3 25 1931 2019 89 1993 616 1931 30.0 151 56 69 80 90 128 173 184 270 408 -USGS 01645000 00060 68476 3 26 1931 2019 89 1953 1700 1931 29.0 176 52 66 82 92 122 183 212 292 439 -USGS 01645000 00060 68476 3 27 1931 2019 89 1992 963 1931 27.0 172 53 67 80 89 120 198 203 320 596 -USGS 01645000 00060 68476 3 28 1931 2019 89 2005 1220 1931 37.0 190 53 68 81 84 127 179 212 396 744 -USGS 01645000 00060 68476 3 29 1931 2019 89 1984 2190 1966 43.0 193 60 69 80 85 122 188 199 292 530 -USGS 01645000 00060 68476 3 30 1931 2019 89 2014 1480 1966 43.0 187 61 69 78 85 120 183 219 298 663 -USGS 01645000 00060 68476 3 31 1931 2019 89 2014 1210 1966 48.0 186 61 67 80 91 137 191 251 341 553 -USGS 01645000 00060 68476 4 1 1931 2019 89 1976 1370 1966 47.0 194 58 67 92 96 133 224 243 384 470 -USGS 01645000 00060 68476 4 2 1931 2019 89 2005 1680 1966 43.0 210 64 69 92 99 138 204 225 378 630 -USGS 01645000 00060 68476 4 3 1931 2019 89 2005 1600 1966 42.0 179 61 69 95 98 134 203 212 282 454 -USGS 01645000 00060 68476 4 4 1931 2019 89 1987 893 1966 43.0 164 57 62 87 94 128 191 213 270 414 -USGS 01645000 00060 68476 4 5 1931 2019 89 1977 1100 1966 43.0 174 54 61 88 94 125 183 197 308 612 -USGS 01645000 00060 68476 4 6 1931 2019 89 1958 550 1966 40.0 155 55 61 88 91 126 179 198 300 345 -USGS 01645000 00060 68476 4 7 1931 2019 89 1971 453 1966 39.0 156 56 63 88 92 131 184 207 306 373 -USGS 01645000 00060 68476 4 8 1931 2019 89 1940 460 1966 39.0 151 55 62 86 93 139 189 202 260 314 -USGS 01645000 00060 68476 4 9 1931 2019 89 1935 870 1966 39.0 161 55 65 82 90 128 191 212 256 380 -USGS 01645000 00060 68476 4 10 1931 2019 89 1983 2060 1966 39.0 169 52 66 76 90 119 178 209 270 443 -USGS 01645000 00060 68476 4 11 1931 2019 89 1993 526 1966 39.0 138 53 65 77 89 117 172 180 237 269 -USGS 01645000 00060 68476 4 12 1931 2019 89 1933 449 1931 44.0 139 54 67 81 86 122 166 185 240 304 -USGS 01645000 00060 68476 4 13 1931 2019 89 1961 1090 1931 39.0 166 52 63 84 88 118 185 199 272 435 -USGS 01645000 00060 68476 4 14 1931 2019 89 1970 798 1931 37.0 151 53 62 82 86 117 179 198 260 332 -USGS 01645000 00060 68476 4 15 1931 2019 89 2007 1640 1931 35.0 172 55 66 81 88 117 166 195 261 480 -USGS 01645000 00060 68476 4 16 1931 2019 89 1993 1520 1931 33.0 192 62 67 83 86 117 185 200 457 636 -USGS 01645000 00060 68476 4 17 1931 2019 89 1972 1330 1931 32.0 177 59 68 82 84 109 187 199 323 577 -USGS 01645000 00060 68476 4 18 1931 2019 89 2000 615 1931 31.0 140 58 64 80 84 116 167 175 234 353 -USGS 01645000 00060 68476 4 19 1931 2019 89 2000 375 1931 29.0 133 56 64 75 81 114 170 184 244 296 -USGS 01645000 00060 68476 4 20 1931 2019 89 1940 931 1931 28.0 153 54 60 74 77 112 166 185 290 438 -USGS 01645000 00060 68476 4 21 1931 2019 89 2008 1410 1931 27.0 147 54 59 72 79 110 157 186 258 349 -USGS 01645000 00060 68476 4 22 1931 2019 89 1993 845 1931 33.0 148 57 61 71 79 114 157 168 235 431 -USGS 01645000 00060 68476 4 23 1931 2019 89 2006 1030 1942 48.0 138 55 61 71 74 109 162 174 221 309 -USGS 01645000 00060 68476 4 24 1931 2019 89 1983 920 1931 37.0 131 51 57 73 78 110 152 166 221 286 -USGS 01645000 00060 68476 4 25 1931 2019 89 1952 614 1931 33.0 137 54 57 76 81 118 158 166 220 318 -USGS 01645000 00060 68476 4 26 1931 2019 89 1937 1400 1931 34.0 154 50 58 75 83 113 166 182 261 362 -USGS 01645000 00060 68476 4 27 1931 2019 89 1952 1690 1931 33.0 166 47 52 73 81 110 157 193 253 412 -USGS 01645000 00060 68476 4 28 1931 2019 89 1952 980 1931 29.0 149 46 56 74 81 113 160 197 250 464 -USGS 01645000 00060 68476 4 29 1931 2019 89 1952 490 1931 27.0 126 46 55 73 78 105 145 161 238 294 -USGS 01645000 00060 68476 4 30 1931 2019 89 2014 3120 1931 26.0 151 44 57 71 74 109 144 160 206 243 -USGS 01645000 00060 68476 5 1 1931 2019 89 2014 2460 1931 25.0 148 47 63 71 74 109 150 166 204 266 -USGS 01645000 00060 68476 5 2 1931 2019 89 2014 784 1931 26.0 130 45 58 69 73 106 155 165 223 287 -USGS 01645000 00060 68476 5 3 1931 2019 89 1933 519 1931 27.0 136 44 58 68 79 107 154 201 237 345 -USGS 01645000 00060 68476 5 4 1931 2019 89 1984 647 1931 26.0 134 42 58 66 69 106 142 160 231 411 -USGS 01645000 00060 68476 5 5 1931 2019 89 2019 707 1931 24.0 137 41 55 65 71 105 152 178 272 371 -USGS 01645000 00060 68476 5 6 1931 2019 89 1989 5210 1931 24.0 191 40 51 65 71 97 147 198 318 365 -USGS 01645000 00060 68476 5 7 1931 2019 89 1989 1470 1931 27.0 155 41 50 64 70 94 160 175 321 452 -USGS 01645000 00060 68476 5 8 1931 2019 89 1998 851 1955 36.0 141 39 52 64 73 94 171 199 275 405 -USGS 01645000 00060 68476 5 9 1931 2019 89 1998 459 1931 31.0 130 40 52 65 67 103 173 189 242 330 -USGS 01645000 00060 68476 5 10 1931 2019 89 1989 555 1931 27.0 125 39 52 63 67 98 150 167 241 297 -USGS 01645000 00060 68476 5 11 1931 2019 89 2019 693 1931 25.0 130 36 51 61 65 102 152 178 233 324 -USGS 01645000 00060 68476 5 12 1931 2019 89 2008 2560 1931 24.0 164 35 53 59 63 97 164 193 276 438 -USGS 01645000 00060 68476 5 13 1931 2019 89 2019 754 1931 30.0 139 37 55 58 63 105 139 189 268 434 -USGS 01645000 00060 68476 5 14 1931 2019 89 1978 741 1931 30.0 124 39 53 58 66 108 145 161 200 284 -USGS 01645000 00060 68476 5 15 1931 2019 89 1978 1060 1931 30.0 129 37 49 54 71 102 144 160 210 308 -USGS 01645000 00060 68476 5 16 1931 2019 89 2014 3970 1931 25.0 201 40 48 56 67 105 153 190 330 701 -USGS 01645000 00060 68476 5 17 1931 2019 89 2014 957 1931 24.0 157 38 50 60 67 102 162 187 294 632 -USGS 01645000 00060 68476 5 18 1931 2019 89 1988 1480 1931 24.0 144 43 50 64 67 94 159 193 290 390 -USGS 01645000 00060 68476 5 19 1931 2019 89 1988 3910 1931 24.0 173 39 48 60 68 89 168 184 246 343 -USGS 01645000 00060 68476 5 20 1931 2019 89 1988 744 1931 23.0 125 41 48 63 67 94 145 171 242 308 -USGS 01645000 00060 68476 5 21 1931 2019 89 1988 1030 1931 31.0 137 42 47 63 68 89 144 172 226 311 -USGS 01645000 00060 68476 5 22 1931 2019 89 1942 707 1955 30.0 130 36 45 63 69 95 149 161 226 410 -USGS 01645000 00060 68476 5 23 1931 2019 89 1983 1350 1963 32.0 141 41 52 63 68 96 149 166 260 442 -USGS 01645000 00060 68476 5 24 1931 2019 89 1988 1430 1963 30.0 147 39 50 62 67 96 151 181 231 322 -USGS 01645000 00060 68476 5 25 1931 2019 89 1988 750 1955 29.0 131 36 46 58 65 88 166 200 274 361 -USGS 01645000 00060 68476 5 26 1931 2019 89 2009 1200 1931 27.0 139 34 46 56 61 96 146 176 212 474 -USGS 01645000 00060 68476 5 27 1931 2019 89 2002 1360 1931 25.0 137 33 45 58 64 93 143 157 277 387 -USGS 01645000 00060 68476 5 28 1931 2019 89 1973 1030 1931 23.0 138 32 43 58 65 92 136 148 260 524 -USGS 01645000 00060 68476 5 29 1931 2019 89 2009 1160 1931 22.0 131 31 46 58 65 89 141 157 263 310 -USGS 01645000 00060 68476 5 30 1931 2019 89 2009 489 1931 20.0 112 34 46 59 62 85 123 144 211 338 -USGS 01645000 00060 68476 5 31 1931 2019 89 1971 975 1969 24.0 116 33 42 54 58 82 124 155 189 285 -USGS 01645000 00060 68476 6 1 1931 2019 89 1979 451 1955 25.0 106 34 41 50 56 81 132 148 207 276 -USGS 01645000 00060 68476 6 2 1931 2019 89 1946 1880 1955 23.0 131 38 42 54 58 80 139 161 196 331 -USGS 01645000 00060 68476 6 3 1931 2019 89 1979 899 1955 23.0 137 34 47 58 61 92 149 160 247 508 -USGS 01645000 00060 68476 6 4 1931 2019 89 1951 869 1955 22.0 140 33 44 54 60 91 147 177 313 551 -USGS 01645000 00060 68476 6 5 1931 2019 89 2009 582 1955 22.0 130 33 40 52 62 88 148 183 297 389 -USGS 01645000 00060 68476 6 6 1931 2019 89 1989 737 1955 20.0 117 32 40 49 57 86 133 156 216 314 -USGS 01645000 00060 68476 6 7 1931 2019 89 2001 1870 1955 20.0 153 29 38 50 55 81 123 142 220 793 -USGS 01645000 00060 68476 6 8 1931 2019 89 2003 729 1954 29.0 112 34 39 56 60 80 119 130 190 379 -USGS 01645000 00060 68476 6 9 1931 2019 89 2003 371 1931 22.0 96 33 38 54 60 76 115 122 152 267 -USGS 01645000 00060 68476 6 10 1931 2019 89 2013 2730 1931 18.0 149 30 35 51 56 71 115 122 215 447 -USGS 01645000 00060 68476 6 11 1931 2019 89 2013 1580 1931 17.0 110 33 38 47 53 69 112 121 203 288 -USGS 01645000 00060 68476 6 12 1931 2019 89 2003 882 1931 15.0 103 32 37 43 52 73 106 118 164 269 -USGS 01645000 00060 68476 6 13 1931 2019 89 1982 1460 1931 14.0 134 30 38 48 57 80 113 119 253 575 -USGS 01645000 00060 68476 6 14 1931 2019 89 2003 1460 1931 14.0 126 32 40 52 55 74 111 127 223 502 -USGS 01645000 00060 68476 6 15 1931 2019 89 2003 585 1931 14.0 95 34 38 48 54 75 110 116 171 271 -USGS 01645000 00060 68476 6 16 1931 2019 89 2003 367 1956 30.0 90 34 37 46 51 75 109 114 171 212 -USGS 01645000 00060 68476 6 17 1931 2019 89 1982 502 1969 27.0 97 32 36 42 47 70 117 130 182 230 -USGS 01645000 00060 68476 6 18 1931 2019 89 1996 4190 1931 19.0 148 30 35 46 51 73 107 136 174 304 -USGS 01645000 00060 68476 6 19 1931 2019 89 1996 3050 1931 15.0 124 30 33 44 46 73 105 120 165 273 -USGS 01645000 00060 68476 6 20 1931 2019 89 1996 1430 1931 14.0 117 29 36 43 50 73 108 116 267 319 -USGS 01645000 00060 68476 6 21 1931 2019 89 1972 2840 1931 12.0 133 28 32 41 47 71 105 129 226 386 -USGS 01645000 00060 68476 6 22 1931 2019 89 1972 9900 1931 11.0 222 28 31 40 43 67 106 147 204 368 -USGS 01645000 00060 68476 6 23 1931 2019 89 1972 2400 1954 25.0 120 28 32 40 46 72 112 128 188 326 -USGS 01645000 00060 68476 6 24 1931 2019 89 1972 600 1954 24.0 93 30 32 43 48 69 100 111 186 244 -USGS 01645000 00060 68476 6 25 1931 2019 89 2006 800 1954 23.0 83 26 30 38 43 62 87 100 127 185 -USGS 01645000 00060 68476 6 26 1931 2019 89 2006 3480 1932 24.0 128 28 31 40 43 60 97 110 167 275 -USGS 01645000 00060 68476 6 27 1931 2019 89 2006 3330 1932 22.0 130 26 29 35 42 61 96 104 143 334 -USGS 01645000 00060 68476 6 28 1931 2019 89 2006 2100 1959 20.0 118 27 29 36 41 62 89 98 126 248 -USGS 01645000 00060 68476 6 29 1931 2019 89 1972 689 1959 18.0 87 26 28 36 39 65 89 93 142 247 -USGS 01645000 00060 68476 6 30 1931 2019 89 1972 1500 1959 17.0 102 23 27 34 36 65 98 106 155 311 -USGS 01645000 00060 68476 7 1 1931 2019 89 1987 1030 1959 16.0 95 23 27 34 38 62 85 98 221 309 -USGS 01645000 00060 68476 7 2 1931 2019 89 1972 569 1955 17.0 95 22 26 37 41 60 95 123 156 460 -USGS 01645000 00060 68476 7 3 1931 2019 89 1933 1950 1959 15.0 116 20 26 37 47 59 95 110 149 469 -USGS 01645000 00060 68476 7 4 1931 2019 89 1973 492 1955 15.0 89 20 25 35 41 63 98 116 200 290 -USGS 01645000 00060 68476 7 5 1931 2019 89 1956 708 1955 15.0 84 23 27 32 41 63 102 109 151 189 -USGS 01645000 00060 68476 7 6 1931 2019 89 2006 1350 1955 14.0 88 22 24 37 43 62 91 98 142 216 -USGS 01645000 00060 68476 7 7 1931 2019 89 2003 540 1955 14.0 73 20 24 35 41 58 82 86 108 247 -USGS 01645000 00060 68476 7 8 1931 2019 89 2019 2620 1959 14.0 121 21 23 33 39 57 83 90 139 281 -USGS 01645000 00060 68476 7 9 1931 2019 89 2019 725 1959 12.0 91 20 24 32 35 56 93 101 212 331 -USGS 01645000 00060 68476 7 10 1931 2019 89 1970 980 1959 16.0 82 20 25 33 35 56 83 93 146 224 -USGS 01645000 00060 68476 7 11 1931 2019 89 1942 727 1932 18.0 82 20 25 32 35 58 82 102 186 228 -USGS 01645000 00060 68476 7 12 1931 2019 89 1958 450 1932 16.0 74 18 23 32 36 56 80 99 150 203 -USGS 01645000 00060 68476 7 13 1931 2019 89 1996 541 1932 15.0 81 20 22 35 38 54 92 106 147 276 -USGS 01645000 00060 68476 7 14 1931 2019 89 1975 474 1955 13.0 84 18 21 33 35 54 104 125 188 228 -USGS 01645000 00060 68476 7 15 1931 2019 89 1950 543 1955 12.0 81 19 24 33 38 56 100 108 152 269 -USGS 01645000 00060 68476 7 16 1931 2019 89 1949 729 1955 11.0 75 20 24 32 34 50 89 103 142 173 -USGS 01645000 00060 68476 7 17 1931 2019 89 2005 599 1955 12.0 69 17 23 30 32 53 82 86 109 229 -USGS 01645000 00060 68476 7 18 1931 2019 89 1945 845 1955 12.0 72 16 19 30 34 52 81 85 140 205 -USGS 01645000 00060 68476 7 19 1931 2019 89 1996 842 1955 9.00 73 15 19 29 32 51 76 80 97 165 -USGS 01645000 00060 68476 7 20 1931 2019 89 1996 441 1955 7.90 78 15 24 29 32 52 81 94 196 278 -USGS 01645000 00060 68476 7 21 1931 2019 89 1956 4780 1955 7.40 152 15 23 29 32 53 87 100 174 619 -USGS 01645000 00060 68476 7 22 1931 2019 89 2018 3230 1955 6.90 105 17 21 27 29 53 83 96 149 207 -USGS 01645000 00060 68476 7 23 1931 2019 89 2018 978 1955 6.40 98 16 19 27 31 55 95 108 254 310 -USGS 01645000 00060 68476 7 24 1931 2019 89 2018 867 1955 7.90 90 15 21 27 31 53 88 98 178 348 -USGS 01645000 00060 68476 7 25 1931 2019 89 2018 664 1955 9.00 73 15 21 27 32 54 76 89 129 165 -USGS 01645000 00060 68476 7 26 1931 2019 89 2018 657 1955 6.90 66 14 18 29 34 54 80 89 110 149 -USGS 01645000 00060 68476 7 27 1931 2019 89 1945 432 1955 6.00 68 13 16 29 33 50 71 82 112 227 -USGS 01645000 00060 68476 7 28 1931 2019 89 1994 1010 1955 5.20 93 12 20 29 32 48 82 112 156 394 -USGS 01645000 00060 68476 7 29 1931 2019 89 2017 1980 1955 5.20 96 12 19 27 30 54 83 88 180 264 -USGS 01645000 00060 68476 7 30 1931 2019 89 1979 532 1955 6.00 77 13 19 28 33 53 80 93 149 289 -USGS 01645000 00060 68476 7 31 1931 2019 89 2016 1550 1932 7.40 88 12 16 26 29 48 72 101 166 230 -USGS 01645000 00060 68476 8 1 1931 2019 89 1945 1220 1932 7.40 85 12 15 25 29 49 78 85 131 372 -USGS 01645000 00060 68476 8 2 1931 2019 89 1971 793 1955 6.90 76 12 17 25 28 45 82 89 123 248 -USGS 01645000 00060 68476 8 3 1931 2019 89 1971 480 1955 5.20 65 12 18 28 28 46 79 87 136 181 -USGS 01645000 00060 68476 8 4 1931 2019 89 1971 2820 1955 4.40 107 12 18 26 28 47 81 93 153 285 -USGS 01645000 00060 68476 8 5 1931 2019 89 1971 430 1955 5.60 65 12 19 27 28 46 75 85 108 162 -USGS 01645000 00060 68476 8 6 1931 2019 89 1995 936 1955 4.40 79 10 18 26 28 49 84 105 156 239 -USGS 01645000 00060 68476 8 7 1931 2019 89 2019 606 1932 8.00 63 12 18 25 27 45 65 84 134 178 -USGS 01645000 00060 68476 8 8 1931 2019 89 1959 700 1966 7.90 75 12 18 27 29 46 73 85 128 247 -USGS 01645000 00060 68476 8 9 1931 2019 89 1953 1250 1966 8.70 73 14 18 26 29 45 65 76 113 159 -USGS 01645000 00060 68476 8 10 1931 2019 89 1984 521 1963 9.00 75 14 16 25 29 48 90 108 149 301 -USGS 01645000 00060 68476 8 11 1931 2019 89 2001 390 1963 7.90 62 14 17 27 28 47 83 91 122 161 -USGS 01645000 00060 68476 8 12 1931 2019 89 2001 887 1963 7.40 90 14 20 25 27 49 104 126 179 357 -USGS 01645000 00060 68476 8 13 1931 2019 89 1955 1950 1932 6.80 110 13 17 24 26 46 86 92 221 371 -USGS 01645000 00060 68476 8 14 1931 2019 89 1970 550 1932 6.20 66 13 18 24 28 48 82 93 124 165 -USGS 01645000 00060 68476 8 15 1931 2019 89 2011 611 1932 5.60 65 13 18 25 28 49 79 92 118 181 -USGS 01645000 00060 68476 8 16 1931 2019 89 2016 323 1932 5.00 59 12 17 24 26 47 76 84 104 161 -USGS 01645000 00060 68476 8 17 1931 2019 89 1994 716 1932 5.00 66 12 22 26 30 47 68 76 105 174 -USGS 01645000 00060 68476 8 18 1931 2019 89 1955 704 1957 6.00 82 12 17 25 31 46 66 79 207 382 -USGS 01645000 00060 68476 8 19 1931 2019 89 1955 265 1957 7.40 64 12 20 25 28 46 78 95 150 195 -USGS 01645000 00060 68476 8 20 1931 2019 89 1952 819 1931 8.40 83 9.4 20 31 35 53 93 100 163 217 -USGS 01645000 00060 68476 8 21 1931 2019 89 1994 571 1932 7.40 73 12 20 26 34 50 81 92 138 241 -USGS 01645000 00060 68476 8 22 1931 2019 89 2018 907 1932 6.80 77 12 22 30 33 47 69 79 147 227 -USGS 01645000 00060 68476 8 23 1931 2019 89 1933 1870 1932 6.20 95 13 22 26 29 45 77 90 147 304 -USGS 01645000 00060 68476 8 24 1931 2019 89 1933 2840 1932 5.60 89 12 20 24 28 43 73 86 125 198 -USGS 01645000 00060 68476 8 25 1931 2019 89 1967 659 1932 5.00 61 12 20 24 29 43 65 80 115 162 -USGS 01645000 00060 68476 8 26 1931 2019 89 1937 961 1932 4.30 74 12 20 24 28 43 70 82 120 184 -USGS 01645000 00060 68476 8 27 1931 2019 89 1967 1710 1932 4.00 91 13 20 22 27 44 63 73 130 241 -USGS 01645000 00060 68476 8 28 1931 2019 89 2011 432 1932 4.00 65 13 18 23 28 41 64 68 145 269 -USGS 01645000 00060 68476 8 29 1931 2019 89 1936 360 1932 3.60 58 13 17 23 26 43 66 73 115 164 -USGS 01645000 00060 68476 8 30 1931 2019 89 1936 556 1932 3.20 53 12 17 24 25 41 61 69 94 114 -USGS 01645000 00060 68476 8 31 1931 2019 89 1955 264 1932 3.60 51 14 16 23 24 41 70 78 96 121 -USGS 01645000 00060 68476 9 1 1931 2019 89 1952 2080 1932 3.60 81 14 17 22 26 40 71 77 95 223 -USGS 01645000 00060 68476 9 2 1931 2019 89 2018 408 1966 3.50 58 12 17 26 29 40 64 72 103 188 -USGS 01645000 00060 68476 9 3 1931 2019 89 2000 247 1966 3.20 54 12 17 23 28 39 65 74 106 176 -USGS 01645000 00060 68476 9 4 1931 2019 89 1969 1840 1966 3.20 80 10 17 25 27 41 67 78 114 164 -USGS 01645000 00060 68476 9 5 1931 2019 89 1979 1600 1966 3.20 92 9.5 17 24 27 39 64 90 171 419 -USGS 01645000 00060 68476 9 6 1931 2019 89 1979 6640 1966 3.20 162 9.4 18 24 26 39 57 71 179 604 -USGS 01645000 00060 68476 9 7 1931 2019 89 1996 2460 1966 2.60 99 9.7 17 23 27 41 69 76 170 348 -USGS 01645000 00060 68476 9 8 1931 2019 89 2011 7250 1966 2.00 161 9.5 16 23 28 41 66 75 188 403 -USGS 01645000 00060 68476 9 9 1931 2019 89 2011 2720 1966 2.20 108 9.7 17 23 28 39 63 72 101 183 -USGS 01645000 00060 68476 9 10 1931 2019 89 2011 722 1966 2.20 71 9.5 17 27 29 42 61 75 152 203 -USGS 01645000 00060 68476 9 11 1931 2019 89 1971 3880 1966 2.00 113 9.5 16 25 28 39 66 80 160 392 -USGS 01645000 00060 68476 9 12 1931 2019 89 1971 9000 1966 1.80 158 10 15 23 26 39 60 68 114 259 -USGS 01645000 00060 68476 9 13 1931 2019 89 1971 731 1931 3.50 67 12 15 24 27 40 62 72 124 270 -USGS 01645000 00060 68476 9 14 1931 2019 89 1966 1580 1931 3.50 87 13 15 24 28 39 59 62 164 220 -USGS 01645000 00060 68476 9 15 1931 2019 89 1966 720 1931 3.10 66 12 15 24 26 38 58 67 142 224 -USGS 01645000 00060 68476 9 16 1931 2019 89 1999 1500 1932 4.00 81 14 19 23 28 38 64 74 140 285 -USGS 01645000 00060 68476 9 17 1931 2019 89 1934 1080 1932 4.00 78 13 18 23 27 39 60 80 184 284 -USGS 01645000 00060 68476 9 18 1931 2019 89 1987 780 1932 3.20 73 12 17 22 27 41 58 74 150 304 -USGS 01645000 00060 68476 9 19 1931 2019 89 2003 1700 1932 2.90 72 12 17 25 26 37 59 74 145 184 -USGS 01645000 00060 68476 9 20 1931 2019 89 2003 355 1932 3.20 54 15 18 22 27 37 59 73 99 183 -USGS 01645000 00060 68476 9 21 1931 2019 89 1999 296 1932 3.60 59 15 18 21 24 37 66 74 135 234 -USGS 01645000 00060 68476 9 22 1931 2019 89 1979 1860 1932 4.30 81 14 17 21 26 43 64 79 160 238 -USGS 01645000 00060 68476 9 23 1931 2019 89 2003 3140 1932 5.60 98 14 15 22 25 40 62 76 134 354 -USGS 01645000 00060 68476 9 24 1931 2019 89 1975 1620 1931 6.60 77 14 16 23 24 40 56 72 121 212 -USGS 01645000 00060 68476 9 25 1931 2019 89 1975 2570 1931 6.00 94 12 14 21 25 42 65 72 159 266 -USGS 01645000 00060 68476 9 26 1930 2019 90 1975 7720 1930 3.50 154 12 15 21 26 40 67 78 153 295 -USGS 01645000 00060 68476 9 27 1930 2019 90 2018 1040 1930 2.40 93 12 15 22 26 41 81 129 218 396 -USGS 01645000 00060 68476 9 28 1930 2019 90 2018 1640 1930 1.90 83 10 15 22 29 45 83 96 197 221 -USGS 01645000 00060 68476 9 29 1930 2019 90 2018 548 1930 1.80 71 9.6 16 24 28 50 78 84 153 255 -USGS 01645000 00060 68476 9 30 1930 2019 90 2010 948 1930 2.40 87 8.9 17 25 28 42 69 78 129 479 -USGS 01645000 00060 68476 10 1 1931 2020 90 1980 4910 1931 1.90 127 9.9 17 25 28 46 81 98 144 192 -USGS 01645000 00060 68476 10 2 1931 2020 90 2013 1010 1931 2.40 83 10 18 25 28 43 78 116 158 302 -USGS 01645000 00060 68476 10 3 1931 2020 90 1980 542 1931 2.40 68 11 18 25 27 43 68 84 132 218 -USGS 01645000 00060 68476 10 4 1931 2020 90 1980 289 1931 3.10 56 13 16 24 28 42 61 78 116 157 -USGS 01645000 00060 68476 10 5 1931 2020 90 1980 366 1931 3.50 55 12 15 25 28 41 60 69 112 171 -USGS 01645000 00060 68476 10 6 1931 2020 90 1933 394 1931 3.80 59 14 16 25 28 40 63 69 121 194 -USGS 01645000 00060 68476 10 7 1931 2020 90 2006 241 1931 4.20 58 13 16 25 29 41 64 75 121 182 -USGS 01645000 00060 68476 10 8 1931 2020 90 2006 1150 1932 4.60 70 13 16 25 29 41 65 85 146 179 -USGS 01645000 00060 68476 10 9 1931 2020 90 1977 1780 1932 4.60 81 14 17 27 29 41 68 78 125 275 -USGS 01645000 00060 68476 10 10 1931 2020 90 1980 2170 1932 4.20 93 14 16 27 29 41 66 75 148 347 -USGS 01645000 00060 68476 10 11 1931 2020 90 2014 1010 1932 3.80 69 14 17 24 27 41 56 69 137 197 -USGS 01645000 00060 68476 10 12 1931 2020 90 2014 1260 1932 3.80 68 13 17 23 27 40 64 75 112 154 -USGS 01645000 00060 68476 10 13 1931 2020 90 2012 603 1932 3.80 61 12 18 23 28 39 62 71 102 165 -USGS 01645000 00060 68476 10 14 1931 2020 90 2012 908 1932 3.80 75 13 18 26 29 46 64 85 116 249 -USGS 01645000 00060 68476 10 15 1931 2020 90 1943 510 1931 6.60 68 16 21 28 30 43 71 85 137 203 -USGS 01645000 00060 68476 10 16 1931 2020 90 1943 1900 1931 6.60 78 16 22 28 29 41 63 77 126 187 -USGS 01645000 00060 68476 10 17 1931 2019 89 1943 454 1932 6.60 62 17 22 27 28 43 68 81 123 157 -USGS 01645000 00060 68476 10 18 1931 2019 89 1933 767 1932 5.80 77 17 21 27 28 43 73 79 136 294 -USGS 01645000 00060 68476 10 19 1931 2019 89 1997 2920 1932 5.40 112 17 20 27 28 42 72 108 200 412 -USGS 01645000 00060 68476 10 20 1931 2019 89 1997 613 1932 5.40 77 16 21 26 28 44 75 102 144 303 -USGS 01645000 00060 68476 10 21 1931 2019 89 1996 850 1932 5.80 74 16 21 28 30 48 73 91 169 189 -USGS 01645000 00060 68476 10 22 1931 2019 89 1997 203 1932 5.80 64 16 21 27 30 47 85 101 146 163 -USGS 01645000 00060 68476 10 23 1931 2019 89 1991 2400 1932 5.40 107 17 20 27 29 47 81 96 138 249 -USGS 01645000 00060 68476 10 24 1931 2019 89 1991 1380 1932 5.80 83 17 21 27 29 48 70 83 131 248 -USGS 01645000 00060 68476 10 25 1931 2019 89 1972 1490 1932 7.00 87 17 21 28 30 48 75 104 186 265 -USGS 01645000 00060 68476 10 26 1931 2019 89 1972 844 1932 7.00 82 17 22 28 33 50 97 119 142 200 -USGS 01645000 00060 68476 10 27 1931 2019 89 2004 1750 1932 7.00 100 17 22 29 30 51 83 125 203 374 -USGS 01645000 00060 68476 10 28 1931 2019 89 1938 978 1932 7.70 99 18 24 29 32 50 87 118 194 458 -USGS 01645000 00060 68476 10 29 1931 2019 89 2013 1830 1931 12.0 107 20 24 32 34 52 88 110 199 309 -USGS 01645000 00060 68476 10 30 1931 2019 89 2013 4720 1931 12.0 124 21 22 30 33 48 80 96 189 249 -USGS 01645000 00060 68476 10 31 1931 2019 89 2013 645 1932 9.80 74 18 25 30 32 48 79 92 155 241 -USGS 01645000 00060 68476 11 1 1931 2019 89 1933 983 1932 9.80 76 20 24 29 32 49 76 94 156 209 -USGS 01645000 00060 68476 11 2 1931 2019 89 1933 260 1932 9.80 69 21 24 32 34 49 81 102 157 193 -USGS 01645000 00060 68476 11 3 1931 2019 89 1993 653 1932 10.0 78 21 28 33 36 50 88 109 139 211 -USGS 01645000 00060 68476 11 4 1931 2019 89 2011 249 1932 9.80 69 20 25 33 35 51 92 105 145 167 -USGS 01645000 00060 68476 11 5 1931 2019 89 1971 596 1932 8.40 84 20 27 33 40 50 93 106 149 321 -USGS 01645000 00060 68476 11 6 1931 2019 89 2004 605 1932 10.0 77 22 27 35 40 53 97 102 127 149 -USGS 01645000 00060 68476 11 7 1931 2019 89 1964 510 1932 11.0 83 21 27 35 40 52 89 101 146 348 -USGS 01645000 00060 68476 11 8 1931 2019 89 1997 1070 1932 12.0 106 23 27 38 42 52 94 101 221 370 -USGS 01645000 00060 68476 11 9 1931 2019 89 1997 1880 1932 13.0 102 23 28 39 43 52 74 92 141 269 -USGS 01645000 00060 68476 11 10 1931 2019 89 1991 1320 1932 15.0 92 21 30 37 41 53 92 102 161 299 -USGS 01645000 00060 68476 11 11 1931 2019 89 1991 370 1931 15.0 80 21 29 37 42 57 102 109 160 240 -USGS 01645000 00060 68476 11 12 1931 2019 89 1996 410 1932 14.0 87 21 28 38 41 53 99 108 202 315 -USGS 01645000 00060 68476 11 13 1931 2019 89 1938 1290 1932 13.0 104 21 28 37 40 55 97 114 204 356 -USGS 01645000 00060 68476 11 14 1931 2019 89 1973 1040 1932 12.0 91 21 28 37 39 56 91 106 189 243 -USGS 01645000 00060 68476 11 15 1931 2019 89 1996 680 1932 12.0 84 21 29 37 39 53 85 108 156 247 -USGS 01645000 00060 68476 11 16 1931 2019 89 2007 1330 1932 13.0 101 22 29 36 40 54 87 123 143 252 -USGS 01645000 00060 68476 11 17 1931 2019 89 2007 1820 1932 13.0 102 24 28 37 39 54 89 122 153 271 -USGS 01645000 00060 68476 11 18 1931 2019 89 2003 464 1932 13.0 82 23 28 36 39 54 94 123 144 241 -USGS 01645000 00060 68476 11 19 1931 2019 89 2004 962 1932 15.0 84 23 28 37 42 56 89 101 132 212 -USGS 01645000 00060 68476 11 20 1931 2019 89 2004 1500 1932 14.0 99 23 29 39 41 56 90 105 137 299 -USGS 01645000 00060 68476 11 21 1931 2019 89 1953 1610 1932 14.0 92 24 30 39 40 54 89 112 142 217 -USGS 01645000 00060 68476 11 22 1931 2019 89 1953 2110 1932 13.0 105 25 28 38 40 57 91 115 194 281 -USGS 01645000 00060 68476 11 23 1931 2019 89 2012 818 1932 13.0 92 26 30 39 41 57 85 109 168 266 -USGS 01645000 00060 68476 11 24 1931 2019 89 2019 842 1932 13.0 87 24 33 39 43 61 89 105 132 308 -USGS 01645000 00060 68476 11 25 1931 2019 89 1972 1480 1932 13.0 121 23 32 39 41 61 93 103 231 487 -USGS 01645000 00060 68476 11 26 1931 2019 89 1997 645 1932 12.0 101 23 33 40 44 62 104 122 203 389 -USGS 01645000 00060 68476 11 27 1931 2019 89 2014 791 1932 12.0 99 25 33 39 43 61 100 136 189 328 -USGS 01645000 00060 68476 11 28 1931 2019 89 1994 6230 1931 14.0 171 27 32 37 45 68 130 150 236 334 -USGS 01645000 00060 68476 11 29 1931 2019 89 1988 1300 1931 14.0 138 25 33 40 43 73 131 142 363 572 -USGS 01645000 00060 68476 11 30 1931 2019 89 1988 1050 1931 14.0 115 24 30 37 42 68 131 140 224 307 -USGS 01645000 00060 68476 12 1 1931 2019 89 1935 797 1931 15.0 113 26 32 42 42 67 133 150 233 351 -USGS 01645000 00060 68476 12 2 1931 2019 89 1997 1720 1931 16.0 122 25 30 42 43 67 117 133 192 256 -USGS 01645000 00060 68476 12 3 1931 2019 89 1992 491 1932 13.0 98 26 30 40 45 67 117 125 184 349 -USGS 01645000 00060 68476 12 4 1931 2019 89 1951 1420 1932 13.0 116 27 33 42 44 67 118 124 212 308 -USGS 01645000 00060 68476 12 5 1931 2019 89 1994 4000 1932 14.0 139 28 33 42 47 70 112 128 206 281 -USGS 01645000 00060 68476 12 6 1931 2019 89 1997 1110 1932 14.0 120 28 33 42 46 70 118 142 239 336 -USGS 01645000 00060 68476 12 7 1931 2019 89 1997 689 1932 13.0 125 28 36 44 47 65 118 186 295 489 -USGS 01645000 00060 68476 12 8 1931 2019 89 2012 1280 1932 11.0 118 27 34 43 48 67 113 147 218 433 -USGS 01645000 00060 68476 12 9 1931 2019 89 2010 1340 1931 19.0 127 29 37 45 47 74 137 161 253 383 -USGS 01645000 00060 68476 12 10 1931 2019 89 2005 505 1931 18.0 111 29 37 44 47 79 144 163 254 308 -USGS 01645000 00060 68476 12 11 1931 2019 89 2004 4020 1931 17.0 180 27 35 43 46 80 127 154 280 469 -USGS 01645000 00060 68476 12 12 1931 2019 89 1993 1130 1931 17.0 124 24 33 48 51 78 132 144 232 437 -USGS 01645000 00060 68476 12 13 1931 2019 89 1997 2090 1931 16.0 134 30 35 45 49 76 120 161 201 350 -USGS 01645000 00060 68476 12 14 1931 2019 89 1997 1010 1931 15.0 131 33 35 47 52 75 119 140 215 625 -USGS 01645000 00060 68476 12 15 1931 2019 89 2019 972 1931 15.0 120 31 36 49 53 73 119 140 255 391 -USGS 01645000 00060 68476 12 16 1931 2019 89 2019 2040 1931 10.0 141 30 35 48 53 75 145 175 305 476 -USGS 01645000 00060 68476 12 17 1931 2019 89 2004 708 1931 10.0 113 30 37 47 50 72 141 153 207 289 -USGS 01645000 00060 68476 12 18 1931 2019 89 1978 2020 1931 10.0 120 28 36 47 50 84 126 135 172 239 -USGS 01645000 00060 68476 12 19 1931 2019 89 1978 893 1931 10.0 105 28 34 47 48 79 115 131 186 314 -USGS 01645000 00060 68476 12 20 1931 2019 89 1958 700 1931 10.0 104 28 35 43 49 74 117 127 202 338 -USGS 01645000 00060 68476 12 21 1931 2019 89 1974 1480 1931 10.0 135 27 33 45 53 75 125 148 253 476 -USGS 01645000 00060 68476 12 22 1931 2019 89 1973 1230 1931 10.0 118 27 35 44 53 79 121 147 209 328 -USGS 01645000 00060 68476 12 23 1931 2019 89 2012 819 1931 10.0 115 29 35 47 54 79 127 156 212 380 -USGS 01645000 00060 68476 12 24 1931 2019 89 1991 621 1931 10.0 114 29 37 51 57 79 118 144 256 343 -USGS 01645000 00060 68476 12 25 1931 2019 89 1987 952 1931 10.0 122 30 35 48 56 77 148 169 215 327 -USGS 01645000 00060 68476 12 26 1931 2019 89 2010 2040 1932 19.0 161 32 37 48 54 80 151 194 266 656 -USGS 01645000 00060 68476 12 27 1931 2019 89 2013 963 1932 18.0 131 31 35 48 50 80 148 182 300 413 -USGS 01645000 00060 68476 12 28 1931 2019 89 2019 709 1932 18.0 115 30 36 47 54 83 134 152 234 356 -USGS 01645000 00060 68476 12 29 1931 2019 89 1968 661 1932 18.0 124 30 36 49 57 83 143 156 233 473 -USGS 01645000 00060 68476 12 30 1931 2019 89 1949 1340 1932 18.0 135 28 37 50 54 77 133 148 205 428 -USGS 01645000 00060 68476 12 31 1931 2019 89 1991 871 1931 15.0 123 28 35 52 55 77 131 139 238 477 diff --git a/tests/deprecation_test.py b/tests/deprecation_test.py index 346635a95..ae565dfab 100644 --- a/tests/deprecation_test.py +++ b/tests/deprecation_test.py @@ -33,9 +33,11 @@ def test_data_currency_is_not_a_deprecation(): def test_warn_deprecated_names_replacement_and_horizon(): with pytest.warns( - DeprecationWarning, match=r"on or after 2027-05-06.*use `x` instead" + DeprecationWarning, match=r"on or after 2027-08-11.*use `x` instead" ): - warn_deprecated("`nwis.get_dv`", replacement="`x`", removal=REMOVALS["nwis"]) + warn_deprecated( + "`dataretrieval.wateruse`", replacement="`x`", removal=REMOVALS["wateruse"] + ) def test_warn_deprecated_without_a_date_promises_nothing_specific(): diff --git a/tests/headers_host_scoping_test.py b/tests/headers_host_scoping_test.py index f5aeeb035..fbf730b88 100644 --- a/tests/headers_host_scoping_test.py +++ b/tests/headers_host_scoping_test.py @@ -33,7 +33,7 @@ def test_key_included_for_waterdata_host(self): def test_key_excluded_for_external_host(self): """The key is not added for an external (non-USGS) host.""" - url = "https://nwis.waterservices.usgs.gov/nwis/iv/" + url = "https://example.invalid/data/" headers = _default_headers(url) assert "X-Api-Key" not in headers diff --git a/tests/nldi_test.py b/tests/nldi_test.py index 32c42dbef..6b39f482e 100644 --- a/tests/nldi_test.py +++ b/tests/nldi_test.py @@ -52,7 +52,7 @@ def mock_request_data_sources(httpx_mock): def test_query_nldi_opts_into_retry(monkeypatch): - """NLDI explicitly enables shared retry while NWIS remains unchanged.""" + """NLDI explicitly enables shared retry while the default path stays unchanged.""" response = mock.Mock() response.json.return_value = {} query = mock.Mock(return_value=response) diff --git a/tests/nwdc_test.py b/tests/nwdc_test.py index d41fbb904..be6b8fa30 100644 --- a/tests/nwdc_test.py +++ b/tests/nwdc_test.py @@ -950,7 +950,7 @@ def test_wateruse_alias_warns_and_names_the_replacement(): message = str(deprecations[0].message) assert "`dataretrieval.wateruse` is deprecated" in message assert "`dataretrieval.nwdc`" in message - # Dated removal, per the convention nwis follows. + # Dated removal, per the shared REMOVALS horizon convention. from dataretrieval.wateruse import NWDC_RENAME_REMOVAL_DATE assert NWDC_RENAME_REMOVAL_DATE in message diff --git a/tests/nwis_test.py b/tests/nwis_test.py deleted file mode 100644 index e361ccd8d..000000000 --- a/tests/nwis_test.py +++ /dev/null @@ -1,675 +0,0 @@ -import inspect -import json -import re -import warnings -from pathlib import Path -from unittest import mock - -import numpy as np -import pandas as pd -import pytest - -import dataretrieval -from dataretrieval import nwis -from dataretrieval.exceptions import DataCurrencyWarning -from dataretrieval.nwis import ( - _DEFUNCT_RECORD_OPTIONS, - _REPLACEMENTS, - NWIS_Metadata, - _read_rdb, - format_response, - get_discharge_measurements, - get_gwlevels, - get_iv, - get_pmcodes, - get_qwdata, - get_record, - get_water_use, - preformat_peaks_response, -) -from dataretrieval.rdb import read_rdb - -START_DATE = "2018-01-24" -END_DATE = "2018-01-25" - -DATETIME_COL = "datetime" -SITENO_COL = "site_no" - -# Legacy NWIS site endpoint these tests mock — this module makes no live calls. -_SITE_RE = re.compile(r"^https://waterservices\.usgs\.gov/nwis/site(\?.*)?$") - - -# Extract backtick-enclosed ``module.function(args)`` from deprecation messages. -# The two (\w+) groups capture the module and function names; ([^`]*) captures -# the argument text. Escaped dots and parentheses match those literal characters. -# ``waterdata.get_*()`` does not match because * is not a word character. -_NAMED_REPLACEMENTS = sorted( - set( - re.findall( - r"`(\w+)\.(\w+)\(([^`]*)\)`", - " ".join( - [ - *_REPLACEMENTS.values(), - *(r for _, r in _DEFUNCT_RECORD_OPTIONS.values()), - ] - ), - ) - ) -) - - -def _load_mock_json(file_name): - """Helper to load mock JSON from tests/data.""" - path = Path(__file__).parent / "data" / file_name - with open(path, encoding="utf-8") as f: - return json.load(f) - - -def _load_fixture(file_name): - """Read a raw fixture file (e.g. an RDB response) from tests/data.""" - return (Path(__file__).parent / "data" / file_name).read_text(encoding="utf-8") - - -def _mock_site(httpx_mock, fixture="waterservices_site.txt"): - """Mock the legacy NWIS ``site`` endpoint with an RDB fixture.""" - httpx_mock.add_response(method="GET", url=_SITE_RE, text=_load_fixture(fixture)) - - -def _test_iv_service(httpx_mock): - """Mocked test of instantaneous value service""" - start = START_DATE - end = END_DATE - service = "iv" - site = ["03339000", "05447500", "03346500"] - - # A minimal JSON structure to satisfy the parser - mock_json = _load_mock_json("nwis_iv_mock.json") - - # Match the base URL and ensure query parameters are correct - httpx_mock.add_response( - method="GET", - url=re.compile(r"^https://waterservices\.usgs\.gov/nwis/iv(\?.*)?$"), - json=mock_json, - ) - - return get_record(site, start, end, service=service) - - -def test_iv_service_answer(httpx_mock): - df = _test_iv_service(httpx_mock) - # check multiindex function - assert df.index.names == [ - SITENO_COL, - DATETIME_COL, - ], f"iv service returned incorrect index: {df.index.names}" - - -@pytest.mark.parametrize( - "peak_dt, expected", - [ - ("1878-06-12", "1878-06-12"), # fully known - ("1844-06-00", None), # day unknown (peak_cd Bd) - ("1858-00-00", None), # month unknown (peak_cd Bm) - ("", None), # no date at all - (np.nan, None), - ], -) -def test_preformat_peaks_response_keeps_every_peak(peak_dt, expected): - """A peak is never dropped because its date cannot be parsed. - - NWIS zero-fills the unknown part of a historical peak's date -- ``YYYY-MM-00`` when - the day is not known, ``YYYY-00-00`` when the month is not either (the ``Bd`` and - ``Bm`` ``peak_cd`` qualifiers). Those are real peaks, often a site's largest, and - dropping them loses the discharge value with the date. A date NWIS records only - partly stays ``NaT`` rather than being completed into one it does not record. - """ - df = pd.DataFrame({"peak_dt": [peak_dt], "peak_va": [563000]}) - - df = preformat_peaks_response(df) - - assert len(df) == 1, f"{peak_dt!r} was dropped" - assert df["peak_va"].iloc[0] == 563000 - if expected is None: - assert pd.isna(df["datetime"].iloc[0]) - else: - assert df["datetime"].iloc[0] == pd.Timestamp(expected) - - -def test_preformat_peaks_response_preserves_peak_dt(): - """``peak_dt`` must be kept through the reformat. - - The peaks response has no ``water_yr``, so ``peak_dt`` is the only - column holding the year of a censored peak -- and the only way a caller can - tell an unknown day from a known one, since ``peak_cd`` does not always - include the qualifier. - """ - df = pd.DataFrame({"peak_dt": ["1858-00-00"], "peak_va": [563000]}) - - df = preformat_peaks_response(df) - - assert df["peak_dt"].iloc[0] == "1858-00-00" - - -def test_preformat_peaks_response_malformed_frame_still_raises(): - """Only an *empty* peaks frame is a legitimate empty result. A non-empty - frame with no ``peak_dt`` column is a malformed response -- a truncated or - altered RDB header -- and must raise rather than be returned - without its datetime index. - """ - df = pd.DataFrame({"peak_va": [1000]}) - - with pytest.raises(KeyError, match="peak_dt"): - format_response(df, service="peaks") - - -class TestDeprecationWarnings: - """Verify the per-function DeprecationWarning is emitted with the right replacement. - - The module-level "use waterdata instead" warning is emitted on import; these - tests pin the function-specific replacements so users see actionable - migration guidance the first time they call each NWIS getter. - """ - - @pytest.mark.parametrize( - "func_name, replacement_substring", - [ - ("get_dv", "waterdata.get_daily"), - ("get_iv", "waterdata.get_continuous"), - ("get_info", "waterdata.get_monitoring_locations"), - ("what_sites", "waterdata.get_monitoring_locations"), - ("get_stats", "waterdata.get_stats_por"), - ("get_discharge_peaks", "waterdata.get_peaks"), - ("get_ratings", "waterdata.get_ratings"), - ("get_record", "waterdata.get_*"), - ("query_waterdata", "waterdata.get_*"), - ("query_waterservices", "waterdata.get_*"), - ], - ) - def test_warn_message_includes_replacement(self, func_name, replacement_substring): - """Each deprecated function emits a warning naming the right replacement.""" - from dataretrieval.nwis import _NWIS_REMOVAL_DATE, _warn_deprecated - - with pytest.warns(DeprecationWarning, match=func_name) as record: - _warn_deprecated(func_name) - message = str(record[0].message) - assert replacement_substring in message - assert _NWIS_REMOVAL_DATE in message - - def test_get_iv_fires_deprecation_on_call(self, httpx_mock): - """End-to-end: a real call routes through _warn_deprecated.""" - httpx_mock.add_response( - method="GET", - url=re.compile(r"^https://waterservices\.usgs\.gov/nwis/iv(\?.*)?$"), - json={"value": {"timeSeries": []}}, - ) - with pytest.warns(DeprecationWarning, match="get_iv.*waterdata.get_continuous"): - get_iv(sites="01491000") - - def test_nested_calls_emit_one_warning(self, httpx_mock): - """get_record(service='iv') wraps get_iv -> query_waterservices. - - Without re-entrancy suppression the user would see 3 near-identical - deprecation warnings for one call; pin the outermost-only contract. - """ - httpx_mock.add_response( - method="GET", - url=re.compile(r"^https://waterservices\.usgs\.gov/nwis/iv(\?.*)?$"), - json={"value": {"timeSeries": []}}, - ) - with warnings.catch_warnings(record=True) as caught: - warnings.simplefilter("always", DeprecationWarning) - get_record(sites="01491000", service="iv") - deprecations = [w for w in caught if issubclass(w.category, DeprecationWarning)] - assert len(deprecations) == 1 - assert "get_record" in str(deprecations[0].message) - - @pytest.mark.parametrize("module_name, func_name, arguments", _NAMED_REPLACEMENTS) - def test_named_replacement_resolves(self, module_name, func_name, arguments): - """Check that each replacement function exists and is callable. - - Keyword names shown in the deprecation message must be declared - parameters of that function. - This test inspects the function without calling it; - it does not emit a deprecation warning or retrieve data. - """ - func = getattr(getattr(dataretrieval, module_name), func_name, None) - assert callable(func), ( - f"`{module_name}.{func_name}` is missing — fix the replacement " - "tables in nwis.py or add the replacement before merging." - ) - for keyword in re.findall(r"(\w+)=", arguments): - assert keyword in inspect.signature(func).parameters - - -class TestDefunctRecordOptions: - """Ignored ``get_record`` parameters warn without preventing retrieval. - - The parameters remain accepted until the ``nwis`` module is removed. - """ - - @pytest.mark.parametrize( - "option, value, replacement", - [ - ("wide_format", False, "waterdata.get_samples"), - ("datetime_index", False, "waterdata.get_continuous"), - ("state", "OH", "nwdc.get_wateruse"), - ], - ) - def test_passing_one_advises_and_still_returns_data( - self, httpx_mock, option, value, replacement - ): - _mock_site(httpx_mock) - with warnings.catch_warnings(record=True) as caught: - warnings.simplefilter("always", DeprecationWarning) - df = get_record(sites="01491000", service="site", **{option: value}) - assert not df.empty - assert [ - w - for w in caught - if option in str(w.message) and replacement in str(w.message) - ] - - @pytest.mark.parametrize("option", sorted(_DEFUNCT_RECORD_OPTIONS)) - def test_naming_an_option_at_its_default_is_silent(self, httpx_mock, option): - """Passing a parameter's declared default emits no parameter warning. - - The value in the warning table must match the signature's default. - """ - default = inspect.signature(get_record).parameters[option].default - assert _DEFUNCT_RECORD_OPTIONS[option][0] == default - _mock_site(httpx_mock) - with warnings.catch_warnings(record=True) as caught: - warnings.simplefilter("always", DeprecationWarning) - get_record(sites="01491000", service="site", **{option: default}) - assert not [w for w in caught if f"`{option}` argument" in str(w.message)] - - def test_defaults_advise_nothing(self, httpx_mock): - """A caller who never named an option must not be told about one.""" - _mock_site(httpx_mock) - with warnings.catch_warnings(record=True) as caught: - warnings.simplefilter("always", DeprecationWarning) - get_record(sites="01491000", service="site") - assert not [w for w in caught if "argument is deprecated" in str(w.message)] - - def test_each_advisory_is_emitted_once_per_call(self, httpx_mock): - """A call naming all three options emits four ``DeprecationWarning``s: - one for ``get_record`` itself, and one per named option, each with a - distinct subject and a distinct replacement. - """ - _mock_site(httpx_mock) - with warnings.catch_warnings(record=True) as caught: - warnings.simplefilter("always", DeprecationWarning) - get_record( - sites="01491000", - service="site", - wide_format=False, - datetime_index=False, - state="OH", - ) - deprecations = [w for w in caught if issubclass(w.category, DeprecationWarning)] - messages = [str(w.message) for w in deprecations] - assert len(messages) == 4 - for subject in ( - "`wide_format` argument", - "`datetime_index` argument", - "`state` argument", - ): - assert sum(subject in m for m in messages) == 1 - # Pins the advisories' hand-counted ``stacklevel``: every one must - # blame the caller's own line, not a frame inside the package. - assert {Path(w.filename).name for w in deprecations} == {Path(__file__).name} - - -class TestDefunct: - """Verify that defunct functions raise NameError.""" - - def test_get_qwdata_raises(self): - with pytest.raises(NameError, match="get_qwdata"): - get_qwdata() - - def test_get_discharge_measurements_raises(self): - with pytest.raises(NameError, match="get_discharge_measurements"): - get_discharge_measurements() - - def test_get_gwlevels_raises(self): - with pytest.raises(NameError, match="get_gwlevels"): - get_gwlevels() - - def test_get_pmcodes_raises(self): - with pytest.raises(NameError, match="get_pmcodes"): - get_pmcodes() - - def test_get_water_use_raises(self): - with pytest.raises(NameError, match="get_water_use"): - get_water_use() - - def test_get_record_defunct_service_measurements(self): - with pytest.raises(NameError, match="no longer supported by get_record"): - get_record(service="measurements") - - def test_get_record_defunct_service_gwlevels(self): - with pytest.raises(NameError, match="no longer supported by get_record"): - get_record(service="gwlevels") - - def test_get_record_defunct_service_pmcodes(self): - with pytest.raises(NameError, match="no longer supported by get_record"): - get_record(service="pmcodes") - - def test_get_record_defunct_service_water_use(self): - with pytest.raises(NameError, match="no longer supported by get_record"): - get_record(service="water_use") - - -def test_empty_timeseries(httpx_mock): - """Test based on empty case from GitHub Issue #26.""" - sites = "011277906" - start = "2010-07-20" - end = "2010-07-20" - - mock_json = _load_mock_json("nwis_iv_empty_mock.json") - # Match the base URL and ensure query parameters are correct - httpx_mock.add_response( - method="GET", - url=re.compile(r"^https://waterservices\.usgs\.gov/nwis/iv(\?.*)?$"), - json=mock_json, - ) - - df = get_record(sites=sites, service="iv", start=start, end=end) - assert df.empty is True - - -class TestMetaData: - """Tests of NWIS metadata setting (originally GitHub Issue #73). - - ``site_info`` is a property that lazily re-queries ``what_sites``; mocked - here against the ``site`` endpoint so it is exercised offline. - """ - - def test_set_metadata_info_site(self, httpx_mock): - """site_info is populated when ``sites`` is supplied.""" - _mock_site(httpx_mock) - md = NWIS_Metadata(mock.MagicMock(), sites="01491000") - assert md.site_info - - def test_set_metadata_info_site_no(self, httpx_mock): - """site_info is populated when ``site_no`` is supplied.""" - _mock_site(httpx_mock) - md = NWIS_Metadata(mock.MagicMock(), site_no="01491000") - assert md.site_info - - def test_set_metadata_info_stateCd(self, httpx_mock): - """site_info is populated when ``stateCd`` is supplied.""" - _mock_site(httpx_mock) - md = NWIS_Metadata(mock.MagicMock(), stateCd="RI") - assert md.site_info - - def test_set_metadata_info_huc(self, httpx_mock): - """site_info is populated when ``huc`` is supplied.""" - _mock_site(httpx_mock) - md = NWIS_Metadata(mock.MagicMock(), huc="01") - assert md.site_info - - def test_set_metadata_info_bbox(self, httpx_mock): - """site_info is populated when ``bBox`` is supplied.""" - _mock_site(httpx_mock) - md = NWIS_Metadata(mock.MagicMock(), bBox="-92.8,44.2,-88.9,46.0") - assert md.site_info - - def test_set_metadata_info_countyCd(self, httpx_mock): - """site_info is populated when ``countyCd`` is supplied.""" - _mock_site(httpx_mock) - md = NWIS_Metadata(mock.MagicMock(), countyCd="01001") - assert md.site_info - - -class TestReadRdb: - """Tests for the NWIS-specific parse-then-format path. - - The format-agnostic parser is exercised in tests/rdb_test.py; this - class pins the wrapper-specific contract — that an empty parser - result passes through format_response without raising (issue #171), - on the plain arm and on the peaks arm alike. - """ - - NO_RESULTS_RDB = ( - "# //Output-Format: RDB\n" - "# //Response-Status: OK\n" - "# //Response-Message: No sites found matching all criteria\n" - ) - - def test_no_sites_flows_through_format_response(self): - """A "No sites found" response is a legitimate empty result, not an - error, so callers can check ``df.empty`` rather than catching an - exception. Regression for issue #171 (previously raised IndexError), - which now also covers the empty-frame path through ``format_response``. - """ - df = _read_rdb(self.NO_RESULTS_RDB) - assert isinstance(df, pd.DataFrame) - assert df.empty - - def test_no_peaks_flows_through_format_response(self): - """``format_response(service="peaks")`` must tolerate an empty frame. - - The peaks arm runs ``preformat_peaks_response`` before the - "datetime not in columns" check, and that function popped ``peak_dt`` - unconditionally, so a column-less frame raised ``KeyError`` where every - other service returned an empty frame (issue #171's contract). - - Both functions are public API, so any caller parsing a peaks RDB - reaches this -- it is not unreachable behind ``NoSitesError``. - """ - # Match get_discharge_peaks: raw read_rdb, then the peaks-specific - # format_response. - df = read_rdb(self.NO_RESULTS_RDB) - df = format_response(df, service="peaks") - assert isinstance(df, pd.DataFrame) - assert df.empty - - def test_malformed_peaks_frame_still_raises(self): - """Only an *empty* peaks frame is a legitimate empty result. A - non-empty frame with no ``peak_dt`` column is a malformed response -- - a truncated or altered RDB header -- and must raise rather than be - returned without its datetime index. - """ - df = pd.DataFrame({"peak_va": [1000]}) - - with pytest.raises(KeyError, match="peak_dt"): - format_response(df, service="peaks") - - -class TestFormatResponseArgument: - """``format_response`` indexes a copy, so its argument survives the call. - - The function is public, and both internal callers still hold the frame - they passed while it runs. Indexing that frame in place moved their - columns into an index they never asked for. - """ - - @staticmethod - def _frame(sites): - return pd.DataFrame( - { - "site_no": sites, - "datetime": pd.date_range("2020-01-01", periods=len(sites), freq="D"), - "00060": np.arange(float(len(sites))), - } - ) - - @pytest.mark.parametrize( - "sites,expected_index", - [ - pytest.param(["01", "01", "01"], pd.DatetimeIndex, id="single-site"), - pytest.param(["01", "02", "03"], pd.MultiIndex, id="multi-site"), - ], - ) - def test_it_keeps_its_columns_and_index(self, sites, expected_index): - df = self._frame(sites) - before = df.copy(deep=True) - - out = format_response(df) - - assert isinstance(out.index, expected_index), "the result must be indexed" - pd.testing.assert_frame_equal(df, before) - - def test_the_peaks_path_keeps_them_too(self): - """The peaks arm derives ``datetime`` from ``peak_dt``, and the derived - column belongs to the result rather than to the frame it was handed. - ``preformat_peaks_response`` is public, so a caller reaches that - derivation without going through ``format_response`` at all. - """ - df = pd.DataFrame( - { - "site_no": ["01", "01"], - "peak_dt": ["2020-01-01", "2020-01-02"], - "peak_va": [1.0, 2.0], - } - ) - before = df.copy(deep=True) - - out = format_response(df, service="peaks") - - assert isinstance(out.index, pd.DatetimeIndex), "the result must be indexed" - pd.testing.assert_frame_equal(df, before) - - -class TestGetRecordDispatch: - """``get_record`` is a router; each service must reach its own getter. - - The arms look near-identical, which is what lets a wrong one pass review: every arm - forwards ``sites`` except ``ratings``, which takes a scalar ``site``. A swap there - fails only at request time, for one service, in a deprecated facade that is rarely - read. - """ - - @pytest.mark.parametrize( - "service,target,site_kwarg", - [ - ("iv", "get_iv", "sites"), - ("dv", "get_dv", "sites"), - ("site", "get_info", "sites"), - ("peaks", "get_discharge_peaks", "sites"), - ("stat", "get_stats", "sites"), - ("ratings", "get_ratings", "site"), - ], - ) - def test_each_service_reaches_its_own_getter(self, service, target, site_kwarg): - frame = pd.DataFrame({"x": [1]}) - with mock.patch(f"dataretrieval.nwis.{target}") as fake: - fake.return_value = (frame, mock.Mock()) - out = get_record(sites="01491000", service=service) - assert fake.call_count == 1 - assert fake.call_args.kwargs[site_kwarg] == "01491000" - # The router returns the frame alone, dropping the metadata half. - assert out is frame - - def test_unrecognized_service_lists_the_ones_it_serves(self): - with pytest.raises(ValueError) as excinfo: - get_record(sites="01491000", service="nope") - message = str(excinfo.value) - assert "Invalid service: 'nope'" in message - assert "'iv'" in message and "'peaks'" in message - assert "waterdata" in message - - -def test_html_error_page_instead_of_json_says_what_to_do(): - """A 200 whose body is an HTML error page must not be raised as a JSON parse error. - - The legacy services respond to an outage with a styled page and a 200, so the - only signal is the body. A caller that gets ``JSONDecodeError`` has - nothing actionable; this path names the cause and the remedy. - """ - response = mock.Mock() - response.json.side_effect = ValueError("no json") - response.text = "USGS" - response.headers = {"Content-Type": "text/html; charset=UTF-8"} - response.status_code = 200 - response.url = "https://waterservices.usgs.gov/nwis/dv?sites=01646500" - - with pytest.raises(ValueError) as excinfo: - nwis._parse_json_or_raise(response) - message = str(excinfo.value) - assert "HTML response instead of JSON" in message - assert "Wait and retry" in message - assert "waterdata" in message - - -def test_a_non_html_parse_failure_is_re_raised_unchanged(): - """Only HTML gets the rewrite; a malformed-JSON body must not be - relabelled as a service outage.""" - response = mock.Mock() - response.json.side_effect = ValueError("Expecting value") - response.text = "{not json" - response.headers = {"Content-Type": "application/json"} - response.status_code = 200 - response.url = "https://waterservices.usgs.gov/nwis/dv" - - with pytest.raises(ValueError, match="Expecting value"): - nwis._parse_json_or_raise(response) - - -def test_deprecating_a_getter_with_no_named_replacement_is_refused(): - """``@_deprecated`` guarantees the caller a replacement, so applying it to a - function with no recorded replacement raises -- a deprecation warning naming nothing - leaves the caller with nothing to - migrate to.""" - with pytest.raises(RuntimeError, match="_REPLACEMENTS missing entry"): - - @nwis._deprecated - def not_a_real_getter(): - pass - - -def test_utc_localization_of_a_single_datetime_index(): - """NWIS returns naive local timestamps; a frame whose index is a plain - DatetimeIndex must still come back tz-aware, or two services' frames - cannot be concatenated.""" - index = pd.to_datetime(["2018-01-24 10:30", "2018-01-24 11:30"]) - out = nwis._localized_datetime_index(index) - assert str(out.tz) == "UTC" - - -def test_metadata_site_info_is_none_when_no_site_filter_was_used(): - """``site_info`` fetches the sites a query named. A query filtered by - something else (a parameter code alone) has no sites to describe, and - guessing one would describe a site the query never named.""" - md = NWIS_Metadata(mock.MagicMock(), parameterCd="00060") - assert md.site_info is None - - -def test_utc_localization_of_a_multi_index_datetime_level(): - """``multi_index=True`` puts the timestamp on level 1 under the site id. The naive - level must still be localized, or a multi-site frame holds two different time-zone - conventions in one column.""" - idx = pd.MultiIndex.from_arrays( - [ - ["01491000", "01491000"], - pd.to_datetime(["2018-01-24 10:30", "2018-01-24 11:30"]), - ], - names=["site_no", "datetime"], - ) - out = nwis._localized_datetime_index(idx) - assert str(out.levels[1].tz) == "UTC" - - -class TestGetInfoSeriesCatalog: - """``seriesCatalogOutput`` and the expanded site format are mutually exclusive on - the wire, so the getter picks one and warns when the caller asked for the one being - retired.""" - - @pytest.mark.parametrize("flag", ["True", "TRUE", "true", True]) - def test_asking_for_the_series_catalog_warns_and_forwards_it( - self, flag, httpx_mock - ): - httpx_mock.add_response(method="GET", url=_SITE_RE, text="#\nx\n5s\n") - with pytest.warns(DataCurrencyWarning, match="qw data endpoint is"): - nwis.get_info(sites="01491000", seriesCatalogOutput=flag) - sent = str(httpx_mock.get_requests()[-1].url) - assert "seriesCatalogOutput=True" in sent - assert "siteOutput" not in sent - - def test_without_it_the_expanded_site_format_is_requested(self, httpx_mock): - httpx_mock.add_response(method="GET", url=_SITE_RE, text="#\nx\n5s\n") - nwis.get_info(sites="01491000") - sent = str(httpx_mock.get_requests()[-1].url) - assert "siteOutput=Expanded" in sent - assert "seriesCatalogOutput" not in sent diff --git a/tests/utils_test.py b/tests/utils_test.py index 4a089f5eb..460e20287 100644 --- a/tests/utils_test.py +++ b/tests/utils_test.py @@ -7,7 +7,7 @@ import pandas as pd import pytest -from dataretrieval import _querying, _wqx, exceptions, nwis, utils +from dataretrieval import _querying, _wqx, exceptions, utils class Test_Ambient: @@ -28,19 +28,20 @@ def test_scope_restores_previous_value(self): class Test_query: - """Tests of the query function (mocked — no live NWIS calls).""" + """Tests of the query function (mocked — no live calls).""" def test_url_too_long(self, httpx_mock): """A 413 / 414 from the service (an over-long query URL, Issue #64) is raised as the typed URLTooLong.""" + url = "https://example.invalid/x" httpx_mock.add_response(method="GET", status_code=414) with pytest.raises(exceptions.URLTooLong): - nwis.get_iv(sites=["01491000", "01491001"]) + utils.query(url, {"sites": ["01491000", "01491001"]}) def test_header(self, httpx_mock): """query() sends a User-Agent header and returns the response.""" httpx_mock.add_response(method="GET", json={"value": {"timeSeries": []}}) - url = "https://waterservices.usgs.gov/nwis/dv" + url = "https://example.invalid/x" payload = { "format": "json", "startDT": "2010-10-01", @@ -52,22 +53,8 @@ def test_header(self, httpx_mock): assert response.status_code == 200 # GET was successful assert "user-agent" in response.request.headers - def test_no_sites_detection_respects_response_charset(self, httpx_mock): - """The legacy sentinel is checked after HTTP charset decoding.""" - url = "https://example.invalid/x" - body = "No sites/data found".encode("utf-16") - httpx_mock.add_response( - method="GET", - url=url, - content=body, - headers={"Content-Type": "text/plain; charset=utf-16"}, - ) - - with pytest.raises(exceptions.NoSitesError): - utils.query(url, {}) - def test_query_does_not_opt_into_retry(self, httpx_mock, monkeypatch): - """The public legacy adapter still raises the first transient failure.""" + """The public legacy query path still raises the first transient failure.""" url = "https://example.invalid/x" request_url = f"{url}?a=1" httpx_mock.add_response(method="GET", url=request_url, status_code=503) @@ -80,7 +67,8 @@ def test_query_does_not_opt_into_retry(self, httpx_mock, monkeypatch): assert len(httpx_mock.get_requests()) == 1 def test_opt_in_retry_recovers_from_transient(self, httpx_mock, monkeypatch): - """Active adapters can opt into bounded retry without changing NWIS.""" + """Active adapters can opt into bounded retry without changing the + single-shot query path.""" import dataretrieval.transport.retry as retry url = "https://example.invalid/x" @@ -168,10 +156,8 @@ def test_uniform_retry_attributes_readable_on_every_error(self): """Every error exposes ``.status_code`` / ``.retry_after`` / ``.retryable`` so a base ``except DataRetrievalError as e`` can branch and retry without an ``AttributeError`` on the types that lack a status (URLTooLong, - NetworkError, NoSitesError, ...). ``.retryable`` marks the 429/5xx and + NetworkError, ...). ``.retryable`` marks the 429/5xx and connection failures.""" - import httpx - # (error, status_code, retry_after, retryable) cases = [ (exceptions.error_for_status(404, "x"), 404, None, False), @@ -179,7 +165,6 @@ def test_uniform_retry_attributes_readable_on_every_error(self): (exceptions.error_for_status(503, "x"), 503, None, True), (exceptions.error_for_status(414, "x"), None, None, False), # URLTooLong (exceptions.NetworkError("x"), None, None, True), - (exceptions.NoSitesError(httpx.URL("https://x/y")), None, None, False), (exceptions.Unchunkable("x"), None, None, False), ] for err, status, retry_after, retryable in cases: @@ -187,31 +172,18 @@ def test_uniform_retry_attributes_readable_on_every_error(self): assert err.retry_after == retry_after, err assert err.retryable is retryable, err - def test_no_sites_error_is_data_retrieval_error(self): - """``NoSitesError`` (the legacy nwis no-data signal) derives from - ``DataRetrievalError`` and is not a builtin ``ValueError``, so it is - caught by the unified ``except dataretrieval.DataRetrievalError``.""" - assert issubclass(exceptions.NoSitesError, exceptions.DataRetrievalError) - assert not issubclass(exceptions.NoSitesError, ValueError) - import dataretrieval - - assert dataretrieval.NoSitesError is exceptions.NoSitesError - def test_typed_errors_survive_pickle_and_deepcopy(self): """Typed errors round-trip through pickle/deepcopy -- they get pickled back from multiprocessing / lithops workers, and their constructor fields - (status_code, retry_after, url) must be preserved.""" + (status_code, retry_after) must be preserved.""" import copy import pickle - import httpx - samples = [ exceptions.error_for_status(404, "not found"), # bare HTTPError exceptions.error_for_status(429, "slow down", retry_after=5.0), exceptions.error_for_status(503, "down"), exceptions.TransientError("boom", status_code=502, retry_after=1.5), - exceptions.NoSitesError(httpx.URL("https://example.invalid/x?a=1")), exceptions.NetworkError("could not reach the service"), ] for err in samples: @@ -222,8 +194,6 @@ def test_typed_errors_survive_pickle_and_deepcopy(self): assert revived.status_code == err.status_code if isinstance(err, exceptions.TransientError): assert revived.retry_after == err.retry_after - if isinstance(err, exceptions.NoSitesError): - assert revived.url == err.url def test_waterdata_exceptions_share_the_root(self): """waterdata's typed exceptions are ``DataRetrievalError`` too, so one @@ -338,7 +308,7 @@ def test_init_with_response(self): assert md.query_time is not None assert md.header is not None - # site_info is abstract on BaseMetadata; only nwis/wqp implement it. + # site_info is abstract on BaseMetadata; only wqp implements it. with pytest.raises(NotImplementedError): _ = md.site_info diff --git a/tests/validation_test.py b/tests/validation_test.py index 22d5a4ccd..38b74c8d1 100644 --- a/tests/validation_test.py +++ b/tests/validation_test.py @@ -10,7 +10,6 @@ from dataretrieval._validation import ( reject_together, - require_any_of, require_argument, require_exactly_one, require_one_of, @@ -100,35 +99,6 @@ def test_reports_every_missing_member_of_a_larger_group(self): require_together({"a": 1, "b": None, "c": None}) -class TestRequireAnyOf: - def test_accepts_one_supplied(self): - require_any_of({"sites": "01491000", "stateCd": None}) - - def test_accepts_more_than_one(self): - """Two filters narrow the query; only none of them is an error.""" - require_any_of({"sites": "01491000", "stateCd": "WI"}) - - def test_message_names_every_argument_that_would_have_served(self): - with pytest.raises(ValueError) as excinfo: - require_any_of({"sites": None, "stateCd": None, "huc": None}) - message = str(excinfo.value) - assert "At least one of sites, stateCd or huc is required" in message - assert "Pass one of sites, stateCd or huc." in message - - def test_context_says_what_the_group_is_for(self): - with pytest.raises(ValueError, match="as a major filter"): - require_any_of({"sites": None}, context="as a major filter") - - def test_remedy_replaces_the_default(self): - with pytest.raises(ValueError, match="Pass all four corners."): - require_any_of({"sites": None}, remedy="Pass all four corners.") - - def test_an_explicit_none_is_not_a_filter(self): - """``sites=None`` counted as supplied is how ``None`` reaches a URL.""" - with pytest.raises(ValueError): - require_any_of({"sites": None}) - - class TestRequireExactlyOne: def test_accepts_exactly_one_and_returns_it(self): assert require_exactly_one({"comid": 1, "feature_source": None}) == ( diff --git a/tests/waterservices_test.py b/tests/waterservices_test.py deleted file mode 100644 index 9c6eed23c..000000000 --- a/tests/waterservices_test.py +++ /dev/null @@ -1,418 +0,0 @@ -import datetime - -import pytest -from pandas import DataFrame - -from dataretrieval.exceptions import HTTPError, NoSitesError -from dataretrieval.nwis import ( - get_discharge_peaks, - get_dv, - get_info, - get_iv, - get_ratings, - get_record, - get_stats, - query_waterdata, - query_waterservices, - what_sites, -) - -try: - import geopandas as gpd -except ImportError: - gpd = None - - -def test_query_waterdata_validation(): - """Rejections name the filters, corners, and services that would work. - - Asserted on the remedy rather than the whole message: the caller is - typically a program, and what it needs from the failure is the set of - values that would have been accepted. - """ - with pytest.raises(ValueError) as value_error: - query_waterdata(service="pmcodes", format="rdb") - message = str(value_error.value) - assert "is required as a major filter" in message - assert "site_no, stateCd" in message - assert "nw_longitude_va" in message - - with pytest.raises(ValueError) as value_error: - query_waterdata(service=None, site_no="sites") - message = str(value_error.value) - assert "Invalid service: None" in message - # 'ratings' was listed here but is not an NwisWeb program: the URL it - # built returned an HTML error page, not data. - assert "'peaks'" in message - assert "get_ratings" in message - - with pytest.raises(ValueError) as value_error: - query_waterdata(service="pmcodes", nw_longitude_va="something") - message = str(value_error.value) - assert "must be given together to describe a bounding box" in message - # The three corners absent, so the caller knows what to add. - assert "nw_latitude_va, se_longitude_va and se_latitude_va" in message - - -def test_query_waterservices_validation(): - """Tests the validation parameters of the query_waterservices method""" - with pytest.raises(ValueError) as value_error: - query_waterservices(service="dv", format="rdb") - message = str(value_error.value) - assert "is required as a major filter" in message - assert "sites, stateCd, bBox, huc or countyCd" in message - - with pytest.raises(ValueError) as value_error: - query_waterservices(service=None, sites="sites") - message = str(value_error.value) - assert "Invalid service: None" in message - assert "'dv', 'iv', 'site', 'stat'" in message - - -def test_query_validation(httpx_mock): - request_url = ( - "https://waterservices.usgs.gov/nwis/stat?sites=bad_site_id&format=rdb" - ) - httpx_mock.add_response(method="GET", url=request_url, status_code=400) - with pytest.raises(HTTPError) as type_error: - get_stats(sites="bad_site_id") - assert request_url in str(type_error) - - request_url = "https://waterservices.usgs.gov/nwis/stat?sites=123456&format=rdb" - httpx_mock.add_response( - method="GET", - url=request_url, - text="No sites/data found using the selection criteria specified", - ) - with pytest.raises(NoSitesError) as no_sites_error: - get_stats(sites="123456") - assert request_url in str(no_sites_error) - - -def test_get_record_validation(): - """An unknown service names the ones get_record does serve.""" - with pytest.raises(ValueError) as value_error: - get_record(sites=["01491000"], service="not_a_service") - message = str(value_error.value) - assert "Invalid service: 'not_a_service'" in message - assert "'dv', 'iv', 'site', 'stat', 'peaks', 'ratings'" in message - - -def test_get_record_rejects_non_string_sites(): - """The type rejection shows both accepted spellings of ``sites``.""" - with pytest.raises(TypeError) as type_error: - get_record(sites=1491000, service="dv") - message = str(type_error.value) - assert "not int" in message - assert "sites='01491000'" in message - assert "sites=['01491000', '01645000']" in message - - -def test_get_dv(httpx_mock): - """Verify get_dv builds the expected request URL and returns a DataFrame.""" - format = "json" - site = "01491000%2C01645000" - request_url = ( - f"https://waterservices.usgs.gov/nwis/dv?format={format}" - f"&startDT=2020-02-14&endDT=2020-02-15&sites={site}" - ) - response_file_path = "tests/data/waterservices_dv.txt" - mock_request(httpx_mock, request_url, response_file_path) - df, md = get_dv( - sites=["01491000", "01645000"], start="2020-02-14", end="2020-02-15" - ) - - if not isinstance(df, DataFrame): - raise TypeError(f"{type(df)} is not DataFrame base class type") - - assert df.size == 8 - assert_metadata(httpx_mock, request_url, md, site, None, format) - - -@pytest.mark.parametrize("site_input_type_list", [True, False]) -def test_get_dv_site_value_types(httpx_mock, site_input_type_list): - """Tests get_dv method for valid input types for the 'sites' parameter""" - _format = "json" - site = "01491000" - request_url = ( - f"https://waterservices.usgs.gov/nwis/dv?format={_format}" - f"&startDT=2020-02-14&endDT=2020-02-15&sites={site}" - ) - response_file_path = "tests/data/waterservices_dv.txt" - mock_request(httpx_mock, request_url, response_file_path) - if site_input_type_list: - sites = [site] - else: - sites = site - df, _md = get_dv(sites=sites, start="2020-02-14", end="2020-02-15") - if not isinstance(df, DataFrame): - raise TypeError(f"{type(df)} is not DataFrame base class type") - - assert df.size == 8 - - -def test_get_iv(httpx_mock): - """Verify get_iv builds the expected request URL and returns a DataFrame.""" - format = "json" - site = "01491000%2C01645000" - request_url = ( - f"https://waterservices.usgs.gov/nwis/iv?format={format}" - f"&startDT=2019-02-14&endDT=2020-02-15&sites={site}" - ) - response_file_path = "tests/data/waterservices_iv.txt" - mock_request(httpx_mock, request_url, response_file_path) - df, md = get_iv( - sites=["01491000", "01645000"], start="2019-02-14", end="2020-02-15" - ) - if not isinstance(df, DataFrame): - raise TypeError(f"{type(df)} is not DataFrame base class type") - - # Two sites x two parameter codes, each value column paired with its - # qualifier (``_cd``) column, indexed by (site_no, datetime). - assert list(df.columns) == ["00060", "00060_cd", "00065", "00065_cd"] - assert df.index.names == ["site_no", "datetime"] - assert set(df.index.get_level_values("site_no")) == {"01491000", "01645000"} - assert md.url == request_url - assert_metadata(httpx_mock, request_url, md, site, None, format) - - -@pytest.mark.parametrize("site_input_type_list", [True, False]) -def test_get_iv_site_value_types(httpx_mock, site_input_type_list): - """Tests get_iv method for valid input type for the 'sites' parameter""" - _format = "json" - site = "01491000" - request_url = ( - f"https://waterservices.usgs.gov/nwis/iv?format={_format}" - f"&startDT=2019-02-14&endDT=2020-02-15&sites={site}" - ) - response_file_path = "tests/data/waterservices_iv.txt" - mock_request(httpx_mock, request_url, response_file_path) - if site_input_type_list: - sites = [site] - else: - sites = site - df, md = get_iv(sites=sites, start="2019-02-14", end="2020-02-15") - if not isinstance(df, DataFrame): - raise TypeError(f"{type(df)} is not DataFrame base class type") - assert list(df.columns) == ["00060", "00060_cd", "00065", "00065_cd"] - assert not df.empty - assert md.url == request_url - - -def test_get_info(httpx_mock): - """ - Verify get_info builds the expected request URL and returns a DataFrame. - Note that only sites and format are passed as query params - """ - size = 24 - format = "rdb" - site = "01491000%2C01645000" - parameter_cd = "00618" - request_url = f"https://waterservices.usgs.gov/nwis/site?sites={site}¶meterCd={parameter_cd}&siteOutput=Expanded&format={format}" - response_file_path = "tests/data/waterservices_site.txt" - mock_request(httpx_mock, request_url, response_file_path) - df, md = get_info(sites=["01491000", "01645000"], parameterCd="00618") - if not isinstance(df, DataFrame): - raise TypeError(f"{type(df)} is not DataFrame base class type") - - if "geometry" in list(df): - geom_type = df.geom_type.unique() - if len(geom_type) > 1 or geom_type[0] != "Point": - raise AssertionError( - f"Geometry type {geom_type} not valid, expecting Point" - ) - size += len(df) - - assert df.size == size - assert md.url == request_url - assert_metadata(httpx_mock, request_url, md, site, [parameter_cd], format) - - -def test_get_info_preserves_leading_zero_codes(httpx_mock): - """Site codes keep their zeros: HUC 02060005, not 2060005. - - ``site_no`` was hinted as a string from the start, but ``huc_cd`` was - inferred as an int, so every site's hydrologic unit came back short a - digit. RDB code columns are now detected from the header. - """ - site = "01491000%2C01645000" - request_url = ( - f"https://waterservices.usgs.gov/nwis/site?sites={site}" - "¶meterCd=00618&siteOutput=Expanded&format=rdb" - ) - mock_request(httpx_mock, request_url, "tests/data/waterservices_site.txt") - - df, _ = get_info(sites=["01491000", "01645000"], parameterCd="00618") - - assert df["huc_cd"].tolist() == ["02060005", "02070008"] - assert df["site_no"].tolist() == ["01491000", "01645000"] - - -def test_get_discharge_peaks(httpx_mock): - """Verify get_discharge_peaks builds the expected URL and returns a DataFrame.""" - format = "rdb" - site = "01594440" - request_url = ( - f"https://nwis.waterdata.usgs.gov/nwis/peaks?format={format}&site_no={site}" - "&begin_date=2000-02-14&end_date=2020-02-15" - ) - response_file_path = "tests/data/waterservices_peaks.txt" - mock_request(httpx_mock, request_url, response_file_path) - df, md = get_discharge_peaks(sites=[site], start="2000-02-14", end="2020-02-15") - if not isinstance(df, DataFrame): - raise TypeError(f"{type(df)} is not DataFrame base class type") - - assert df.shape == (20, 13) - assert_metadata(httpx_mock, request_url, md, site, None, format) - - -@pytest.mark.parametrize("site_input_type_list", [True, False]) -def test_get_discharge_peaks_sites_value_types(httpx_mock, site_input_type_list): - """Tests get_discharge_peaks for valid input types of the 'sites' parameter""" - - _format = "rdb" - site = "01594440" - request_url = ( - f"https://nwis.waterdata.usgs.gov/nwis/peaks?format={_format}&site_no={site}" - "&begin_date=2000-02-14&end_date=2020-02-15" - ) - response_file_path = "tests/data/waterservices_peaks.txt" - mock_request(httpx_mock, request_url, response_file_path) - if site_input_type_list: - sites = [site] - else: - sites = site - - df, _md = get_discharge_peaks(sites=sites, start="2000-02-14", end="2020-02-15") - if not isinstance(df, DataFrame): - raise TypeError(f"{type(df)} is not DataFrame base class type") - - assert df.shape == (20, 13) - - -def test_get_ratings_validation(): - """Verify get_ratings validates file_type values.""" - site = "01594440" - with pytest.raises(ValueError) as value_error: - get_ratings(site=site, file_type="BAD") - message = str(value_error.value) - assert "Invalid file_type: 'BAD'" in message - assert "'base', 'corr', 'exsa'" in message - - -def test_get_ratings(httpx_mock): - """Verify get_ratings builds the expected URL and returns a DataFrame.""" - format = "rdb" - site = "01594440" - request_url = f"https://nwis.waterdata.usgs.gov/nwisweb/get_ratings/?site_no={site}&file_type=base" - response_file_path = "tests/data/waterservices_ratings.txt" - mock_request(httpx_mock, request_url, response_file_path) - df, md = get_ratings(site_no=site) - if not isinstance(df, DataFrame): - raise TypeError(f"{type(df)} is not DataFrame base class type") - - assert df.size == 33 - assert_metadata(httpx_mock, request_url, md, site, None, format) - - -def test_what_sites(httpx_mock): - """Verify what_sites builds the expected URL and returns a DataFrame.""" - size = 2472 - format = "rdb" - parameter_cd = "00010%2C00060" - parameter_cd_list = ["00010", "00060"] - request_url = ( - "https://waterservices.usgs.gov/nwis/site?bBox=-83.0%2C36.5%2C-81.0%2C38.5" - f"¶meterCd={parameter_cd}&hasDataTypeCd=dv&format={format}" - ) - response_file_path = "tests/data/nwis_sites.txt" - mock_request(httpx_mock, request_url, response_file_path) - - df, md = what_sites( - bBox=[-83.0, 36.5, -81.0, 38.5], - parameterCd=parameter_cd_list, - hasDataTypeCd="dv", - ) - if not isinstance(df, DataFrame): - raise TypeError(f"{type(df)} is not DataFrame base class type") - - if gpd is not None: - if not isinstance(df, gpd.GeoDataFrame): - raise AssertionError(f"{type(df)} is not a GeoDataFrame") - - geom_type = df.geom_type.unique() - if len(geom_type) > 1 or geom_type[0] != "Point": - raise AssertionError( - f"Geometry type {geom_type} not valid, expecting Point" - ) - - size += len(df) - - assert df.size == size - assert_metadata(httpx_mock, request_url, md, None, parameter_cd_list, format) - - -def test_get_stats(httpx_mock): - """Verify get_stats builds the expected URL and returns a DataFrame.""" - format = "rdb" - request_url = f"https://waterservices.usgs.gov/nwis/stat?sites=01491000%2C01645000&format={format}" - response_file_path = "tests/data/waterservices_stats.txt" - mock_request(httpx_mock, request_url, response_file_path) - - df, md = get_stats(sites=["01491000", "01645000"]) - if not isinstance(df, DataFrame): - raise TypeError(f"{type(df)} is not DataFrame base class type") - assert df.size == 51936 - assert_metadata(httpx_mock, request_url, md, None, None, format) - - -@pytest.mark.parametrize("site_input_type_list", [True, False]) -def test_get_stats_site_value_types(httpx_mock, site_input_type_list): - """Tests get_stats method for valid input types for the 'sites' parameter""" - _format = "rdb" - site = "01491000" - request_url = ( - f"https://waterservices.usgs.gov/nwis/stat?sites={site}&format={_format}" - ) - response_file_path = "tests/data/waterservices_stats.txt" - mock_request(httpx_mock, request_url, response_file_path) - if site_input_type_list: - sites = [site] - else: - sites = site - df, _md = get_stats(sites=sites) - if not isinstance(df, DataFrame): - raise TypeError(f"{type(df)} is not DataFrame base class type") - assert df.size == 51936 - - -def mock_request(httpx_mock, request_url, file_path): - with open(file_path, encoding="utf-8") as text: - httpx_mock.add_response( - method="GET", - url=request_url, - text=text.read(), - headers={"mock_header": "value"}, - ) - - -def assert_metadata(httpx_mock, request_url, md, site, parameter_cd, format): - assert md.url == request_url - assert isinstance(md.query_time, datetime.timedelta) - assert md.header.get("mock_header") == "value" - if site is not None: - site_request_url = ( - f"https://waterservices.usgs.gov/nwis/site?sites={site}&format=rdb" - ) - with open("tests/data/waterservices_site.txt", encoding="utf-8") as text: - httpx_mock.add_response( - method="GET", url=site_request_url, text=text.read() - ) - site_info, _ = md.site_info - if not isinstance(site_info, DataFrame): - raise AssertionError(f"{type(site_info)} is not DataFrame base class type") - - if format == "rdb": - assert md.comment is not None - else: - assert md.comment is None From a87052e5e5910ec9988fc5d6339f654312ffb1d9 Mon Sep 17 00:00:00 2001 From: thodson-usgs Date: Thu, 22 Oct 2026 14:31:31 -0500 Subject: [PATCH 2/9] docs: copy-edit prose to USGS Suggestions to Authors (STA8) Prose only (Markdown, notebook Markdown cells, docstrings, and comments); no identifiers, runtime strings, or doctest blocks changed. - 'while' for contrast -> whereas/although (STA8 p. 60); 'since' for cause -> because (p. 45); 'data' plural (p. 48); 'and/or' -> 'or both' (p. 44) - Hyphenate unit modifiers: water-quality, surface-water (p. 28) - Numbers: thousands separators, 'from X to Y' ranges, words for isolated small counts (pp. 145-146) - State names spelled out at first use and when standing alone (p. 127); 'State' capitalized for a U.S. State and 'U.S.' as an adjective (GPO) - Fix typos in notebooks and docstrings --- .gitlab/issue_templates/reviewer_checklist.md | 2 +- .../reviewer_checklist.md | 2 +- CONTEXT.md | 2 +- NEWS.md | 16 ++++---- README.md | 10 ++--- dataretrieval/_deprecation.py | 4 +- dataretrieval/codes/__init__.py | 2 +- dataretrieval/codes/states.py | 24 ++++++------ dataretrieval/combining.py | 2 +- dataretrieval/configuration.py | 15 ++++---- dataretrieval/exceptions.py | 2 +- dataretrieval/interruptions.py | 2 +- dataretrieval/ngwmn.py | 16 ++++---- dataretrieval/nldi.py | 2 +- dataretrieval/nwdc.py | 14 +++---- dataretrieval/ogc/chunking.py | 4 +- dataretrieval/ogc/engine.py | 2 +- dataretrieval/ogc/planning.py | 2 +- dataretrieval/ogc/shaping.py | 2 +- dataretrieval/progress.py | 4 +- dataretrieval/streamstats.py | 2 +- dataretrieval/transport/fanout.py | 4 +- dataretrieval/transport/links.py | 4 +- dataretrieval/transport/liveness.py | 4 +- dataretrieval/waterdata/metadata.py | 32 ++++++++-------- dataretrieval/waterdata/nearest.py | 2 +- dataretrieval/waterdata/ratings.py | 2 +- dataretrieval/waterdata/reference.py | 4 +- dataretrieval/waterdata/samples.py | 11 +++--- dataretrieval/waterdata/time_series.py | 20 +++++----- dataretrieval/wqp.py | 4 +- demos/R Python Vignette equivalents.ipynb | 4 +- demos/USGS_NGWMN_Examples.ipynb | 4 +- ...S_WaterData_DailyStatistics_Examples.ipynb | 2 +- ...S_WaterData_DiscreteSamples_Examples.ipynb | 6 +-- ...USGS_WaterData_Introduction_Examples.ipynb | 2 +- demos/USGS_WaterUse_Examples.ipynb | 4 +- demos/WaterData_demo.ipynb | 4 +- demos/hydroshare/USGS_NLDI_Examples.ipynb | 38 +++++++++---------- .../USGS_NWDC_WaterUse_Examples.ipynb | 4 +- .../USGS_WaterData_DailyValues_Examples.ipynb | 2 +- ...WaterData_GroundwaterLevels_Examples.ipynb | 2 +- ...USGS_WaterData_Measurements_Examples.ipynb | 2 +- ...GS_WaterData_ParameterCodes_Examples.ipynb | 4 +- .../USGS_WaterData_Samples_Examples.ipynb | 18 ++++----- .../USGS_WaterData_SiteInfo_Examples.ipynb | 8 ++-- ...SGS_WaterData_SiteInventory_Examples.ipynb | 4 +- .../USGS_WaterData_UnitValues_Examples.ipynb | 2 +- demos/nwqn_data_pull/README.md | 12 +++--- demos/nwqn_data_pull/retrieve_nwqn_samples.py | 2 +- .../retrieve_nwqn_streamflow.py | 2 +- demos/peak_streamflow_trends.ipynb | 8 ++-- tests/architecture_test.py | 4 +- tests/configuration_test.py | 18 ++++----- tests/conftest.py | 2 +- tests/nldi_test.py | 3 +- tests/nwdc_test.py | 4 +- tests/timezones_test.py | 2 +- tests/transport_test.py | 9 +++-- tests/waterdata_chunking_test.py | 12 +++--- tests/waterdata_nearest_test.py | 2 +- tests/waterdata_progress_test.py | 2 +- tests/waterdata_test.py | 4 +- tests/waterdata_utils_test.py | 4 +- 64 files changed, 211 insertions(+), 207 deletions(-) diff --git a/.gitlab/issue_templates/reviewer_checklist.md b/.gitlab/issue_templates/reviewer_checklist.md index a4ed510a4..55b4ec997 100644 --- a/.gitlab/issue_templates/reviewer_checklist.md +++ b/.gitlab/issue_templates/reviewer_checklist.md @@ -19,7 +19,7 @@ Background information for reviewers [here](https://www.usgs.gov/products/softwa - [ ] No proprietary code is included - [ ] No Personally Identifiable Information (PII) is included -- [ ] No other sensitive information such as data base passwords are included +- [ ] No other sensitive information such as database passwords are included ### General checks diff --git a/.gitlab/merge_request_templates/reviewer_checklist.md b/.gitlab/merge_request_templates/reviewer_checklist.md index a4ed510a4..55b4ec997 100644 --- a/.gitlab/merge_request_templates/reviewer_checklist.md +++ b/.gitlab/merge_request_templates/reviewer_checklist.md @@ -19,7 +19,7 @@ Background information for reviewers [here](https://www.usgs.gov/products/softwa - [ ] No proprietary code is included - [ ] No Personally Identifiable Information (PII) is included -- [ ] No other sensitive information such as data base passwords are included +- [ ] No other sensitive information such as database passwords are included ### General checks diff --git a/CONTEXT.md b/CONTEXT.md index 6ff44eb44..1995e05fc 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -48,7 +48,7 @@ the reason is not part of the term. **Plan** — An enumeration of a query's chunks: how many there are, and what each one is. A plan describes how a query divides; it does not execute. Computing a plan -is protocol-specific — a byte budget, a per-location rule — while executing one +is protocol-specific — a byte budget, a per-location rule — whereas executing one is not, which is why the two are kept in separate modules. **Fan-out** — Executing a query's chunks concurrently. Chunking is how the work diff --git a/NEWS.md b/NEWS.md index 76db51f1e..e3b67284a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -34,39 +34,39 @@ **08/30/2026:** **Bug fix:** `waterdata.get_ratings(..., file_path=...)` wrote each rating with no explicit encoding, so on a non-UTF-8 locale an unrepresentable character raised `UnicodeEncodeError` and the rating was silently dropped from the returned dict; ratings are now written as UTF-8, byte for byte with the response. **Bug fix:** that same write blocked the event loop, so on a multi-location request every other in-flight download stalled for its duration; it now runs in a worker thread. -**08/27/2026:** **Bug fix:** `nwis.get_discharge_peaks` and `nwis.get_record(service='peaks')` discarded every peak whose date is only partly known. NWIS zero-fills the unknown part of a historical peak's date -- `YYYY-MM-00` when the day is not known, `YYYY-00-00` when the month is not either (the `Bd` and `Bm` `peak_cd` qualifiers) -- and neither parses as a date, so `preformat_peaks_response` coerced both to `NaT` and then dropped the row along with its discharge value. These are real peaks, and disproportionately a site's largest: site 14105700 lost 20 of its 167 peaks, among them an 1859 flood of 847,000 ft3/s, and 06934500 lost its 1844 peak of 700,000 ft3/s. Such a peak is now kept, with `datetime` left as `NaT`. The date is not completed into one NWIS does not have: a `datetime64` column cannot hold a partial date, so any value there would assert a day the record does not contain. **Behavior change:** peaks queries return more rows than before, and `datetime` may now be `NaT` -- a caller selecting on the datetime index will not see those peaks and should filter on `peak_dt` instead. **Behavior change:** `peak_dt` is no longer removed from the returned frame. It is the only column that holds a censored peak's year, since the peaks response has no `water_yr`, and the only dependable way to tell an unknown day from a known one -- `peak_cd` does not always include the qualifier (22 of 24 censored dates across six sites tested). For peaks with a resolved timestamp alongside explicit `year`/`month`/`day` and a `qualifier` field, use `waterdata.get_peaks()`. +**08/27/2026:** **Bug fix:** `nwis.get_discharge_peaks` and `nwis.get_record(service='peaks')` discarded every peak whose date is only partly known. NWIS zero-fills the unknown part of a historical peak's date -- `YYYY-MM-00` when the day is not known, `YYYY-00-00` when the month is not either (the `Bd` and `Bm` `peak_cd` qualifiers) -- and neither parses as a date, so `preformat_peaks_response` coerced both to `NaT` and then dropped the row along with its discharge value. These are real peaks, and disproportionately a site's largest: site 14105700 lost 20 of its 167 peaks, among them an 1859 flood of 847,000 ft3/s, and 06934500 lost its 1844 peak of 700,000 ft3/s. Such a peak is now kept, with `datetime` left as `NaT`. The date is not completed into one NWIS does not have: a `datetime64` column cannot hold a partial date, so any value there would assert a day the record does not contain. **Behavior change:** peaks queries return more rows than before, and `datetime` may now be `NaT` -- a caller selecting on the datetime index will not see those peaks and should filter on `peak_dt` instead. **Behavior change:** `peak_dt` is no longer removed from the returned frame. It is the only column that holds a censored peak's year, because the peaks response has no `water_yr`, and the only dependable way to tell an unknown day from a known one -- `peak_cd` does not always include the qualifier (22 of 24 censored dates across six sites tested). For peaks with a resolved timestamp alongside explicit `year`/`month`/`day` and a `qualifier` field, use `waterdata.get_peaks()`. **08/26/2026:** **Bug fix:** `nwis.format_response(df, service='peaks')` and `nwis.preformat_peaks_response` raised `KeyError('peak_dt')` on an empty peaks response instead of returning an empty frame. Both are public, and every other service already treated an empty result as a legitimate empty frame rather than an error (issue #171); the peaks branch was missed because it reformats the datetime column before the empty-frame check. Callers can now check `df.empty` rather than catching an exception. A *non-empty* frame with no `peak_dt` column is malformed rather than empty, and still raises. **08/25/2026:** Removed `dataretrieval.ogc.retry`, which only re-exported private helpers. Deprecated `dataretrieval.ogc.interruptions`; import exceptions from `dataretrieval` or `dataretrieval.interruptions` instead. The old path will be removed in a future major release, no earlier than 2027-08-25. -**08/20/2026:** The `state` filter now accepts the five US territories. `dataretrieval.codes.states` held the 50 states and DC, so `ngwmn.get_sites(state='Puerto Rico')`, `waterdata.get_monitoring_locations(state_name='Puerto Rico')` via the unified `state`, and `nwdc.get_wateruse(state='PR')` were refused locally -- while all three services have the data (NGWMN returns 36 Puerto Rico monitoring locations, the Water Data monitoring-locations collection returns Puerto Rico sites, and legacy NWIS lists 1,148 stream sites for `stateCd=PR`). American Samoa, Guam, the Northern Mariana Islands, Puerto Rico and the US Virgin Islands are now in both code tables under their real ANSI/FIPS codes, so every encoding resolves: `'Puerto Rico'`, `'PR'`, `'72'` and `'US:72'` all normalize alike. **Behavior change:** a territory that used to raise `ValueError` now produces a request. A value the table does not hold still fails fast. +**08/20/2026:** The `state` filter now accepts the five U.S. territories. `dataretrieval.codes.states` held the 50 States and the District of Columbia, so `ngwmn.get_sites(state='Puerto Rico')`, `waterdata.get_monitoring_locations(state_name='Puerto Rico')` via the unified `state`, and `nwdc.get_wateruse(state='PR')` were refused locally -- whereas all three services have the data (NGWMN returns 36 Puerto Rico monitoring locations, the Water Data monitoring-locations collection returns Puerto Rico sites, and legacy NWIS lists 1,148 stream sites for `stateCd=PR`). American Samoa, Guam, the Northern Mariana Islands, Puerto Rico, and the U.S. Virgin Islands are now in both code tables under their real ANSI/FIPS codes, so every encoding resolves: `'Puerto Rico'`, `'PR'`, `'72'` and `'US:72'` all normalize alike. **Behavior change:** a territory that used to raise `ValueError` now produces a request. A value the table does not hold still fails fast. **08/20/2026:** Argument checks now share one vocabulary, and every rejection explains how to correct the call. `dataretrieval._validation` owns the message shape for each check that recurs across the adapters -- a value outside a closed vocabulary (`require_one_of`), a missing argument (`require_argument`, `require_together`), a query with no filter at all (`require_any_of`), and arguments that conflict (`require_exactly_one`, `reject_together`) -- so a new check cannot invent its own phrasing, which is how `get_reference_table` came to tell callers who passed a bad `collection` that their *code service* was invalid. Each check takes the caller's own name for the parameter and a remedy for the action it cannot derive, and every check raises `ValueError` -- one class for a bad argument value. **Behavior change:** the text of those rejections moves with them -- `"Unrecognized service: 'x'. get_record serves …"` is now `"Invalid service: 'x'. Valid options are: …"`, and the major-filter and bounding-box rejections in `query_waterdata` / `query_waterservices` are rendered in the shared form. **Behavior change:** the deprecated `nwis` query entry points (`query_waterdata`, `query_waterservices`, `get_record`) now respond to a missing major filter, an incomplete bounding box, or an unknown service with `ValueError` rather than their historic `TypeError` -- `TypeError` remains for a mistyped argument, such as a non-string `sites`. Code catching `TypeError` there, or matching on the old strings, must update. **Bug fix:** a `None` passed as a major filter (`query_waterservices(service='dv', sites=None)`) counted as a filter and reached the service as an empty `sites=`; `None` now means not supplied, and the call is refused with the filters that would have been accepted. **Bug fix:** four messages told callers to do something that raised again or named a parameter their getter does not accept -- `nldi.get_features(comid=…, feature_id=…)` said to supply the missing half of the feature pair, and the corrected call then failed on the conflict with `comid`; `nwdc` responded to `state=[]` by saying exactly one of `state`, `county` or `huc` must be given, when exactly one was; `codes.states.apply_state` offered NGWMN callers a `state_name` / `state_code` parameter no NGWMN getter accepts; and `BaseMetadata` directed NGWMN and NWDC callers to a Water Data getter. **Bug fix:** `nldi.get_features(navigation_mode=…)` without a `data_source` wrote `None` into the URL path and returned an empty frame from a 200; it now raises and names the source to pass. **Behavior change:** `waterdata.get_nearest_continuous` appends `time` and `monitoring_location_id` to an explicit `properties` list rather than using it verbatim -- omitting either collapsed every monitoring location into one row per target, a wrong result rather than an error -- so a caller who passed `properties=['time', 'value']` now gets a third column. **Behavior change:** `nwis.query_waterdata` serves `'peaks'` only; the `'ratings'` URL it used to build was never an NwisWeb program and responded with an HTML error page. `nwis.get_record(service='ratings')` is unaffected -- it routes to `get_ratings`, which is served from a different endpoint. New: `waterdata.get_cql(..., max_rows=N)` caps the total rows a CQL query returns. **08/13/2026:** Warning categories now match their meaning. Two advisories about *upstream data* were emitted as `DeprecationWarning` and as an uncategorized `warnings.warn` respectively; both are now `DataCurrencyWarning` (a `UserWarning` subclass, exported as `dataretrieval.DataCurrencyWarning`). **Behavior change:** WQP's legacy-WQX notice moves from `DeprecationWarning` to `DataCurrencyWarning`. Because `legacy=True` is the default on every WQP getter and the notice is unconditional, a downstream project running `-W error::DeprecationWarning` previously could not call any WQP getter with default arguments; it now can. The cost is visibility — `DeprecationWarning` is silent by default outside `__main__`, so this notice will now print to stderr for library and notebook callers who never saw it. Suppress it with `warnings.filterwarnings("ignore", category=dataretrieval.DataCurrencyWarning)`, or set `legacy=False` where a WQX3.0 profile exists. The NWIS qw-endpoint retirement notice gains the same category (it previously had none, emitted as a bare `UserWarning` that deprecation filters ignored). `DeprecationWarning` now means only that a name in this package is being removed, always with a replacement and, where published, a removal date; those horizons are declared once in `dataretrieval._deprecation.REMOVALS` rather than declared at each call site. -**08/11/2026:** Settings resolve through a layered chain instead of the environment alone, and a *configuration profile* is a named set of settings for **one adapter**. The new `dataretrieval.configuration` module resolves every setting in one order, highest first: a configuration passed to an active `dataretrieval.configure(...)` block, a profile that block selected, the setting's `API_USGS_*` environment variable, the adapter's `[]` table in `~/.dataretrieval/config.toml` (or `DATARETRIEVAL_CONFIG`), the file's top-level keys, the adapter's own built-in preference, then the package default. Precedence applies **per setting**, so a file that sets only `concurrency` leaves an environment `API_USGS_PAT` in effect, and a `[ngwmn]` table still inherits every top-level key it does not name. `configure()` takes configuration objects positionally, at most one per adapter and nothing else: `configure(Configuration(api_key=vault.read("usgs/pat")), WaterdataConfiguration.load("bulk"), NgwmnConfiguration(concurrency=4))`. The adapter a configuration targets is a property of its class, so a caller never restates it, and each adapter owns its class in the module that *reads* those settings (`waterdata.WaterdataConfiguration`, `ngwmn.NgwmnConfiguration`, `nwdc.NwdcConfiguration`, `wqp.WqpConfiguration`, `nldi.NldiConfiguration`, `streamstats.StreamstatsConfiguration`) — an adapter accepts only the settings it reads, so `[streamstats] parallel_chunks = 8` is an error rather than a line that does nothing. The block is delivered through a `ContextVar`, so a credential set inside it cannot leak across threads or asyncio tasks, which is what makes it safe for a server or notebook handling several users' keys and is the thing assigning to `os.environ` could never do (issue #352). The file gains named profiles beside each adapter's default profile: `[waterdata]` is always in effect, `[waterdata.bulk]` only when a caller selects it with `WaterdataConfiguration.load("bulk")`, and a selected profile still inherits the default profile and the package-wide keys per setting. A profile named in code outranks the setting's environment variable — the one place the ladder inverts the environment-above-file rule, because a stale shell export overriding a deliberate selection would look like a bug. An adapter's configuration may also include a `base_url`, which redirects that adapter's requests for the duration of the block — a staging instance, a mirror, a recording proxy — and no other adapter's; for Water Data one value redirects the OGC collections, the Samples database, the statistics service and the STAC catalog together. It is settable in a `configure()` block only: a `base_url` key in the file and an exported `API_USGS_BASE_URL` each raise rather than being read, since a redirect a config file or a shell profile can set is one no reader of the script can see. The API key does not follow a redirect — it is scoped to the single host that accepts it — and is deliberately not per-adapter: it authenticates to the gateway fronting a host, and Water Data and NGWMN share that host, one key, and one hourly quota. `dataretrieval.show_configuration()` reports each setting's effective value and where it came from, naming the profile behind each value (`configure() block [waterdata.bulk]` rather than a bare block), listing the profiles a file defines whether or not this run selected any, and naming any adapter this process has not imported rather than omitting it — without ever printing the key. One parser per setting owns its grammar, so a value means the same thing whichever source wrote it. **Breaking change:** `RetryPolicy.from_env()` is now `RetryPolicy.from_configuration()` and resolves through the whole chain rather than the environment alone. **Behavior change:** a credential-shaped keyword passed to a getter's `**kwargs` query passthrough — Water Data's `**queryables` and every WQP getter's search filters — now raises `TypeError` naming `configure(Configuration(api_key=...))` instead of putting a secret in a URL that clients, proxies and logs retain. The names refused are `api_key=`, `token=`, `x_api_key=`, `password=`, `auth=`, `pat=` and similar names; a filter the server defines is unaffected. **Bug fix:** `API_USGS_STALL_TIMEOUT` was read straight from `os.environ`, so it could not be set by a `configure()` block or the config file and never appeared in `show_configuration()`; it now resolves through the chain like every other setting. Rationale in ADRs 0009, 0010 and 0011; terms in `CONTEXT.md`. +**08/11/2026:** Settings resolve through a layered chain instead of the environment alone, and a *configuration profile* is a named set of settings for **one adapter**. The new `dataretrieval.configuration` module resolves every setting in one order, highest first: a configuration passed to an active `dataretrieval.configure(...)` block, a profile that block selected, the setting's `API_USGS_*` environment variable, the adapter's `[]` table in `~/.dataretrieval/config.toml` (or `DATARETRIEVAL_CONFIG`), the file's top-level keys, the adapter's own built-in preference, then the package default. Precedence applies **per setting**, so a file that sets only `concurrency` leaves an environment `API_USGS_PAT` in effect, and a `[ngwmn]` table still inherits every top-level key it does not name. `configure()` takes configuration objects positionally, at most one per adapter and nothing else: `configure(Configuration(api_key=vault.read("usgs/pat")), WaterdataConfiguration.load("bulk"), NgwmnConfiguration(concurrency=4))`. The adapter a configuration targets is a property of its class, so a caller never restates it, and each adapter owns its class in the module that *reads* those settings (`waterdata.WaterdataConfiguration`, `ngwmn.NgwmnConfiguration`, `nwdc.NwdcConfiguration`, `wqp.WqpConfiguration`, `nldi.NldiConfiguration`, `streamstats.StreamstatsConfiguration`) — an adapter accepts only the settings it reads, so `[streamstats] parallel_chunks = 8` is an error rather than a line that does nothing. The block is delivered through a `ContextVar`, so a credential set inside it cannot leak across threads or asyncio tasks, which is what makes it safe for a server or notebook handling several users' keys and is the thing assigning to `os.environ` could never do (issue #352). The file gains named profiles beside each adapter's default profile: `[waterdata]` is always in effect, `[waterdata.bulk]` only when a caller selects it with `WaterdataConfiguration.load("bulk")`, and a selected profile still inherits the default profile and the package-wide keys per setting. A profile named in code outranks the setting's environment variable — the one place the ladder inverts the environment-above-file rule, because a stale shell export overriding a deliberate selection would look like a bug. An adapter's configuration may also include a `base_url`, which redirects that adapter's requests for the duration of the block — a staging instance, a mirror, a recording proxy — and no other adapter's; for Water Data one value redirects the OGC collections, the Samples database, the statistics service and the STAC catalog together. It is settable in a `configure()` block only: a `base_url` key in the file and an exported `API_USGS_BASE_URL` each raise rather than being read, because a redirect a config file or a shell profile can set is one no reader of the script can see. The API key does not follow a redirect — it is scoped to the single host that accepts it — and is deliberately not per-adapter: it authenticates to the gateway fronting a host, and Water Data and NGWMN share that host, one key, and one hourly quota. `dataretrieval.show_configuration()` reports each setting's effective value and where it came from, naming the profile behind each value (`configure() block [waterdata.bulk]` rather than a bare block), listing the profiles a file defines whether or not this run selected any, and naming any adapter this process has not imported rather than omitting it — without ever printing the key. One parser per setting owns its grammar, so a value means the same thing whichever source wrote it. **Breaking change:** `RetryPolicy.from_env()` is now `RetryPolicy.from_configuration()` and resolves through the whole chain rather than the environment alone. **Behavior change:** a credential-shaped keyword passed to a getter's `**kwargs` query passthrough — Water Data's `**queryables` and every WQP getter's search filters — now raises `TypeError` naming `configure(Configuration(api_key=...))` instead of putting a secret in a URL that clients, proxies and logs retain. The names refused are `api_key=`, `token=`, `x_api_key=`, `password=`, `auth=`, `pat=` and similar names; a filter the server defines is unaffected. **Bug fix:** `API_USGS_STALL_TIMEOUT` was read straight from `os.environ`, so it could not be set by a `configure()` block or the config file and never appeared in `show_configuration()`; it now resolves through the chain like every other setting. Rationale in ADRs 0009, 0010 and 0011; terms in `CONTEXT.md`. **08/11/2026:** `dataretrieval.wateruse` is now `dataretrieval.nwdc`. Every other adapter is named for the service it retrieves from — `ngwmn`, `nldi`, `wqp`, `streamstats`, `nwis` — and this one was named for one subset of what its service offers. The National Water Availability Assessment Data Companion serves ten modeled datasets; the water-use models are five of them, the rest being hydrologic, atmospheric-forcing, and assessment outputs (`GET https://api.water.usgs.gov/nwaa-data/models`). **Deprecation:** `dataretrieval.wateruse` still works and re-exports `dataretrieval.nwdc` unchanged, emitting a `DeprecationWarning` on import; it will be removed on or after 2027-08-11. The alias forwards rather than copies, so `wateruse.get_wateruse is nwdc.get_wateruse` — monkeypatching or identity comparison through either name behaves the same. `import dataretrieval` emits no warning: the package imports `nwdc` directly, so only code naming `wateruse` itself sees the warning. Function and constant names are unchanged (`get_wateruse`, `MODELS`, `WATERUSE_URL`, `DEFAULT_CONCURRENT_REQUESTS`). Terms are defined in `CONTEXT.md`. **08/09/2026:** `waterdata.get_cql` takes `collection` rather than `service`. OGC API - Features (17-069r4) normatively names this value the `collectionId`: Requirement 20 fixes the path template `/collections/{collectionId}/items`, and Requirement 18 defines `collectionId` as each `id` in the collections response -- which is how the package builds the URL, and what the live API returns. *Service* names the API itself (Water Data, NGWMN). **Deprecation:** `service=` still works and resolves to `collection`, with a `DeprecationWarning`; it will be removed on or after 2027-08-09. Positional callers (`get_cql("daily", cql)`) are unaffected. The `WATERDATA_SERVICES` type alias is now `WATERDATA_COLLECTIONS`, with `WATERDATA_SERVICES` retained as a permanent alias for the same object. Terms are defined in `CONTEXT.md`. -**08/09/2026:** Every retrieval path now runs through one executor. `waterdata.get_cql` (via the OGC `fetch_ogc_request`) and `waterdata.get_stats_por` / `get_stats_date_range` (via the Statistics page walk) previously bypassed `dataretrieval.transport.fanout.FanOut` through a private sync bridge, which meant they were the only getters in the package with **no retry**: a mid-page-walk 429 or 503 failed the whole call while every typed getter and Water Use retried through it. Both now run as a one-item fan-out and the 25-line `transport/sync.py` is gone. **Behavior change:** those three getters now retry transient failures (`API_USGS_RETRIES`, default 4) and, when the retries are exhausted, raise the resumable `ServiceInterrupted` / `QuotaExhausted` rather than `ServiceUnavailable` / `RateLimited` / `NetworkError` — all remain `DataRetrievalError`, so broad handlers are unaffected, but narrow handlers around those calls must widen, and `.call.resume()` is now available on the interruption. A failure that retrying cannot fix (bad scheme, a hostname that does not resolve) is still raised as `NetworkError` immediately. The progress line moved with it: `FanOut.resume()` opens the reporter it ticks into, so a driver can no longer run the shared executor and print nothing, and a `.call.resume()` invoked long after the interruption now reports progress instead of printing nothing. Internal reorganization with no public effect: the WQX3 / legacy-WQP CSV datetime shaping moved out of `dataretrieval.utils` (whose docstring reserves it for non-service-specific shaping) into the `dataretrieval._wqx` leaf; the five Water Data endpoint URLs are declared once in `dataretrieval.waterdata.endpoints` instead of being derived in three modules; the OGC queryables document is parsed by `dataretrieval.ogc.schema` so every OGC adapter can return the table, with `waterdata.get_queryables` unchanged as its documented wrapper; and `ogc/engine.py` imports each symbol from the module that defines it. +**08/09/2026:** Every retrieval path now runs through one executor. `waterdata.get_cql` (via the OGC `fetch_ogc_request`) and `waterdata.get_stats_por` / `get_stats_date_range` (via the Statistics page walk) previously bypassed `dataretrieval.transport.fanout.FanOut` through a private sync bridge, which meant they were the only getters in the package with **no retry**: a mid-page-walk 429 or 503 failed the whole call whereas every typed getter and Water Use retried through it. Both now run as a one-item fan-out and the 25-line `transport/sync.py` is gone. **Behavior change:** those three getters now retry transient failures (`API_USGS_RETRIES`, default 4) and, when the retries are exhausted, raise the resumable `ServiceInterrupted` / `QuotaExhausted` rather than `ServiceUnavailable` / `RateLimited` / `NetworkError` — all remain `DataRetrievalError`, so broad handlers are unaffected, but narrow handlers around those calls must widen, and `.call.resume()` is now available on the interruption. A failure that retrying cannot fix (bad scheme, a hostname that does not resolve) is still raised as `NetworkError` immediately. The progress line moved with it: `FanOut.resume()` opens the reporter it ticks into, so a driver can no longer run the shared executor and print nothing, and a `.call.resume()` invoked long after the interruption now reports progress instead of printing nothing. Internal reorganization with no public effect: the WQX3 / legacy-WQP CSV datetime shaping moved out of `dataretrieval.utils` (whose docstring reserves it for non-service-specific shaping) into the `dataretrieval._wqx` leaf; the five Water Data endpoint URLs are declared once in `dataretrieval.waterdata.endpoints` instead of being derived in three modules; the OGC queryables document is parsed by `dataretrieval.ogc.schema` so every OGC adapter can return the table, with `waterdata.get_queryables` unchanged as its documented wrapper; and `ogc/engine.py` imports each symbol from the module that defines it. **08/09/2026:** Internal structure cleanup, no public API change. Validating a server-supplied next-page link is now one policy in `dataretrieval.transport.links` instead of three divergent copies (the OGC engine, the ratings STAC walk, and Water Use). Two of those copies were fixed by the merge: the OGC page walk now resolves a *relative* `next` href against the page it came from (it previously returned the unresolved reference as the pagination cursor) and refuses an unparseable one rather than following it unchecked. Cross-host refusal, credential stripping, and Water Use's host-alias rewrite are unchanged, as is the error type each walk raises. `parse_retry_after` moved to `dataretrieval.exceptions`, next to the `DataRetrievalError.retry_after` field it exists to produce. The one-shot HTTP query path (`query`, `to_str`, and their helpers) moved out of `dataretrieval.utils` into the private `dataretrieval._querying`; `dataretrieval.utils.query` and `dataretrieval.utils.to_str` remain the documented public paths, as `Ambient` and `BaseMetadata` already do. `waterdata` profile validation moved next to the tables it validates in `waterdata.types`, and `nwis.get_dv`/`get_iv` now share one body. -**08/06/2026:** Fan-out execution is now shared across services. Chunking is how a query is divided structurally (a Water Data/NGWMN URL over the byte limit); fan-out is how the pieces are distributed operationally. Only the first is protocol-specific, so the executor moved to `dataretrieval.transport.fanout` (`FanOut`, over a three-member `FanOutPlan` protocol) while chunk planning stays in `dataretrieval.ogc`. Water Use no longer re-implements the fan-out gather and inherits resume, progress reporting, and `API_USGS_CONCURRENT`: a multi-location pull interrupted by a rate limit now raises a resumable interruption whose `.call.resume()` re-issues only the locations that did not finish, instead of discarding every completed one. The interruption taxonomy moved to the `dataretrieval.interruptions` leaf and its base class is now `FanOutInterrupted`; **`ChunkInterrupted` is a permanent alias of the same class**, so `except ChunkInterrupted` keeps working. **Breaking change:** a Water Use fan-out interrupted by a 5xx, 429, or recoverable connection failure now raises `ServiceInterrupted`/`QuotaExhausted` rather than `ServiceUnavailable`/`RateLimited`/`NetworkError` — all remain `DataRetrievalError`, so broad handlers are unaffected, but narrow handlers around a Water Use call must widen. **Breaking change:** `wateruse.MAX_CONCURRENT_REQUESTS` is removed; set `API_USGS_CONCURRENT` (which now outranks any service default) or read `wateruse.DEFAULT_CONCURRENT_REQUESTS`. +**08/06/2026:** Fan-out execution is now shared across services. Chunking is how a query is divided structurally (a Water Data/NGWMN URL over the byte limit); fan-out is how the pieces are distributed operationally. Only the first is protocol-specific, so the executor moved to `dataretrieval.transport.fanout` (`FanOut`, over a three-member `FanOutPlan` protocol) whereas chunk planning stays in `dataretrieval.ogc`. Water Use no longer re-implements the fan-out gather and inherits resume, progress reporting, and `API_USGS_CONCURRENT`: a multi-location pull interrupted by a rate limit now raises a resumable interruption whose `.call.resume()` re-issues only the locations that did not finish, instead of discarding every completed one. The interruption taxonomy moved to the `dataretrieval.interruptions` leaf and its base class is now `FanOutInterrupted`; **`ChunkInterrupted` is a permanent alias of the same class**, so `except ChunkInterrupted` keeps working. **Breaking change:** a Water Use fan-out interrupted by a 5xx, 429, or recoverable connection failure now raises `ServiceInterrupted`/`QuotaExhausted` rather than `ServiceUnavailable`/`RateLimited`/`NetworkError` — all remain `DataRetrievalError`, so broad handlers are unaffected, but narrow handlers around a Water Use call must widen. **Breaking change:** `wateruse.MAX_CONCURRENT_REQUESTS` is removed; set `API_USGS_CONCURRENT` (which now outranks any service default) or read `wateruse.DEFAULT_CONCURRENT_REQUESTS`. **08/03/2026:** Split the Water Data implementation into focused time-series, metadata, measurements, reference, samples, and CQL collection-family modules behind the unchanged `waterdata.api` facade. Active service modules now declare explicit exports; public Water Data imports, signatures, function identities, deprecations, and return contracts are protected by executable contract snapshots. OGC ambient context and schema/queryables execution are separated from request construction, adapter-to-adapter imports are prohibited by architecture tests, and service-specific output shapes are documented rather than forced into one model. -**08/02/2026:** Added an internal API-neutral transport layer for guarded HTTP clients, host-scoped authentication, cursor pagination, bounded retry, response aggregation, progress, and sync-over-async dispatch. Water Use and the non-OGC Statistics API now consume transport directly instead of private OGC execution helpers; WQP, NLDI, and StreamStats opt into bounded transient retry while deprecated NWIS behavior remains unchanged. OGC retains CQL2, request construction, feature shaping, chunk planning, resumable calls, and interruption types, with compatibility imports at previous private paths. Failed pagination and fan-out still raise rather than returning partial data, and no public signatures or return shapes changed. +**08/02/2026:** Added an internal API-neutral transport layer for guarded HTTP clients, host-scoped authentication, cursor pagination, bounded retry, response aggregation, progress, and sync-over-async dispatch. Water Use and the non-OGC Statistics API now consume transport directly instead of private OGC execution helpers; WQP, NLDI, and StreamStats opt into bounded transient retry whereas deprecated NWIS behavior remains unchanged. OGC retains CQL2, request construction, feature shaping, chunk planning, resumable calls, and interruption types, with compatibility imports at previous private paths. Failed pagination and fan-out still raise rather than returning partial data, and no public signatures or return shapes changed. **08/02/2026:** Phase 1 OGC boundary stabilization: the `dataretrieval.ogc` package now exposes a deliberate, small facade (`OgcDialect`, `prepare_request_args`, `get_ogc_data`, `fetch_ogc_request`) that service adapters (NGWMN, Water Data's generic wrapper) import. Internal request-construction helpers moved to a new `ogc.requests` module; the dialect type and endpoint constants are defined in the leaf `ogc.policy` module. `ogc.shaping` no longer depends on `ogc.engine` at all, and the complete runtime OGC import graph is now acyclic. `_default_headers` now accepts a target URL and adds `X-Api-Key` only for `api.waterdata.usgs.gov`; shared sync and async clients also strip the key before following any cross-host redirect, including external rating-asset downloads. `waterdata.utils` no longer bulk-re-exports private OGC symbols, and consumers import implementation helpers from their canonical modules. No public API, return-value, or deprecation changes. **08/02/2026:** Fixed source-distribution and wheel package discovery so the `dataretrieval.ogc` and `dataretrieval.waterdata` subpackages are included in installed artifacts. CI now builds and installs the wheel outside the source checkout before importing the core service modules. Added an architecture baseline, initial decision records, and executable dependency-direction checks for the existing modular-monolith boundaries. -**06/23/2026:** **Breaking change (1.2.0):** the minimum supported Python is now **3.10** (`requires-python = ">=3.10"`). 3.9 support was already effectively broken — the `waterdata` module's dependencies (`anyio`, the test stack) require 3.10+, and the `waterdata` test modules already skipped on <3.10. `anyio` is now declared as a direct dependency (it is imported directly by `waterdata`), and the CI/ruff/mypy targets move to 3.10. Also fully removed the deprecated `variable_info` metadata property: the `NWIS_Metadata` override only warned and returned `None` (it relied on the defunct `get_pmcodes`), and the `BaseMetadata` abstract is gone too since nothing implemented it — accessing `.variable_info` now raises `AttributeError`. `site_info` is unaffected. +**06/23/2026:** **Breaking change (1.2.0):** the minimum supported Python is now **3.10** (`requires-python = ">=3.10"`). 3.9 support was already effectively broken — the `waterdata` module's dependencies (`anyio`, the test stack) require 3.10+, and the `waterdata` test modules already skipped on <3.10. `anyio` is now declared as a direct dependency (it is imported directly by `waterdata`), and the CI/ruff/mypy targets move to 3.10. Also fully removed the deprecated `variable_info` metadata property: the `NWIS_Metadata` override only warned and returned `None` (it relied on the defunct `get_pmcodes`), and the `BaseMetadata` abstract is gone too because nothing implemented it — accessing `.variable_info` now raises `AttributeError`. `site_info` is unaffected. **06/23/2026:** **Breaking change (1.2.0):** removed the `nadp` module and the deprecated `samples` module ahead of the 1.2.0 release. `nadp` was deprecated on 05/01/2026 — NADP is not a USGS data source, so retrieve NADP data directly from https://nadp.slh.wisc.edu/. The `samples.get_usgs_samples` shim (a deprecated forward to the modern getter) is gone; use `waterdata.get_samples()` instead. `import dataretrieval.nadp` / `import dataretrieval.samples` now raise `ModuleNotFoundError`. @@ -94,7 +94,7 @@ **05/01/2026:** The `nadp` module is now deprecated. Calling any of `get_annual_MDN_map`, `get_annual_NTN_map`, or `get_zip` will emit a `DeprecationWarning`. The module is scheduled for removal on or after **2026-11-01**. NADP is not a USGS data source; users should retrieve NADP data directly from https://nadp.slh.wisc.edu/. -**04/23/2026:** Added `waterdata.get_nearest_continuous(targets, ...)` — for each of N target timestamps, fetches the single continuous observation closest to that timestamp in one HTTP round-trip (auto-chunked when the resulting CQL filter is long, via the facility added in #238). The helper is designed for workflows that pair many discrete-measurement timestamps with surrounding instantaneous data, which the OGC `time` parameter can't express since it only accepts one instant or one interval per request. Ties at window midpoints are resolved per a configurable `on_tie` ∈ {`"first"`, `"last"`, `"mean"`}; the default `window="PT7M30S"` matches a 15-minute continuous gauge. +**04/23/2026:** Added `waterdata.get_nearest_continuous(targets, ...)` — for each of N target timestamps, fetches the single continuous observation closest to that timestamp in one HTTP round-trip (auto-chunked when the resulting CQL filter is long, via the facility added in #238). The helper is designed for workflows that pair many discrete-measurement timestamps with surrounding instantaneous data, which the OGC `time` parameter can't express because it only accepts one instant or one interval per request. Ties at window midpoints are resolved per a configurable `on_tie` ∈ {`"first"`, `"last"`, `"mean"`}; the default `window="PT7M30S"` matches a 15-minute continuous gauge. **04/22/2026:** Highlights since the `v1.1.0` release (2025-11-26), which shipped the `waterdata` module: diff --git a/README.md b/README.md index 4a3b2b2d8..3cd0da9de 100644 --- a/README.md +++ b/README.md @@ -216,14 +216,14 @@ logging.basicConfig(level=logging.DEBUG) ### National Ground-Water Monitoring Network (NGWMN) -Access groundwater data aggregated from many state, federal, and local +Access groundwater data aggregated from many State, Federal, and local agencies. NGWMN uses the same OGC engine as the Water Data API, so chunking and pagination behave the same way: ```python from dataretrieval import ngwmn -# Find the groundwater monitoring sites in a state +# Find the groundwater monitoring sites in a State # (state accepts a full name, a postal code like 'WI', or a FIPS code like '55') sites, metadata = ngwmn.get_sites(state="Wisconsin") @@ -240,12 +240,12 @@ print(f"Retrieved {len(water_levels)} water-level observations") ### Water Quality Portal (WQP) -Access water quality data from multiple agencies: +Access water-quality data from multiple agencies: ```python from dataretrieval import wqp -# Find water quality monitoring sites (returns a DataFrame and metadata) +# Find water-quality monitoring sites (returns a DataFrame and metadata) sites, metadata = wqp.what_sites( statecode="US:55", # Wisconsin siteType="Stream", @@ -253,7 +253,7 @@ sites, metadata = wqp.what_sites( print(f"Found {len(sites)} stream monitoring sites in Wisconsin") -# Get water quality results +# Get water-quality results results, metadata = wqp.get_results( siteid="USGS-05427718", characteristicName="Temperature, water" ) diff --git a/dataretrieval/_deprecation.py b/dataretrieval/_deprecation.py index 60bac1792..a075ab987 100644 --- a/dataretrieval/_deprecation.py +++ b/dataretrieval/_deprecation.py @@ -2,8 +2,8 @@ Every deprecation is announced through this module, with a horizon in :data:`REMOVALS` (ADR 0012). A ``DeprecationWarning`` states that a *name in -this package* is being removed, while an advisory that an upstream *dataset* has -stopped being updated belongs under +this package* is being removed, whereas an advisory that an upstream *dataset* +has stopped being updated belongs under :class:`~dataretrieval.exceptions.DataCurrencyWarning` (ADR 0004). """ diff --git a/dataretrieval/codes/__init__.py b/dataretrieval/codes/__init__.py index d14aa9425..df166469c 100644 --- a/dataretrieval/codes/__init__.py +++ b/dataretrieval/codes/__init__.py @@ -1,6 +1,6 @@ """Facade over the ``states`` and ``timezones`` lookup tables. -Re-exports the state code maps, their normalizers (``to_state``, +Re-exports the State code maps, their normalizers (``to_state``, ``apply_state``), and the ``tz`` UTC-offset map. """ diff --git a/dataretrieval/codes/states.py b/dataretrieval/codes/states.py index ea32ccadc..1289588d6 100644 --- a/dataretrieval/codes/states.py +++ b/dataretrieval/codes/states.py @@ -1,12 +1,12 @@ -"""State code lookups and normalization, keyed by full state name. +"""State code lookups and normalization, keyed by full State name. -``state_codes`` maps each state name to its two-letter postal abbreviation +``state_codes`` maps each State name to its two-letter postal abbreviation (e.g. ``"Alabama": "al"``); ``fips_codes`` maps the same names to their two-digit FIPS codes (e.g. ``"Alabama": "01"``). :func:`to_state` normalizes -a state identifier -- a full name, postal code, or two-digit / +a State identifier -- a full name, postal code, or two-digit / ``US:``-prefixed FIPS code (or an iterable of them) -- to a chosen representation. An unrecognized value raises ``ValueError``. Coverage is the -50 states, the District of Columbia, and the five US territories. +50 states, the District of Columbia, and the five U.S. territories. """ from __future__ import annotations @@ -140,7 +140,7 @@ _name_by_postal = {code: name for name, code in state_codes.items()} _name_by_fips = {fips: name for name, fips in fips_codes.items()} _name_by_lower = {name.lower(): name for name in state_codes} -# The table names each state as the Water Data and NGWMN ``state_name`` fields +# The table names each State as the Water Data and NGWMN ``state_name`` fields # do. "US Virgin Islands" is the Census Bureau's name, accepted as input only. _name_by_lower["us virgin islands"] = "Virgin Islands" @@ -148,7 +148,7 @@ def to_state( value: str | int | Iterable[str | int], to: str = "name" ) -> str | list[str]: - """Normalize a US state/territory identifier to a chosen representation. + """Normalize a U.S. state/territory identifier to a chosen representation. ``value`` may be given as a full name (``"Wisconsin"``), a two-letter postal code (``"WI"``), or an ANSI/FIPS code as a string or integer @@ -165,10 +165,10 @@ def to_state( * ``"fips"`` -> two-digit ANSI/FIPS code, e.g. ``"55"`` * ``"fips_us"`` -> ``"US:"`` + FIPS code, e.g. ``"US:55"`` - Coverage is the 50 states, DC, and the five US territories, each under its - real ANSI/FIPS code. A ``value`` that isn't recognized in one of those - encodings raises ``ValueError``, so a typo raises rather than - matching nothing. + Coverage is the 50 States, the District of Columbia, and the five U.S. + territories, each under its real ANSI/FIPS code. A ``value`` that is not + recognized in one of those encodings raises ``ValueError``, so a typo + raises rather than matching nothing. """ if isinstance(value, str): return _to_state_one(value, to) @@ -178,7 +178,7 @@ def to_state( def _to_state_one(value: str | int, to: str) -> str: - """Resolve a single state identifier; see :func:`to_state`.""" + """Resolve a single State identifier; see :func:`to_state`.""" s = str(value).strip() if s[:3].upper() == "US:": # prefixed FIPS, e.g. "US:55" name = _name_by_fips.get(s[3:].strip().zfill(2)) @@ -200,7 +200,7 @@ def _to_state_one(value: str | int, to: str) -> str: def _format_state(name: str, to: str) -> str: - """Render a canonical state *name* in the ``to`` representation.""" + """Render a canonical State *name* in the ``to`` representation.""" require_one_of(to, ("name", "postal", "fips", "fips_us"), name="to") if to == "name": return name diff --git a/dataretrieval/combining.py b/dataretrieval/combining.py index ae0dec2d7..ec346c602 100644 --- a/dataretrieval/combining.py +++ b/dataretrieval/combining.py @@ -6,7 +6,7 @@ chunk execution, service fan-out, and cursor-driven pagination. Separated from :mod:`dataretrieval.ogc.planning` so that module stays -focused on *what* to split, while this module owns *how* to reassemble. +focused on *what* to split, whereas this module owns *how* to reassemble. A top-level leaf rather than part of :mod:`dataretrieval.transport` -- ADR 0006. """ diff --git a/dataretrieval/configuration.py b/dataretrieval/configuration.py index 6437d7895..69da9a6c8 100644 --- a/dataretrieval/configuration.py +++ b/dataretrieval/configuration.py @@ -173,10 +173,11 @@ def configure(*configurations: BaseConfiguration) -> Iterator[None]: Parameters ---------- *configurations : BaseConfiguration - A package-wide :class:`Configuration` and/or one configuration per - adapter, in any order. Each adapter's class is defined in that adapter's - module -- ``WaterdataConfiguration`` in :mod:`dataretrieval.waterdata`, - ``NgwmnConfiguration`` in :mod:`dataretrieval.ngwmn`, and so on. + A package-wide :class:`Configuration`, one configuration per + adapter, or both, in any order. Each adapter's class is defined in that + adapter's module -- ``WaterdataConfiguration`` in + :mod:`dataretrieval.waterdata`, ``NgwmnConfiguration`` in + :mod:`dataretrieval.ngwmn`, and so on. Yields ------ @@ -584,7 +585,7 @@ def progress() -> bool | None: if raw is None: return None # Preserve the legacy environment behavior (any value outside the false - # set enables progress), while new block/file values are validated strictly. + # set enables progress), whereas new block/file values are validated strictly. return _parse_progress(raw, label, strict=source != _ENV) @@ -631,7 +632,7 @@ def base_url(*, adapter: str | None = None, default: str | None = None) -> str | the file and the environment refuse it -- the file at :func:`_accepted_keys` and the environment at :data:`_REFUSED_ENV_VARS`, each with an error naming the block to write instead. A file that redirects a data-retrieval - library to another host is a supply-chain hazard, while a + library to another host is a supply-chain hazard, whereas a ``configure`` block keeps the redirect where a reader of the script sees it (ADR 0011). @@ -650,7 +651,7 @@ def base_url(*, adapter: str | None = None, default: str | None = None) -> str | default : str, optional The service's own base, returned when nothing configured one. Omitted, ``None`` is returned -- which is what :func:`show_configuration` passes, - since it has no service default to supply. + because it has no service default to supply. """ raw, label, _source = _resolve("base_url", adapter) if raw is None: diff --git a/dataretrieval/exceptions.py b/dataretrieval/exceptions.py index b4836726f..6505db88f 100644 --- a/dataretrieval/exceptions.py +++ b/dataretrieval/exceptions.py @@ -155,7 +155,7 @@ class TransientError(HTTPError): This only classifies the condition; it does not itself retry. Whether to retry is up to the calling path: a single-shot request raises it for the caller to handle (e.g. wait :attr:`retry_after` seconds, then re-issue), - while the Water Data chunker retries and resumes automatically. + whereas the Water Data chunker retries and resumes automatically. Parameters ---------- diff --git a/dataretrieval/interruptions.py b/dataretrieval/interruptions.py index a77e5ded0..55de915ce 100644 --- a/dataretrieval/interruptions.py +++ b/dataretrieval/interruptions.py @@ -229,7 +229,7 @@ class ServiceInterrupted(FanOutInterrupted): # ones (notably EAI_AGAIN -- "try again", raised while a resolver is still starting, on # VPN reconnect, or after a laptop resumes from sleep) are deliberately absent: those # are retried. Looked up with ``getattr`` defaults because the EAI_* constants are -# platform-dependent; an unrecognized code stays retryable, since a few seconds on a +# platform-dependent; an unrecognized code stays retryable, because a few seconds on a # retry cost less than a dropped recoverable call. _PERMANENT_DNS_ERRORS = frozenset( code diff --git a/dataretrieval/ngwmn.py b/dataretrieval/ngwmn.py index eb0c3dbf8..176f90c8c 100644 --- a/dataretrieval/ngwmn.py +++ b/dataretrieval/ngwmn.py @@ -59,9 +59,9 @@ # --- state-filter shim ------------------------------------------------------- # NGWMN's collections expose different state queryables: ``sites`` filters on -# the full ``state_name`` (e.g. "Wisconsin"), while ``providers`` filters on the -# two-letter postal ``state`` (uppercase, e.g. "WI"). The state-aware getters -# take a single ``state`` parameter accepting any US-state encoding (full name, +# the full ``state_name`` (e.g. "Wisconsin"), whereas ``providers`` filters on +# the two-letter postal ``state`` (uppercase, e.g. "WI"). The state-aware getters +# take a single ``state`` parameter accepting any U.S.-state encoding (full name, # postal code, or FIPS code); ``_get`` resolves it into the one queryable each # collection accepts via the shared ``codes.states.apply_state``, keyed by # ``_STATE_QUERYABLE`` below. @@ -181,8 +181,8 @@ def get_sites( state : str or iterable of str, optional State filter. Accepts a full name (``"Wisconsin"``), a two-letter postal code (``"WI"``), or a two-digit ANSI/FIPS code (``"55"``). - The 50 states, DC, and the five US territories. Sent as the API's - ``state_name`` field. + The 50 States, the District of Columbia, and the five U.S. territories. + Sent as the API's ``state_name`` field. county_name : str or iterable of str, optional County name filter. aquifer_name, site_type, aquifer_type_code : str or iterable, optional @@ -414,9 +414,9 @@ def get_providers( state : str or iterable of str, optional State filter. Accepts a full name (``"Wisconsin"``), a two-letter postal code (``"WI"``), or a two-digit ANSI/FIPS code (``"55"``). - The 50 states, DC, and the five US territories. Sent as the API's - ``state`` field, as a postal code. Only one - state at a time — a multi-value state filter + The 50 States, the District of Columbia, and the five U.S. territories. + Sent as the API's ``state`` field, as a postal code. Only one + State at a time — a multi-value state filter returns no records for this collection. agency_code : str or iterable of str, optional Provider agency code. diff --git a/dataretrieval/nldi.py b/dataretrieval/nldi.py index 33b92027a..55a54ecf1 100644 --- a/dataretrieval/nldi.py +++ b/dataretrieval/nldi.py @@ -729,7 +729,7 @@ class registers itself later than the rest -- which is why stops. base_url : str, optional Linked-data base to send NLDI requests to, instead of the - service's own (``NLDI_API_BASE_URL``). Every navigation, basin + service's own (``NLDI_API_BASE_URL``). Every navigation, basin, and catalog request is built on it. Code only: the file and the environment refuse it. """ diff --git a/dataretrieval/nwdc.py b/dataretrieval/nwdc.py index 673f0476f..bde4c1d3f 100644 --- a/dataretrieval/nwdc.py +++ b/dataretrieval/nwdc.py @@ -4,7 +4,7 @@ provide national-scale, USGS-modeled water-use data that underlie the `USGS National Water Availability Assessment `_. Estimates are served on a HUC12 (12-digit hydrologic unit) spatial grid and can -be queried for any county, state, or hydrologic unit. This is the modern +be queried for any county, State, or hydrologic unit. This is the modern replacement for the defunct legacy NWIS water-use service. Unlike the main Water Data getters (:mod:`dataretrieval.waterdata`) and NGWMN @@ -118,7 +118,7 @@ def get_wateruse( Availability Assessment Data Companion. The area is given as exactly one of ``state``, ``county``, or ``huc``; results are always returned on a HUC12 grid, in a long (tidy) frame with one row per HUC12 and time step. Large - areas (e.g. a whole region or a populous state) are served across multiple + areas (e.g. a whole region or a populous State) are served across multiple pages; this function follows those pages automatically and concatenates them into one frame. @@ -149,11 +149,11 @@ def get_wateruse( variable; omitting it returns a 400 listing the model's valid variable IDs (raised as a :class:`~dataretrieval.exceptions.DataRetrievalError`). state : string, int, or iterable, optional - One or more US states/territories to query. Each accepts a full name + One or more U.S. States or territories to query. Each accepts a full name (``"Wisconsin"``), a two-letter postal code (``"WI"``), or a two-digit ANSI/FIPS code (``"55"`` or ``55``), matching :func:`dataretrieval.ngwmn.get_sites`. county : string or iterable, optional - One or more five-digit county FIPS codes — state FIPS + county FIPS, + One or more five-digit county FIPS codes — State FIPS + county FIPS, e.g. ``"55025"`` for Dane County, Wisconsin. huc : string or iterable, optional One or more hydrologic unit codes. Each code's level is taken from its @@ -198,7 +198,7 @@ def get_wateruse( ------ ValueError If not exactly one of ``state``, ``county``, or ``huc`` is given, or a - given selector is malformed (an unrecognized state, a county code that + given selector is malformed (an unrecognized State, a county code that is not five digits, or a HUC of invalid length). DataRetrievalError On an HTTP error response, the typed subclass for the status (see @@ -268,7 +268,7 @@ def get_wateruse( # A value may be a single code or a list; ``_as_list`` normalizes both (``state`` # additionally normalizes to the two-letter postal code, and ``to_state`` may # itself return a scalar or list, which ``_as_list`` flattens the same way). -# Since NWDC takes one location per request, a list value fans out — one request +# Because NWDC takes one location per request, a list value fans out — one request # per location (see :func:`_fan_out`). _LOCATION_BUILDERS: dict[str, Callable[[Any], list[str]]] = { "state": lambda v: [f"stateCd:{c}" for c in _as_list(to_state(v, to="postal"))], @@ -481,7 +481,7 @@ class NwdcConfiguration(_Concurrent, _Redirectable, _Retrying, BaseConfiguration base_url : str, optional Endpoint to send NWDC requests to, instead of the service's own (``WATERUSE_URL``). A ``rel="next"`` cursor is then followed only - back to that host, since the service's own host aliases mean + back to that host, because the service's own host aliases mean nothing there. Code only: the file and the environment refuse it. concurrency : int or str, optional Cap on simultaneous sub-requests, or ``"unbounded"``. diff --git a/dataretrieval/ogc/chunking.py b/dataretrieval/ogc/chunking.py index 6a12d6776..821ee4ec2 100644 --- a/dataretrieval/ogc/chunking.py +++ b/dataretrieval/ogc/chunking.py @@ -80,8 +80,8 @@ def parallel_chunks(n: int) -> Iterator[None]: server's ~8 KB URL-byte limit forces — the fewest chunks that fit. That default can split less than a large pull benefits from. Because every chunk paginates, splitting a large result further costs little or no extra quota *as long as each chunk still - spans many pages* — rows-per-chunk far exceeding the page size (ten states pulled as - one request page nearly as many times as ten per-state requests would). When a split + spans many pages* — rows-per-chunk far exceeding the page size (ten States pulled as + one request page nearly as many times as ten per-State requests would). When a split leaves each chunk only a page or two, its partial final page is extra, so finer chunks do add some requests. This context manager lets a caller who knows their pull is large request that finer split. The result is roughly the same pages in more, diff --git a/dataretrieval/ogc/engine.py b/dataretrieval/ogc/engine.py index b4aa891f3..8c9d1202c 100644 --- a/dataretrieval/ogc/engine.py +++ b/dataretrieval/ogc/engine.py @@ -320,7 +320,7 @@ def get_ogc_data( # ``exc.call.resume()`` after a ChunkInterrupted (which never re-enters # this function). ``_finalize_ogc`` is the one place result shape is applied; # it also applies ``max_rows`` to the *combined* frame so the cap is the - # exact total even when the plan chunks or the call is resumed, while + # exact total even when the plan chunks or the call is resumed, whereas # the per-chunk ``row_cap`` bound below only early-stops each chunk's # pagination. finalize = functools.partial( diff --git a/dataretrieval/ogc/planning.py b/dataretrieval/ogc/planning.py index 0f7ae0457..a002fd66a 100644 --- a/dataretrieval/ogc/planning.py +++ b/dataretrieval/ogc/planning.py @@ -98,7 +98,7 @@ def _try_build( """Attempt to construct a request, returning ``None`` on overflow. ``httpx.URL`` enforces a hard 64 KB cap per URL component and raises - ``httpx.InvalidURL`` for anything bigger. Both :func:`_safe_request_bytes` and + ``httpx.InvalidURL`` for anything bigger. Both :func:`_safe_request_bytes` and :class:`ChunkPlan`'s initial-request probe need this build-or-None step, so it is defined here once. diff --git a/dataretrieval/ogc/shaping.py b/dataretrieval/ogc/shaping.py index 419dfeb00..31445a8af 100644 --- a/dataretrieval/ogc/shaping.py +++ b/dataretrieval/ogc/shaping.py @@ -339,7 +339,7 @@ def _sort_rows(df: pd.DataFrame, dialect: OgcDialect) -> pd.DataFrame: Sorting is applied only when the primary (first) sort column is present; any later sort columns also present become secondary keys. This matches the historical Water Data behavior (sort by ``time``, - then ``monitoring_location_id``) while letting other APIs sort by + then ``monitoring_location_id``), whereas other APIs sort by their own columns (e.g. NGWMN's ``sample_time``). Parameters diff --git a/dataretrieval/progress.py b/dataretrieval/progress.py index c64a5e54d..39e34845d 100644 --- a/dataretrieval/progress.py +++ b/dataretrieval/progress.py @@ -19,7 +19,7 @@ (ADR 0006), so every service adapter -- OGC or not -- uses the same reporter. By default the line is shown for interactive use — an interactive terminal or a -Jupyter/IPython kernel, like ``tqdm`` — while redirected logs and CI get no line. +Jupyter/IPython kernel, like ``tqdm`` — whereas redirected logs and CI get no line. ``API_USGS_PROGRESS`` forces it on (``1``/``true``) or off (``0``/``false``). """ @@ -232,7 +232,7 @@ def close(self) -> None: If the query targeted the API-key host and no key is configured (no ``API_USGS_PAT``), append a one-time pointer to API-key registration, - since unauthenticated callers are subject to much lower rate limits. + because unauthenticated callers are subject to much lower rate limits. """ if self._closed: return diff --git a/dataretrieval/streamstats.py b/dataretrieval/streamstats.py index f8c14e2c4..994a56d94 100644 --- a/dataretrieval/streamstats.py +++ b/dataretrieval/streamstats.py @@ -76,7 +76,7 @@ def download_workspace(workspaceID: str, format: str = "") -> httpx.Response: def get_sample_watershed() -> Watershed: - """Get a watershed object for a sample location in NY. + """Get a watershed object for a sample location in New York. Calls :obj:`dataretrieval.streamstats.get_watershed` with the parameters 'NY', -74.524, and 43.939, and returns the resulting watershed object. diff --git a/dataretrieval/transport/fanout.py b/dataretrieval/transport/fanout.py index e135d92e8..5d21d1894 100644 --- a/dataretrieval/transport/fanout.py +++ b/dataretrieval/transport/fanout.py @@ -96,11 +96,11 @@ class FanOutPlan(Protocol[_ChunkCo]): A **plan** is defined in ``CONTEXT.md``. This protocol is that enumeration and nothing more: ``len`` must equal the number of items iteration yields, and iteration - must repeat the same items in the same order, since + must repeat the same items in the same order, because :meth:`FanOut.resume` keys completed work by position. The item type is whatever an adapter's own ``fetch`` accepts -- this executor passes each item through unchanged and never inspects it, so the OGC getters yield - kwargs dicts while Water Use yields ready :class:`httpx.Request` objects. + kwargs dicts whereas Water Use yields ready :class:`httpx.Request` objects. The query's ``canonical_url`` is not part of the plan; it is an argument to :class:`FanOut`. diff --git a/dataretrieval/transport/links.py b/dataretrieval/transport/links.py index 936b161e9..3282486b6 100644 --- a/dataretrieval/transport/links.py +++ b/dataretrieval/transport/links.py @@ -72,8 +72,8 @@ def resolve_next_url( error : type of Exception, optional Exception type to raise. Defaults to :class:`~dataretrieval.exceptions.DataRetrievalError`; the OGC engine - passes ``RuntimeError`` to keep the type it has always raised, since changing - that type would be a released behavior change. + passes ``RuntimeError`` to keep the type it has always raised, because + changing that type would be a released behavior change. Returns ------- diff --git a/dataretrieval/transport/liveness.py b/dataretrieval/transport/liveness.py index 8f2b5faca..d050c7778 100644 --- a/dataretrieval/transport/liveness.py +++ b/dataretrieval/transport/liveness.py @@ -23,7 +23,7 @@ def note_progress() -> None: - """Restart the no-progress budget: data has arrived.""" + """Restart the no-progress budget: data have arrived.""" _last_progress.set(time.monotonic()) @@ -49,7 +49,7 @@ def credit_wait(seconds: float) -> None: The credit never moves the timestamp past the present. A wait longer than the whole budget would otherwise set the timestamp in the *future*, making - :func:`elapsed_since_progress` negative -- and since nothing ever reduces + :func:`elapsed_since_progress` negative -- and because nothing ever reduces it, that one long queue wait would disable the bound for the rest of the call, which is the case the budget exists to bound. """ diff --git a/dataretrieval/waterdata/metadata.py b/dataretrieval/waterdata/metadata.py index 34e519a3f..faa929c3d 100644 --- a/dataretrieval/waterdata/metadata.py +++ b/dataretrieval/waterdata/metadata.py @@ -86,7 +86,7 @@ def get_monitoring_locations( Location information includes the name, identifier, agency responsible for data collection, and the date the location was established. It also includes the type of location, such as stream, lake, or groundwater, and geographic - information such as state, county, latitude and longitude, and hydrologic + information such as State, county, latitude and longitude, and hydrologic unit code (HUC). Parameters @@ -111,11 +111,11 @@ def get_monitoring_locations( For well information this can be a district-assigned local number. district_code : string or iterable of strings, optional The Water Science Centers (WSCs) across the United States use the FIPS - state code as the district code. In some cases, monitoring locations and + State code as the district code. In some cases, monitoring locations and samples may be managed by a water science center that is adjacent to the - state in which the monitoring location actually resides. For example, a + State in which the monitoring location actually resides. For example, a monitoring location may have a district code of 30, which translates to - Montana, but a state code of 56 for Wyoming, because that is where the + Montana, but a State code of 56 for Wyoming, because that is where the monitoring location is actually located. country_code : string or iterable of strings, optional The code for the country in which the monitoring location is located. @@ -134,10 +134,10 @@ def get_monitoring_locations( `_ is available. The only countries with political subdivisions other than the US are Mexico and Canada. The Mexican - states have US state codes ranging from 81-86 and Canadian provinces have - state codes ranging from 90-98. + states have U.S. State codes ranging from 81 to 86 and Canadian provinces have + State codes ranging from 90 to 98. state_name : string or iterable of strings, optional - The name of the state or state equivalent in which the monitoring location + The name of the State or State equivalent in which the monitoring location is located. county_code : string or iterable of strings, optional The code for the county or county equivalent (parish, borough, etc.) in which @@ -157,8 +157,8 @@ def get_monitoring_locations( hydrologic_unit_code : string or iterable of strings, optional A unique hydrologic unit code (HUC) of two to eight digits, based on the four levels of classification in the hydrologic unit system. The United - States is divided and sub-divided into successively smaller hydrologic - units, classified into four levels: regions, sub-regions, accounting + States is divided and subdivided into successively smaller hydrologic + units, classified into four levels: regions, subregions, accounting units, and cataloging units. The hydrologic units are arranged within each other, from the smallest (cataloging units) to the largest (regions). @@ -172,7 +172,7 @@ def get_monitoring_locations( Datum. altitude_accuracy : string or iterable of strings, optional Accuracy of the altitude, in feet. An accuracy of +/- 0.1 foot would be - entered as “.1”. Many altitudes are interpolated from the contours on + entered as ".1". Many altitudes are interpolated from the contours on topographic maps; accuracies determined in this way are generally entered as one-half of the contour interval. altitude_method_code : string or iterable of strings, optional @@ -223,9 +223,9 @@ def get_monitoring_locations( year precision (``"19950812"``, ``"199508"``, ``"2005"``), so the returned column holds these strings as sent. aquifer_code : string or iterable of strings, optional - Local aquifers in the USGS water resources data base are identified by a + Local aquifers in the USGS water resources database are identified by a geohydrologic unit code (a three-digit number related to the age of the - formation, followed by a 4 or 5 character abbreviation for the geologic + formation, followed by a 4- or 5-character abbreviation for the geologic unit or aquifer name). Additional information is available `at this link `_. national_aquifer_code : string or iterable of strings, optional @@ -490,21 +490,21 @@ def get_time_series_metadata( :func:`get_combined_metadata` with ``hydrologic_unit_code`` instead. A unique hydrologic unit code (HUC) of two to eight digits, based on the four levels of classification in the hydrologic unit system. The United - States is divided and sub-divided into successively smaller hydrologic - units, classified into four levels: regions, sub-regions, accounting + States is divided and subdivided into successively smaller hydrologic + units, classified into four levels: regions, subregions, accounting units, and cataloging units. The hydrologic units are arranged within each other, from the smallest (cataloging units) to the largest (regions). state : string or iterable of strings, optional Deprecated, as ``hydrologic_unit_code`` is: v1 does not filter this - collection by state. Use :func:`get_combined_metadata` with ``state`` + collection by State. Use :func:`get_combined_metadata` with ``state`` instead. ``state`` is a dataretrieval argument rather than an API field: it accepts a full name (``"Wisconsin"``), a two-letter postal code (``"WI"``), or a two-digit ANSI/FIPS code (``"55"``) and is sent as ``state_name``. state_name : string or iterable of strings, optional Deprecated, as ``state`` is. Use :func:`get_combined_metadata` with - ``state_name`` instead. The name of the state or state equivalent in + ``state_name`` instead. The name of the State or State equivalent in which the monitoring location is located. last_modified : string, optional The last time a record was refreshed in our database. A refresh may diff --git a/dataretrieval/waterdata/nearest.py b/dataretrieval/waterdata/nearest.py index 074d02cf5..ab745d781 100644 --- a/dataretrieval/waterdata/nearest.py +++ b/dataretrieval/waterdata/nearest.py @@ -167,7 +167,7 @@ def get_nearest_continuous( - ``"first"``: keep the earlier observation. - ``"last"``: keep the later observation. - ``"mean"``: average numeric columns; set the ``time`` column to - the target, since no real observation exists at the midpoint. + the target, because no real observation exists at the midpoint. **kwargs Additional keyword arguments forwarded to ``get_continuous`` (e.g. diff --git a/dataretrieval/waterdata/ratings.py b/dataretrieval/waterdata/ratings.py index ebeb01394..470cc3951 100644 --- a/dataretrieval/waterdata/ratings.py +++ b/dataretrieval/waterdata/ratings.py @@ -95,7 +95,7 @@ def get_ratings( selected. Format: ``[xmin, ymin, xmax, ymax]`` in CRS 4326 (longitude / latitude, west-south-east-north). limit : int, default 10000 - Page size for the STAC ``/search`` request (capped at 10000). + Page size for the STAC ``/search`` request (capped at 10,000). download_and_parse : bool, default ``True`` If ``True``, download every matching RDB file and parse it into a ``DataFrame``. If ``False``, return the raw list of STAC feature diff --git a/dataretrieval/waterdata/reference.py b/dataretrieval/waterdata/reference.py index fc790052f..38aab19cb 100644 --- a/dataretrieval/waterdata/reference.py +++ b/dataretrieval/waterdata/reference.py @@ -47,7 +47,7 @@ def get_reference_table( "time-zone-codes". limit : int, optional The number of features returned in each page. The maximum allowable - limit is 50000; the default (None) requests that maximum. Set a lower + limit is 50,000; the default (None) requests that maximum. Set a lower number if your internet connection is unreliable. query: dictionary, optional A dictionary of extra query parameters to pass to the collection API @@ -56,7 +56,7 @@ def get_reference_table( Cap the total number of rows returned, stopping pagination early instead of downloading the whole table. Useful for previewing large tables in a few requests (e.g. ``hydrologic-unit-codes`` has - ~125k rows). Unlike ``limit`` (the per-page size), this bounds the total + ~125,000 rows). Unlike ``limit`` (the per-page size), this bounds the total result. The default (None) downloads every page. Returns diff --git a/dataretrieval/waterdata/samples.py b/dataretrieval/waterdata/samples.py index 7e70f6a2d..05a943d7f 100644 --- a/dataretrieval/waterdata/samples.py +++ b/dataretrieval/waterdata/samples.py @@ -203,7 +203,8 @@ def get_samples( * organizations - "organization", "count" activity_media_name : string or iterable of strings, optional - Name or code indicating environmental medium in which sample was taken. + Name or code indicating the environmental medium in which a sample was + taken. Call ``get_codes("samplemedia")`` for the valid inputs. Example: "Water". (Samples API: ``activityMediaName``) activity_start_date_lower : string, optional @@ -265,14 +266,14 @@ def get_samples( for the valid inputs. Example: "Well" (Samples API: ``siteTypeName``) usgs_pcode : string or iterable of strings, optional - 5-digit number used in the US Geological Survey computerized - data system, National Water Information System (NWIS), to + A 5-digit number used in the U.S. Geological Survey computerized + data system, the National Water Information System (NWIS), to uniquely identify a specific constituent (the ``parameterCode`` column of ``get_codes("characteristics")``). Example: "00060" (Discharge, cubic feet per second) (Samples API: ``usgsPCode``) hydrologic_unit : string or iterable of strings, optional - Max 12-digit number used to describe a hydrologic unit. + A number of up to 12 digits used to describe a hydrologic unit. Example: "070900020502" (Samples API: ``hydrologicUnit``) monitoring_location_id : string or iterable of strings, optional A monitoring location identifier has two parts: the agency code @@ -300,7 +301,7 @@ def get_samples( identifiers are specific to an organization (e.g. USGS). Example: "ZH003QW03" (Samples API: ``projectIdentifier``) record_identifier_user_supplied : string or iterable of strings, optional - Internal AQS record identifier that returns 1 entry. Only available + Internal AQS record identifier that returns one entry. Only available for the "results" service. (Samples API: ``recordIdentifierUserSupplied``) diff --git a/dataretrieval/waterdata/time_series.py b/dataretrieval/waterdata/time_series.py index 093fd1e28..0bfe688e0 100644 --- a/dataretrieval/waterdata/time_series.py +++ b/dataretrieval/waterdata/time_series.py @@ -53,14 +53,14 @@ def get_daily( """Get daily values: one value per monitoring location, parameter, and day. Throughout much of the history of the USGS, the primary water data available - was daily data collected manually at the monitoring location once each day. + were daily data collected manually at the monitoring location once each day. With improved availability of computer storage and automated transmission of data, the daily data published today are generally a statistical summary or metric of the continuous data collected each day, such as the daily mean, minimum, or maximum value. Daily data are automatically calculated from the continuous data of the same parameter code and are described by parameter - code and a statistic code. These data have also been referred to as “daily - values” or “DV”. + code and a statistic code. These data have also been referred to as "daily + values" or "DV". Parameters ---------- @@ -722,14 +722,14 @@ def get_latest_daily( Daily data provide one data value to represent water conditions for the day. Throughout much of the history of the USGS, the primary water data available - was daily data collected manually at the monitoring location once each day. + were daily data collected manually at the monitoring location once each day. With improved availability of computer storage and automated transmission of data, the daily data published today are generally a statistical summary or metric of the continuous data collected each day, such as the daily mean, minimum, or maximum value. Daily data are automatically calculated from the continuous data of the same parameter code and are described by parameter - code and a statistic code. These data have also been referred to as “daily - values” or “DV”. + code and a statistic code. These data have also been referred to as "daily + values" or "DV". Parameters ---------- @@ -958,10 +958,10 @@ def get_stats_por( field: it is sent as the API's ``state_code``, in its "US:XX" format. state_code: string, optional State query parameter. Takes the format "US:XX", where XX is - the two-digit state code. API defaults to "US:42" (Pennsylvania). + the two-digit State code. API defaults to "US:42" (Pennsylvania). county_code: string, optional County query parameter. Takes the format "US:XX:YYY", where XX is - the two-digit state code and YYY is the three-digit county code. + the two-digit State code and YYY is the three-digit county code. API defaults to "US:42:103" (Pennsylvania, Pike County). start_date: string or datetime, optional Start day for the query in the month-day format (MM-DD). @@ -1099,10 +1099,10 @@ def get_stats_date_range( field: it is sent as the API's ``state_code``, in its "US:XX" format. state_code: string, optional State query parameter. Takes the format "US:XX", where XX is - the two-digit state code. API defaults to "US:42" (Pennsylvania). + the two-digit State code. API defaults to "US:42" (Pennsylvania). county_code: string, optional County query parameter. Takes the format "US:XX:YYY", where XX is - the two-digit state code and YYY is the three-digit county code. + the two-digit State code and YYY is the three-digit county code. API defaults to "US:42:103" (Pennsylvania, Pike County). start_date: string or datetime, optional Start date for the query in the year-month-day format diff --git a/dataretrieval/wqp.py b/dataretrieval/wqp.py index fedbba400..de231f056 100644 --- a/dataretrieval/wqp.py +++ b/dataretrieval/wqp.py @@ -191,9 +191,9 @@ def get_results( Monitoring location identifier: an agency code, a hyphen, and an identification number (Example: "USGS-05586100"). statecode : string - US state FIPS code (Example: Illinois is "US:17"). + U.S. State FIPS code (Example: Illinois is "US:17"). countycode : string - US county FIPS code. + U.S. county FIPS code. huc : string or iterable of strings Eight-digit hydrologic unit (HUC). bBox : string diff --git a/demos/R Python Vignette equivalents.ipynb b/demos/R Python Vignette equivalents.ipynb index c54bd73ed..cb88b2297 100644 --- a/demos/R Python Vignette equivalents.ipynb +++ b/demos/R Python Vignette equivalents.ipynb @@ -219,7 +219,7 @@ "# drainAreaMin=\"50\", statCd=\"00003\")\n", "#\n", "# The Water Data API serves daily values per monitoring location. To assemble a\n", - "# state-wide set, first find the locations (optionally filtering by drainage\n", + "# statewide set, first find the locations (optionally filtering by drainage\n", "# area) with waterdata.get_monitoring_locations(state_name=\"Wisconsin\", ...),\n", "# then pass their ids to waterdata.get_daily(parameter_code=\"00060\",\n", "# statistic_id=\"00003\")." @@ -307,7 +307,7 @@ " header # the response headers\n", "```\n", "\n", - "Note: USGS *water use* data is retrieved through a separate service, `nwdc.get_wateruse()`, which draws on the USGS National Water Availability Assessment Data Companion (NWDC). See the water-use example notebook for details." + "Note: USGS *water use* data are retrieved through a separate service, `nwdc.get_wateruse()`, which draws on the USGS National Water Availability Assessment Data Companion (NWDC). See the water-use example notebook for details." ] } ], diff --git a/demos/USGS_NGWMN_Examples.ipynb b/demos/USGS_NGWMN_Examples.ipynb index 98e6e2275..d787abc19 100644 --- a/demos/USGS_NGWMN_Examples.ipynb +++ b/demos/USGS_NGWMN_Examples.ipynb @@ -8,7 +8,7 @@ "# National Ground-Water Monitoring Network (NGWMN)\n", "\n", "The [National Ground-Water Monitoring Network](https://cida.usgs.gov/ngwmn/) (NGWMN)\n", - "brings groundwater data from many state, federal, and local agencies into a single\n", + "brings groundwater data from many State, Federal, and local agencies into a single\n", "location. USGS exposes it through a dedicated OGC API\n", "(`https://api.waterdata.usgs.gov/ngwmn/ogcapi`), which `dataretrieval` wraps in the\n", "`dataretrieval.ngwmn` module — a sibling of `dataretrieval.waterdata` built on the\n", @@ -46,7 +46,7 @@ "source": [ "## Providers\n", "\n", - "List the organizations contributing data, optionally filtered by state." + "List the organizations contributing data, optionally filtered by State." ] }, { diff --git a/demos/USGS_WaterData_DailyStatistics_Examples.ipynb b/demos/USGS_WaterData_DailyStatistics_Examples.ipynb index c1aacc9da..bcfed8e18 100644 --- a/demos/USGS_WaterData_DailyStatistics_Examples.ipynb +++ b/demos/USGS_WaterData_DailyStatistics_Examples.ipynb @@ -132,7 +132,7 @@ " start_date=\"01-01\",\n", " end_date=\"12-31\",\n", ")\n", - "# The January 1 day-of-year percentiles (used on the WDFN state pages):\n", + "# The January 1 day-of-year percentiles (used on the WDFN State pages):\n", "jan1 = full_por_percentiles[\n", " (full_por_percentiles[\"time_of_year\"] == \"01-01\")\n", " & (full_por_percentiles[\"time_of_year_type\"] == \"day_of_year\")\n", diff --git a/demos/USGS_WaterData_DiscreteSamples_Examples.ipynb b/demos/USGS_WaterData_DiscreteSamples_Examples.ipynb index fd78f7956..2c379eec0 100644 --- a/demos/USGS_WaterData_DiscreteSamples_Examples.ipynb +++ b/demos/USGS_WaterData_DiscreteSamples_Examples.ipynb @@ -268,7 +268,7 @@ "source": [ "### County FIPS\n", "\n", - "County FIPS codes take the form `US:SS:CCC`. Wisconsin's state code is available\n", + "County FIPS codes take the form `US:SS:CCC`. Wisconsin's State code is available\n", "from `dataretrieval.codes`, and Dane County's full FIPS is `US:55:025`." ] }, @@ -299,7 +299,7 @@ "source": [ "### State FIPS\n", "\n", - "State FIPS codes take the form `US:SS`. A whole-state query can return a lot of\n", + "State FIPS codes take the form `US:SS`. A whole-State query can return a lot of\n", "sites, so here we also constrain the activity start date to October–November 2024\n", "(see *Additional query parameters* below):" ] @@ -457,7 +457,7 @@ "## Data discovery\n", "\n", "Combining a geographic filter with site-type and characteristic filters lets you\n", - "zero in on candidate sites. For example, lakes in Dane County, WI that measured\n", + "zero in on candidate sites. For example, lakes in Dane County, Wisconsin, that measured\n", "our phosphorus characteristic:" ] }, diff --git a/demos/USGS_WaterData_Introduction_Examples.ipynb b/demos/USGS_WaterData_Introduction_Examples.ipynb index c31866b69..4de851a19 100644 --- a/demos/USGS_WaterData_Introduction_Examples.ipynb +++ b/demos/USGS_WaterData_Introduction_Examples.ipynb @@ -238,7 +238,7 @@ "(`get_monitoring_locations`) with the time-series metadata\n", "(`get_time_series_metadata`), returning one row per available time series with\n", "both the site attributes and the series' period of record — a convenient \"what\n", - "data is available\" view." + "data are available\" view." ] }, { diff --git a/demos/USGS_WaterUse_Examples.ipynb b/demos/USGS_WaterUse_Examples.ipynb index 418457d62..c86808500 100644 --- a/demos/USGS_WaterUse_Examples.ipynb +++ b/demos/USGS_WaterUse_Examples.ipynb @@ -10,7 +10,7 @@ "(NWDC)](https://water.usgs.gov/nwaa-data/) serves national-scale, *modeled*\n", "water-use estimates that underlie the USGS National Water Availability\n", "Assessment. Estimates are produced on a **HUC12** (12-digit hydrologic unit)\n", - "grid and can be queried for any county, state, or hydrologic unit. They are\n", + "grid and can be queried for any county, State, or hydrologic unit. They are\n", "the modern replacement for the retired legacy NWIS water-use service.\n", "\n", "`dataretrieval` exposes the service through a single function,\n", @@ -33,7 +33,7 @@ "> *Where does Wisconsin's public water supply come from — groundwater or\n", "> surface water — and when through the year is demand highest?*\n", "\n", - "Answering it is a typical water-use workflow: pull a state's monthly\n", + "Answering it is a typical water-use workflow: pull a State's monthly\n", "withdrawals split by source, aggregate the HUC12 grid to a statewide time\n", "series, and look at the seasonal cycle and the groundwater/surface-water\n", "split." diff --git a/demos/WaterData_demo.ipynb b/demos/WaterData_demo.ipynb index 3d76a5cfb..c113d7294 100644 --- a/demos/WaterData_demo.ipynb +++ b/demos/WaterData_demo.ipynb @@ -166,7 +166,7 @@ "\n", "### Timeseries metadata\n", "\n", - "Now that we know which parameter code we want to use, let's find all the stream monitoring locations that have recent discharge data and at least 10 years of daily values in the state of Nebraska. We will use the `waterdata.get_time_series_metadata()` function to suss out which sites fit the bill. This function will return a row for each *timeseries* that matches our inputs. It doesn't contain the daily discharge values themselves, just information *about* that timeseries." + "Now that we know which parameter code we want to use, let's find all the stream monitoring locations that have recent discharge data and at least 10 years of daily values in the State of Nebraska. We will use the `waterdata.get_time_series_metadata()` function to suss out which sites fit the bill. This function will return a row for each *timeseries* that matches our inputs. It doesn't contain the daily discharge values themselves, just information *about* that timeseries." ] }, { @@ -402,7 +402,7 @@ "metadata": {}, "source": [ "### Daily and continuous values datasets\n", - "While the \"latest\" functions might be helpful for \"realtime\" or \"current\" dashboards or reports, many users desire to work with a complete timeseries of daily summary (min, max, mean) or instantaneous values for their analyses. For these workflows, `waterdata.get_daily()` and `waterdata.get_continuous()` are helpful.\n", + "Although the \"latest\" functions might be helpful for \"realtime\" or \"current\" dashboards or reports, many users desire to work with a complete timeseries of daily summary (min, max, mean) or instantaneous values for their analyses. For these workflows, `waterdata.get_daily()` and `waterdata.get_continuous()` are helpful.\n", "\n", "Using our current example, let's say that you want to compare daily and instantaneous discharge values for monitoring locations along the Missouri River in Nebraska." ] diff --git a/demos/hydroshare/USGS_NLDI_Examples.ipynb b/demos/hydroshare/USGS_NLDI_Examples.ipynb index 6d7869c8c..9a2738611 100644 --- a/demos/hydroshare/USGS_NLDI_Examples.ipynb +++ b/demos/hydroshare/USGS_NLDI_Examples.ipynb @@ -7,7 +7,7 @@ "source": [ "# USGS dataretrieval Python Package NLDI Data Access Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to retrieve data from the United States Geological Survey (USGS) Hydro Network-Linked Data Index (NLDI). The dataretrieval package provides a collection of functions to get data from the USGS Hydro Network-Linked Data Index (NLDI). For more information about NLDI visit the [USGS website](https://labs.waterdata.usgs.gov/docs/nldi/about-nldi/index.html) describing NLDI or [this blog post](https://waterdata.usgs.gov/blog/nldi-intro/) that covers basic features of the NLDI.\n", + "This notebook provides examples of using the Python dataretrieval package to retrieve data from the United States Geological Survey (USGS) Hydro Network-Linked Data Index (NLDI). The dataretrieval package provides a collection of functions to get data from the USGS Hydro Network-Linked Data Index (NLDI). For more information about NLDI visit the [USGS website](https://labs.waterdata.usgs.gov/docs/nldi/about-nldi/index.html) describing NLDI or [this blog post](https://waterdata.usgs.gov/blog/nldi-intro/) that covers basic features of the NLDI.\n", "\n", "From the [NLDI API documentation](https://labs.waterdata.usgs.gov/api/nldi/swagger-ui/index.html): The NLDI is a search service that takes a watershed outlet identifier as a starting point, a navigation mode to perform, and the type of data desired in response to the request. It can provide geospatial representations of the navigation or linked data sources found along the navigation. It also has the ability to return landscape characteristics for the catchment the watershed outlet is contained in or the total upstream basin." ] @@ -19,7 +19,7 @@ "source": [ "### Install the Package\n", "\n", - "Use the following code to install the package if it doesn't exist already within your Jupyter Python environment. Note the `nldi` option in the `dataretrieval` package installation. The default `dataretrieval` package installation does not support NLDI data access. You must run the dataretrieval install with the `nldi` option to ensure that you have the necessary capabilities. If you are running this notebook in the CUAHSI JuypyterHub server linked to HydroShare, you will want to run the following pip install command. The base `dataretrieval` package is already installed in the CUAHSI JupyterHub Python environment, but it does not include the NLDI option." + "Use the following code to install the package if it doesn't exist already within your Jupyter Python environment. Note the `nldi` option in the `dataretrieval` package installation. The default `dataretrieval` package installation does not support NLDI data access. You must run the dataretrieval install with the `nldi` option to ensure that you have the necessary capabilities. If you are running this notebook in the CUAHSI JupyterHub server linked to HydroShare, you will want to run the following pip install command. The base `dataretrieval` package is already installed in the CUAHSI JupyterHub Python environment, but it does not include the NLDI option." ] }, { @@ -81,7 +81,7 @@ "* **feature_id** (string): The identifier of the NLDI feature.\n", "* **simplified** (boolean): If True, the data will be returned with simplified polygons. If False, the data will be returned as a single polygon (default is False).\n", "* **split_catchment** (boolean): If True, the data will be returned with split catchment polygons. If False, the data will be returned as a single polygon (default is False) NOTE: Setting this to True may result in an error due to a known issue with NLDI API.\n", - "* **as_json** (boolean): If True, the data will be returned as a python dictionary. If False, the data will be returned as a geopandas dataframe (default is False).\n" + "* **as_json** (boolean): If True, the data will be returned as a Python dictionary. If False, the data will be returned as a geopandas dataframe (default is False).\n" ] }, { @@ -90,7 +90,7 @@ "metadata": {}, "source": [ "#### Example 1: Get the upstream basin for a single feature from a single source.\n", - "In this example, we will retrieve the boundary for the upstream basin for a single monitoring site feature. For the monitoring site feature, we will use a USGS water quality monitoring station. The feature source is the Water Quality Portal (WQP), and the identifier of the feature is the USGS water quality monitoring site identifer prepended with the agency code for USGS (USGS-01031500). You can use the identifiers for any monitoring station indexed by the NLDI to retrieve its upstream watershed boundary." + "In this example, we will retrieve the boundary for the upstream basin for a single monitoring site feature. For the monitoring site feature, we will use a USGS water-quality monitoring station. The feature source is the Water Quality Portal (WQP), and the identifier of the feature is the USGS water-quality monitoring site identifier prepended with the agency code for USGS (USGS-01031500). You can use the identifiers for any monitoring station indexed by the NLDI to retrieve its upstream watershed boundary." ] }, { @@ -197,7 +197,7 @@ "\n", "### Examples for the `get_flowlines()` function:\n", "\n", - "The following examples show how to use the `get_flowlines()` function from the dataretrieval package to get flowline data from the USGS NLDI. Flowlines can be traced upstream or downstream from any indexed feature (e.g., a USGS monitoring location), and the result can include mainstem only or tributaries. Flowlines are returned for the specified navigation in WGS84 latitude/longitude coordinats in GeoJSON format.\n", + "The following examples show how to use the `get_flowlines()` function from the dataretrieval package to get flowline data from the USGS NLDI. Flowlines can be traced upstream or downstream from any indexed feature (e.g., a USGS monitoring location), and the result can include mainstem only or tributaries. Flowlines are returned for the specified navigation in WGS84 latitude/longitude coordinates in GeoJSON format.\n", "\n", "The following arguments are supported:\n", "\n", @@ -206,7 +206,7 @@ "* **feature_id** (string): The identifier of the NLDI feature.\n", "* **comid** (integer): COMID (required if feature_resource is not specified).\n", "* **distance** (integer): Distance in kilometers (default is 5). This distance parameter dictates the distance to navigate.\n", - "* **as_json** (boolean): If True, the data will be returned as a python dictionary. If False, the data will be returned as a geopandas dataframe (default is False)." + "* **as_json** (boolean): If True, the data will be returned as a Python dictionary. If False, the data will be returned as a geopandas dataframe (default is False)." ] }, { @@ -215,7 +215,7 @@ "metadata": {}, "source": [ "#### Example 1: Get the flowline data using feature_source and feature_id\n", - "Get the flowline data tracing upstream on the mainstem from a USGS water quality monitoring site with the result returned as a geopandas dataframe. In this example, we will trace upstream including tributaries and include the distance argument with a distance that is sufficiently large to retrieve all of the flowlines upstream of the monitoring station." + "Get the flowline data tracing upstream on the mainstem from a USGS water-quality monitoring site with the result returned as a geopandas dataframe. In this example, we will trace upstream including tributaries and include the distance argument with a distance that is sufficiently large to retrieve all of the flowlines upstream of the monitoring station." ] }, { @@ -304,8 +304,8 @@ "id": "21", "metadata": {}, "source": [ - "#### Example 2: Get flowline data using a NHDPlus COMID\n", - "In some cases, you may wish to get flowline data associated with a NHDPlus COMID rather than flowlines associated with a monitoring station. The following shows how to get flowline data for a COMID as a geopandas dataframe." + "#### Example 2: Get flowline data using an NHDPlus COMID\n", + "In some cases, you may wish to get flowline data associated with an NHDPlus COMID rather than flowlines associated with a monitoring station. The following shows how to get flowline data for a COMID as a geopandas dataframe." ] }, { @@ -349,7 +349,7 @@ "\n", "### Examples for the `get_features()` function:\n", "\n", - "The following examples show how to use the `get_features()` function from the dataretrieval package to get features data from the USGS NLDI. The `get_features()` function returns all features found along the specified navigation as points in WGS84 latitude/longitude endoced as GeoJSON.\n", + "The following examples show how to use the `get_features()` function from the dataretrieval package to get features data from the USGS NLDI. The `get_features()` function returns all features found along the specified navigation as points in WGS84 latitude/longitude encoded as GeoJSON.\n", "\n", "The following arguments are supported:\n", "\n", @@ -361,7 +361,7 @@ "* **distance** (integer): Distance in kilometers (default is 50). This distance parameter dictates the distance to navigate.\n", "* **lat** (float): Latitude (required if feature for a specific location is specified).\n", "* **long** (float): Longitude (required if feature for a specific location is specified).\n", - "* **as_json** (boolean): If True, the data will be returned as a python dictionary. If False, the data will be returned as a geopandas dataframe (default is False)." + "* **as_json** (boolean): If True, the data will be returned as a Python dictionary. If False, the data will be returned as a geopandas dataframe (default is False)." ] }, { @@ -381,7 +381,7 @@ "* \"WQP\" - Water Quality Portal\n", "* \"comid\" - NHDPlus comid\n", "\n", - "There are a few others - for a complete list, consult the getDataSources endpoint of the NLDI API. For this example, we will trace upstream along the mainstem and find any NWIS surface water sites located along the mainstem of the river." + "There are a few others - for a complete list, consult the getDataSources endpoint of the NLDI API. For this example, we will trace upstream along the mainstem and find any NWIS surface-water sites located along the mainstem of the river." ] }, { @@ -452,7 +452,7 @@ "id": "30", "metadata": {}, "source": [ - "Rather than using a water quality monitoring station as the orgin, you can also use a NHDPlus COMID as the origin for the trace. The code below does the same thing as the code above except it uses a COMID as the origin for the navigation. " + "Rather than using a water-quality monitoring station as the origin, you can also use an NHDPlus COMID as the origin for the trace. The code below does the same thing as the code above except it uses a COMID as the origin for the navigation. " ] }, { @@ -472,7 +472,7 @@ "metadata": {}, "source": [ "#### Example 2: Get information about indexed features\n", - "Sometimes you may want to get information about indexed features without using any sort of navigation path. In this case, you can use `get_features()` without specifying a navigation_mode. The following code returns the feature information for a water quality monitoring station from the Water Quality Portal." + "Sometimes you may want to get information about indexed features without using any sort of navigation path. In this case, you can use `get_features()` without specifying a navigation_mode. The following code returns the feature information for a water-quality monitoring station from the Water Quality Portal." ] }, { @@ -515,7 +515,7 @@ "\n", "### Examples for the `search()` function:\n", "\n", - "The following examples show how to use the `search()` function from the dataretrieval package to get data (basins, flowlines, and features) from the USGS NLDI. You can use the `search()` function instead of the `get_basin()`, `get_flowlines()`, and `get_features()` functions described above. The search function returns data as a python dictionary. \n", + "The following examples show how to use the `search()` function from the dataretrieval package to get data (basins, flowlines, and features) from the USGS NLDI. You can use the `search()` function instead of the `get_basin()`, `get_flowlines()`, and `get_features()` functions described above. The search function returns data as a Python dictionary. \n", "\n", "The following arguments are supported:\n", "\n", @@ -535,8 +535,8 @@ "id": "37", "metadata": {}, "source": [ - "#### Example 1: Get the upstream basin for an indexed water quality monitoring station\n", - "Instead of using `get_basin()`, the `search()` function can be used to retrieve the upstream contributing area for a water quality station from the Water Quality Portal." + "#### Example 1: Get the upstream basin for an indexed water-quality monitoring station\n", + "Instead of using `get_basin()`, the `search()` function can be used to retrieve the upstream contributing area for a water-quality station from the Water Quality Portal." ] }, { @@ -568,7 +568,7 @@ "metadata": {}, "source": [ "#### Example 2: Get flowlines data for a specified feature source\n", - "Instead of using `get_flowlines()`, the `search()` function can be used to retrieve the flowlines traced upstream or downstream from a feature. In this case, we can get the flowlines upstream along the mainstem for the water quality station in the last example." + "Instead of using `get_flowlines()`, the `search()` function can be used to retrieve the flowlines traced upstream or downstream from a feature. In this case, we can get the flowlines upstream along the mainstem for the water-quality station in the last example." ] }, { @@ -593,7 +593,7 @@ "metadata": {}, "source": [ "#### Example 3: Get all features along a specified navigation path\n", - "Likewise, instead of using `get_features()`, the `search()` function can be used to retrieve all of the indexed features from a particular data source along a particular navigation path - in this case tracing upstream along the mainstem from the same water quality station in the previous examples." + "Likewise, instead of using `get_features()`, the `search()` function can be used to retrieve all of the indexed features from a particular data source along a particular navigation path - in this case tracing upstream along the mainstem from the same water-quality station in the previous examples." ] }, { diff --git a/demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb b/demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb index a5d5ea5ee..0a2e6c0f8 100644 --- a/demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb +++ b/demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb @@ -77,9 +77,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Example 1: Retrieve public-supply withdrawals for a state\n", + "#### Example 1: Retrieve public-supply withdrawals for a State\n", "\n", - "Request total public-supply withdrawals for every HUC12 in Kansas, as annual calendar-year values. Because a state spans many HUC12s, the service returns the result across several pages; `get_wateruse()` follows the pagination links and stitches the pages into one frame." + "Request total public-supply withdrawals for every HUC12 in Kansas, as annual calendar-year values. Because a State spans many HUC12s, the service returns the result across several pages; `get_wateruse()` follows the pagination links and stitches the pages into one frame." ] }, { diff --git a/demos/hydroshare/USGS_WaterData_DailyValues_Examples.ipynb b/demos/hydroshare/USGS_WaterData_DailyValues_Examples.ipynb index 498dc9310..5170239da 100644 --- a/demos/hydroshare/USGS_WaterData_DailyValues_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_DailyValues_Examples.ipynb @@ -6,7 +6,7 @@ "source": [ "# USGS dataretrieval Python Package `get_daily()` Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to retrieve daily streamflow data for a United States Geological Survey (USGS) monitoring location. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water quality data." + "This notebook provides examples of using the Python dataretrieval package to retrieve daily streamflow data for a United States Geological Survey (USGS) monitoring location. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water-quality data." ] }, { diff --git a/demos/hydroshare/USGS_WaterData_GroundwaterLevels_Examples.ipynb b/demos/hydroshare/USGS_WaterData_GroundwaterLevels_Examples.ipynb index 3f12c7f13..a406c08f9 100644 --- a/demos/hydroshare/USGS_WaterData_GroundwaterLevels_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_GroundwaterLevels_Examples.ipynb @@ -6,7 +6,7 @@ "source": [ "# USGS dataretrieval Python Package Groundwater-Level `get_field_measurements()` Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to retrieve groundwater level field measurements for a United States Geological Survey (USGS) monitoring location. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water quality data." + "This notebook provides examples of using the Python dataretrieval package to retrieve groundwater level field measurements for a United States Geological Survey (USGS) monitoring location. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water-quality data." ] }, { diff --git a/demos/hydroshare/USGS_WaterData_Measurements_Examples.ipynb b/demos/hydroshare/USGS_WaterData_Measurements_Examples.ipynb index 863b7f19b..ecbda3891 100644 --- a/demos/hydroshare/USGS_WaterData_Measurements_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_Measurements_Examples.ipynb @@ -6,7 +6,7 @@ "source": [ "# USGS dataretrieval Python Package Surface-Water `get_field_measurements()` Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to retrieve surface water field measurement data for a United States Geological Survey (USGS) monitoring location. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water quality data." + "This notebook provides examples of using the Python dataretrieval package to retrieve surface water field measurement data for a United States Geological Survey (USGS) monitoring location. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water-quality data." ] }, { diff --git a/demos/hydroshare/USGS_WaterData_ParameterCodes_Examples.ipynb b/demos/hydroshare/USGS_WaterData_ParameterCodes_Examples.ipynb index 5845f8423..81132143f 100644 --- a/demos/hydroshare/USGS_WaterData_ParameterCodes_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_ParameterCodes_Examples.ipynb @@ -6,7 +6,7 @@ "source": [ "# USGS dataretrieval Python Package `get_reference_table()` Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to retrieve information about USGS parameter codes from the USGS Water Data API. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water quality data, including the United States Environmental Protection Agency (USEPA).\n", + "This notebook provides examples of using the Python dataretrieval package to retrieve information about USGS parameter codes from the USGS Water Data API. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water-quality data, including the United States Environmental Protection Agency (USEPA).\n", "\n", "For more information about USGS parameter codes, see:\n", "https://help.waterdata.usgs.gov/codes-and-parameters/parameters" @@ -86,7 +86,7 @@ "source": [ "### Interpreting the Result\n", "\n", - "Calling `get_reference_table()` returns a tuple containing a pandas data frame and an associated metadata object. The data frame holds the requested parameter code information, while the metadata object includes the request URL and the query time.\n", + "Calling `get_reference_table()` returns a tuple containing a pandas data frame and an associated metadata object. The data frame holds the requested parameter code information, whereas the metadata object includes the request URL and the query time.\n", "\n", "Once you've got the data frame, you can explore the data." ] diff --git a/demos/hydroshare/USGS_WaterData_Samples_Examples.ipynb b/demos/hydroshare/USGS_WaterData_Samples_Examples.ipynb index 804b88a7c..9030514e3 100644 --- a/demos/hydroshare/USGS_WaterData_Samples_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_Samples_Examples.ipynb @@ -6,7 +6,7 @@ "source": [ "# USGS dataretrieval Python Package `get_samples()` Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to retrieve water quality sample data for United States Geological Survey (USGS) monitoring locations. The dataretrieval package provides a collection of functions to get data from the USGS Samples database and other online sources of hydrology and water quality data, including the United States Environmental Protection Agency (USEPA)." + "This notebook provides examples of using the Python dataretrieval package to retrieve water-quality sample data for United States Geological Survey (USGS) monitoring locations. The dataretrieval package provides a collection of functions to get data from the USGS Samples database and other online sources of hydrology and water-quality data, including the United States Environmental Protection Agency (USEPA)." ] }, { @@ -51,7 +51,7 @@ "source": [ "### Basic Usage\n", "\n", - "The dataretrieval package has several functions that allow you to retrieve data from different web services. This example uses the `get_samples()` function to retrieve water quality sample data for USGS monitoring locations from Samples. The allowable values for the categorical arguments below come from `waterdata.get_codes()` (see the *Discrete water-quality samples* notebook). The following arguments are supported:\n", + "The dataretrieval package has several functions that allow you to retrieve data from different web services. This example uses the `get_samples()` function to retrieve water-quality sample data for USGS monitoring locations from Samples. The allowable values for the categorical arguments below come from `waterdata.get_codes()` (see the *Discrete water-quality samples* notebook). The following arguments are supported:\n", "\n", "* **ssl_check** : boolean, optional\n", " Check the SSL certificate.\n", @@ -127,7 +127,7 @@ " `get_codes(code_service=\"sitetype\")` for all possible inputs.\n", " Example: \"Well\"\n", "* **usgsPCode** : string or list of strings, optional\n", - " 5-digit number used in the US Geological Survey computerized\n", + " 5-digit number used in the U.S. Geological Survey computerized\n", " data system, National Water Information System (NWIS), to\n", " uniquely identify a specific constituent. Use\n", " `get_codes(code_service=\"characteristics\")` for all possible inputs.\n", @@ -164,7 +164,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Example 1: Get all water quality sample data for a single monitoring site" + "#### Example 1: Get all water-quality sample data for a single monitoring site" ] }, { @@ -184,7 +184,7 @@ "source": [ "### Interpreting the Result\n", "\n", - "The result of calling the `get_samples()` function is an object that contains a Pandas data frame object and an associated metadata object. The Pandas data frame contains the water quality sample data for the requested monitoring location, observed variables, and time frame.\n", + "The result of calling the `get_samples()` function is an object that contains a pandas data frame object and an associated metadata object. The pandas data frame contains the water-quality sample data for the requested monitoring location, observed variables, and time frame.\n", "\n", "Once you've got the data frame, there are several useful things you can do to explore the data." ] @@ -245,7 +245,7 @@ "source": [ "### Additional Examples\n", "\n", - "#### Example 2: Get water quality sample data for multiple sites for a single parameter" + "#### Example 2: Get water-quality sample data for multiple sites for a single parameter" ] }, { @@ -267,7 +267,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Example 3: Retrieve water quality sample data for multiple sites, including a list of parameters, within a time period defined by start date until present" + "#### Example 3: Retrieve water-quality sample data for multiple sites, including a list of parameters, within a time period defined by start date until present" ] }, { @@ -292,9 +292,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Example 4: Retrieve water quality sample data for one site and convert to a wide format\n", + "#### Example 4: Retrieve water-quality sample data for one site and convert to a wide format\n", "\n", - "Note that the USGS Samples database returns multiple parameters in a \"long\" format: each row in the resulting table represents a single observation of a single parameter. Furthermore, every observation comes with more than 180 fields of metadata (the default `fullphyschem` profile returns 187 columns). However, if you wanted to place your water quality data into a \"wide\" format, where each column represents a water quality parameter code, the code below details one solution." + "Note that the USGS Samples database returns multiple parameters in a \"long\" format: each row in the resulting table represents a single observation of a single parameter. Furthermore, every observation comes with more than 180 fields of metadata (the default `fullphyschem` profile returns 187 columns). However, if you wanted to place your water-quality data into a \"wide\" format, where each column represents a water-quality parameter code, the code below details one solution." ] }, { diff --git a/demos/hydroshare/USGS_WaterData_SiteInfo_Examples.ipynb b/demos/hydroshare/USGS_WaterData_SiteInfo_Examples.ipynb index 56756daaa..6890e3642 100644 --- a/demos/hydroshare/USGS_WaterData_SiteInfo_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_SiteInfo_Examples.ipynb @@ -6,7 +6,7 @@ "source": [ "# USGS dataretrieval Python Package `get_monitoring_locations()` Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to retrieve information about a United States Geological Survey (USGS) monitoring location. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water quality data." + "This notebook provides examples of using the Python dataretrieval package to retrieve information about a United States Geological Survey (USGS) monitoring location. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water-quality data." ] }, { @@ -55,7 +55,7 @@ "\n", "* **monitoring_location_id** (string or iterable of strings): A unique identifier for a single monitoring location. A monitoring location id joins the code of the agency responsible for the location (e.g. `USGS`) and the location's id number (e.g. `10109000`) with a hyphen (e.g. `USGS-10109000`).\n", "* **state_code** (string or iterable of strings): State code. A two-digit ANSI code (formerly FIPS code) as defined by the American National Standards Institute, used to define states and equivalents.\n", - "* **state_name** (string or iterable of strings): The name of the state or state equivalent in which the monitoring location is located.\n", + "* **state_name** (string or iterable of strings): The name of the State or State equivalent in which the monitoring location is located.\n", "* **hydrologic_unit_code** (string or iterable of strings): A hydrologic unit code (HUC) of two to eight digits identifying a hydrologic unit (region, sub-region, accounting unit, or cataloging unit). For example, `hydrologic_unit_code=\"16010203\"` selects locations within that cataloging unit.\n", "* **site_type_code** (string or iterable of strings): A code describing the hydrologic setting of the monitoring location, such as stream, spring, or well. For example, `site_type_code=\"ST\"` returns streams only.\n", "* **skip_geometry** (boolean): If `True`, response geometries are skipped and the returned object is a plain `pandas.DataFrame` with no spatial information. Otherwise the result is a `geopandas.GeoDataFrame` that includes a `geometry` column.\n", @@ -163,7 +163,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Example 3: Get information for all monitoring locations within a state" + "#### Example 3: Get information for all monitoring locations within a State" ] }, { @@ -172,7 +172,7 @@ "metadata": {}, "outputs": [], "source": [ - "# Get the site information for a state. state_code is a two-digit ANSI code;\n", + "# Get the site information for a State. state_code is a two-digit ANSI code;\n", "# 49 is Utah. (The postal abbreviation \"UT\" returns no results.)\n", "siteINFO_state = waterdata.get_monitoring_locations(state_code=\"49\")\n", "display(siteINFO_state[0])" diff --git a/demos/hydroshare/USGS_WaterData_SiteInventory_Examples.ipynb b/demos/hydroshare/USGS_WaterData_SiteInventory_Examples.ipynb index 139e95d7b..968a663fd 100644 --- a/demos/hydroshare/USGS_WaterData_SiteInventory_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_SiteInventory_Examples.ipynb @@ -6,7 +6,7 @@ "source": [ "# USGS dataretrieval Python Package `get_monitoring_locations()` Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to search for monitoring locations within a region or with specific characteristics. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water quality data, including the United States Environmental Protection Agency (USEPA)." + "This notebook provides examples of using the Python dataretrieval package to search for monitoring locations within a region or with specific characteristics. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water-quality data, including the United States Environmental Protection Agency (USEPA)." ] }, { @@ -56,7 +56,7 @@ "#### Commonly Used Arguments\n", "\n", "* **monitoring_location_id** (string or iterable of strings): A unique identifier for a single monitoring location, formed by joining the agency code (e.g. `USGS`) and the location's ID number with a hyphen (e.g. `USGS-05114000`).\n", - "* **state_name** (string or iterable of strings): The full name of the state or state equivalent in which the monitoring location is located (e.g. `\"Ohio\"`, `\"Utah\"`). Note that this is the spelled-out state name, not a two-letter postal abbreviation.\n", + "* **state_name** (string or iterable of strings): The full name of the State or State equivalent in which the monitoring location is located (e.g. `\"Ohio\"`, `\"Utah\"`). Note that this is the spelled-out state name, not a two-letter postal abbreviation.\n", "* **county_name** (string or iterable of strings): The name of the county (or county equivalent) in which the monitoring location is located.\n", "* **site_type_code** (string or iterable of strings): A code describing the hydrologic setting of the monitoring location (e.g. stream, spring, or well).\n", "* **site_type** (string or iterable of strings): A text description of the hydrologic setting of the monitoring location.\n", diff --git a/demos/hydroshare/USGS_WaterData_UnitValues_Examples.ipynb b/demos/hydroshare/USGS_WaterData_UnitValues_Examples.ipynb index ca0fe808a..f2d023b72 100644 --- a/demos/hydroshare/USGS_WaterData_UnitValues_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_UnitValues_Examples.ipynb @@ -6,7 +6,7 @@ "source": [ "# USGS dataretrieval Python Package `get_continuous()` Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to retrieve continuous (instantaneous, or \"unit\") values data for a United States Geological Survey (USGS) monitoring location. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water quality data." + "This notebook provides examples of using the Python dataretrieval package to retrieve continuous (instantaneous, or \"unit\") values data for a United States Geological Survey (USGS) monitoring location. The dataretrieval package provides a collection of functions to get data from the USGS Water Data API and other online sources of hydrology and water-quality data." ] }, { diff --git a/demos/nwqn_data_pull/README.md b/demos/nwqn_data_pull/README.md index 8f2b6e426..b9118eed5 100644 --- a/demos/nwqn_data_pull/README.md +++ b/demos/nwqn_data_pull/README.md @@ -5,10 +5,10 @@ This example uses Lithops to retrieve data from every NWQN monitoring site, then writes the results to Parquet files on S3. Each -retrieval also searches the NLDI for neighboring sites with NWQN data and -merges those data. In the streamflow retrieval, the neighborhood search -progressively fill in gaps in the record by taking data from the -nearest streamgage and rescaling it by the drainage area ratio. +retrieval also searches the Network Linked Data Index (NLDI) for neighboring +sites with NWQN data and merges those data. In the streamflow retrieval, the +neighborhood search progressively fills in gaps in the record by taking data +from the nearest streamgage and rescaling it by the drainage area ratio. 1. Set up a Python environment ```bash @@ -27,12 +27,12 @@ export LITHOPS_CONFIG_FILE=$(pwd)/lithops.yaml lithops runtime build -b aws_lambda -f Dockerfile_dataretrieval dataretrieval-runtime ``` -4. Download the site list from ScienceBase using `wget` or navigate to the URL and copy the CVS into `nwqn_data_pull/`. +4. Download the site list from ScienceBase using `wget` or navigate to the URL and copy the CSV into `nwqn_data_pull/`. ```bash wget https://www.sciencebase.gov/catalog/file/get/655d2063d34ee4b6e05cc9e6?f=__disk__b3%2F3e%2F5b%2Fb33e5b0038f004c2a48818d0fcc88a0921f3f689 -O NWQN_sites.csv ``` -5. Create a s3 bucket for the output, then set it as an environmental variable +5. Create an S3 bucket for the output, then set it as an environment variable ```bash export DESTINATION_BUCKET= ``` diff --git a/demos/nwqn_data_pull/retrieve_nwqn_samples.py b/demos/nwqn_data_pull/retrieve_nwqn_samples.py index 6ee12fb22..3a2ad177b 100644 --- a/demos/nwqn_data_pull/retrieve_nwqn_samples.py +++ b/demos/nwqn_data_pull/retrieve_nwqn_samples.py @@ -114,7 +114,7 @@ def find_neighboring_sites(site, search_factor=0.1, fudge_factor=3.0): drain_area_sq_mi = site_df["drainage_area"].values[0] length = _estimate_watershed_length_km(drain_area_sq_mi) search_distance = length * search_factor * fudge_factor - # clip between 1 and 9999km + # clip between 1 and 9,999 km search_distance = max(1.0, min(9999.0, search_distance)) # get upstream and downstream sites diff --git a/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py b/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py index 7f9776159..680626b0e 100644 --- a/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py +++ b/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py @@ -121,7 +121,7 @@ def update_dataframe( ) -> pd.DataFrame: """Update a DataFrame with values from another DataFrame. - NOTE: this fuction does not handle MultiIndex DataFrames. + NOTE: this function does not handle MultiIndex DataFrames. """ # Identify new rows in new_df that are not in original_df new_rows = new_df[~new_df.index.isin(original_df.index)] diff --git a/demos/peak_streamflow_trends.ipynb b/demos/peak_streamflow_trends.ipynb index 811d04ebc..080c9c793 100644 --- a/demos/peak_streamflow_trends.ipynb +++ b/demos/peak_streamflow_trends.ipynb @@ -119,7 +119,7 @@ " frames = []\n", "\n", " for state in state_names:\n", - " # find stream gages in the state (keep the geometry for mapping)\n", + " # find stream gages in the State (keep the geometry for mapping)\n", " sites, _ = waterdata.get_monitoring_locations(\n", " state_name=state, site_type_code=\"ST\"\n", " )\n", @@ -152,7 +152,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Running the analysis for every state since 1970 would pull a large amount of data from the Water Data API and could burden the service. To keep this demo light, we run a single small state — Rhode Island — below." + "Running the analysis for every State since 1970 would pull a large amount of data from the Water Data API and could burden the service. To keep this demo light, we run a single small State — Rhode Island — below." ] }, { @@ -162,7 +162,7 @@ "outputs": [], "source": [ "# Download peak discharge for every stream gage in Rhode Island and run the\n", - "# trend regression on each. For larger states the async chunker (default\n", + "# trend regression on each. For larger States the async chunker (default\n", "# concurrency 16) automatically fans the ``get_peaks`` call across many sites;\n", "# Rhode Island is small enough to return in a single request.\n", "start = \"1970-01-01\"\n", @@ -175,7 +175,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The cell above ran the full analysis for a single small state (Rhode Island) and returned `final_df` — one row per gage whose peak-discharge trend is statistically significant (`p_value < 0.05`), carrying the regression slope, intercept, p-value, and standard error." + "The cell above ran the full analysis for a single small State (Rhode Island) and returned `final_df` — one row per gage whose peak-discharge trend is statistically significant (`p_value < 0.05`), carrying the regression slope, intercept, p-value, and standard error." ] }, { diff --git a/tests/architecture_test.py b/tests/architecture_test.py index c098eb4d2..6d4c32aaf 100644 --- a/tests/architecture_test.py +++ b/tests/architecture_test.py @@ -348,7 +348,7 @@ def test_transport_is_execution_policy_only() -> None: "dataretrieval/transport/combining.py", # An exception taxonomy is not HTTP execution policy either. ``fanout`` # raises ``FanOutInterrupted`` and belongs here; defining it here would - # not, since adapters catch it whether or not they went through + # not, because adapters catch it whether or not they went through # transport. "dataretrieval/transport/interruptions.py", } @@ -376,7 +376,7 @@ def test_credential_policy_has_one_definition() -> None: # ``"https://…"`` form three modules use to write the same host, and it # flagged docstring prose that only names the service. Docstrings are # excluded here (they are documentation, not a second definition) - # while every other literal -- bare host or full base URL -- counts. + # whereas every other literal -- bare host or full base URL -- counts. offenders: list[str] = [] for path in sorted(PACKAGE_ROOT.rglob("*.py")): if path.name == "credentials.py": diff --git a/tests/configuration_test.py b/tests/configuration_test.py index 3d2c509d2..f84cdbd40 100644 --- a/tests/configuration_test.py +++ b/tests/configuration_test.py @@ -458,7 +458,7 @@ def test_loading_an_undefined_profile_raises(config_file): The message lists what the file *does* define, because a misspelling is only recognizable next to the spelling that was meant -- and only for this - adapter, since selecting a profile is per adapter and another service's + adapter, because selecting a profile is per adapter and another service's profile names are not candidates for what the caller meant to type. """ config_file( @@ -1284,11 +1284,11 @@ def test_settings_for_an_unimported_adapter_is_not_an_error(monkeypatch): def test_every_adapter_is_actually_wired_to_a_read_site(): """A schema nothing passes gives the caller a report that may be wrong. - ``show_configuration()`` would report a ``[streamstats]`` override as live while - every call ignored it -- the report that exists to say what a call will use being - wrong. Importability is the weaker half of the invariant: it passed while - ``waterdata.get_cql``, eight of nine WQP getters, and all of ``streamstats`` - resolved package-wide without an error. + ``show_configuration()`` would report a ``[streamstats]`` override as live + whereas every call ignored it -- the report that exists to say what a call + will use being wrong. Importability is the weaker half of the invariant: it + passed whereas ``waterdata.get_cql``, eight of nine WQP getters, and all of + ``streamstats`` resolved package-wide without an error. """ import pathlib @@ -1665,8 +1665,8 @@ def test_parallel_chunks_block_survives_an_adapter_scoped_outer_block(): # The tests below test it as a chain: each one removes the rung above and asserts the # next takes over. Seven independent single-rung assertions would all still pass if two # rungs collapsed into one, which is the mistake this exists to catch -- rungs 2 and 3 -# are the pair a refactor is most likely to merge, since 2 above 3 is the one place ADR -# 0011 inverts ADR 0009. +# are the pair a refactor is most likely to merge, because 2 above 3 is the one place +# ADR 0011 inverts ADR 0009. # # ``nwdc`` and ``concurrency`` are the pair that can express all seven. NWDC is the # adapter that has a built-in preference of its own -- 4 concurrent requests, because @@ -1838,7 +1838,7 @@ def test_the_top_two_rungs_cannot_tie(config_file): # instance is not the thing it is talking about: it targets no adapter at # all. Alongside a loaded profile in one block the adapter-scoped value is # the more specific of the two and takes precedence for that adapter (ADR - # 0010), while the package-wide value still governs every other adapter. + # 0010), whereas the package-wide value still governs every other adapter. with dataretrieval.configure( Configuration(concurrency=_LADDER_INSTANCE), NwdcConfiguration.load("tuned") ): diff --git a/tests/conftest.py b/tests/conftest.py index 793dfb061..70d76f9e1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -44,7 +44,7 @@ def _pin_chunker_env(monkeypatch, tmp_path): ``API_USGS_RETRIES`` to 4, and ``API_USGS_STALL_TIMEOUT`` to 60 s. Pinning ``API_USGS_CONCURRENT=1`` keeps chunk dispatch deterministic for the mocked suite, and ``API_USGS_RETRIES=0`` makes - a single transient is raised immediately rather than retried. + a single transient raise immediately rather than be retried. Concurrency and retry tests opt in by overriding the env inside their body. diff --git a/tests/nldi_test.py b/tests/nldi_test.py index 6b39f482e..2865cf148 100644 --- a/tests/nldi_test.py +++ b/tests/nldi_test.py @@ -52,7 +52,8 @@ def mock_request_data_sources(httpx_mock): def test_query_nldi_opts_into_retry(monkeypatch): - """NLDI explicitly enables shared retry while the default path stays unchanged.""" + """NLDI explicitly enables shared retry whereas the default path stays + unchanged.""" response = mock.Mock() response.json.return_value = {} query = mock.Mock(return_value=response) diff --git a/tests/nwdc_test.py b/tests/nwdc_test.py index be6b8fa30..9fc2ba390 100644 --- a/tests/nwdc_test.py +++ b/tests/nwdc_test.py @@ -896,8 +896,8 @@ def test_mid_page_walk_transient_is_still_resumable(httpx_mock): 1's status check is outside its ``try``), so the typed cause is only reachable through ``__cause__``. ``_classify_chunk_error`` walks that chain for this reason; were it a single ``isinstance`` check, a mid-walk rate limit would propagate as a - bare error and lose ``.call.resume()`` -- inconsistently, since page 1 would still - be resumable. + bare error and lose ``.call.resume()`` -- inconsistently, because page 1 would + still be resumable. """ httpx_mock.add_response( method="GET", diff --git a/tests/timezones_test.py b/tests/timezones_test.py index 1180ed28b..76bc72d59 100644 --- a/tests/timezones_test.py +++ b/tests/timezones_test.py @@ -26,7 +26,7 @@ WQX_URL = "https://cdx.epa.gov/wqx/download/DomainValues/TimeZone.CSV" # Codes the two lists define differently. The table follows WQX for these: the -# Water Quality Portal returns ``SST`` for American Samoa, while USGS records +# Water Quality Portal returns ``SST`` for American Samoa, whereas USGS records # (in Samples, and passed through by WQP) write that zone as ``ZP-11``. WQX_WINS = {"SST", "BST"} diff --git a/tests/transport_test.py b/tests/transport_test.py index 72b090147..8be72410d 100644 --- a/tests/transport_test.py +++ b/tests/transport_test.py @@ -405,7 +405,7 @@ def test_credited_wait_never_credits_past_the_present(monkeypatch) -> None: ``credit_wait`` moves the progress stamp forward; without a ceiling at "now", one long queue wait pushed it into the future, made - ``elapsed_since_progress`` negative, and -- since nothing ever reduces it + ``elapsed_since_progress`` negative, and -- because nothing ever reduces it -- left that call exempt from the stall bound until it returned. """ now = 0.0 @@ -463,8 +463,8 @@ def test_queued_work_keeps_its_retries() -> None: The no-progress budget starts when a retry loop is entered, but a fan-out task may wait on a full semaphore long after that. Without crediting the - wait, the last chunks of a wide fan-out enter their first attempt with the budget - already spent, while the tasks dispatched ahead of it get the full + wait, the last chunks of a wide fan-out enter their first attempt with the + budget already spent, whereas the tasks dispatched ahead of it get the full allowance. """ @@ -506,7 +506,8 @@ def test_gate_does_not_reset_silence_from_earlier_attempts() -> None: The gated body is what the retry loop re-invokes, so stamping "now" on every slot acquisition would restart the budget each attempt and turn a bound on *total* time without data into a per-attempt latency bound -- five slow - failures would each look brief while the call received nothing for their sum. + failures would each look brief whereas the call received nothing for their + sum. """ async def drive() -> int: diff --git a/tests/waterdata_chunking_test.py b/tests/waterdata_chunking_test.py index b9689ee74..5ad8aaf01 100644 --- a/tests/waterdata_chunking_test.py +++ b/tests/waterdata_chunking_test.py @@ -1707,12 +1707,12 @@ def test_fan_out_outlives_pool_timeout_on_real_transport(monkeypatch): scale, a batch of large, slowly-streaming pages). Chunks here send real HTTP to a slow localhost server through the chunker's shared - client — fakes can't catch this, since ``MockTransport`` bypasses the connection - pool. With the pool as the only throttle, 2 connections busy for 0.35 s each and the - 0.2 s pool timeout pinned below, the 2 queued chunks waited the full timeout with no - completion to reset their timers → ``httpx.PoolTimeout`` → (retries exhausted, - ``API_USGS_RETRIES=0``) a spurious resumable ``ServiceInterrupted``. Gated by the - semaphore, queued chunks never reach the pool and the call completes. + client — fakes can't catch this, because ``MockTransport`` bypasses the connection + pool. With the pool as the only throttle, 2 connections busy for 0.35 s each and + the 0.2 s pool timeout pinned below, the 2 queued chunks waited the full timeout + with no completion to reset their timers → ``httpx.PoolTimeout`` → (retries + exhausted, ``API_USGS_RETRIES=0``) a spurious resumable ``ServiceInterrupted``. + Gated by the semaphore, queued chunks never reach the pool and the call completes. """ class _SlowHandler(http.server.BaseHTTPRequestHandler): diff --git a/tests/waterdata_nearest_test.py b/tests/waterdata_nearest_test.py index 4f0102a59..2be1412dc 100644 --- a/tests/waterdata_nearest_test.py +++ b/tests/waterdata_nearest_test.py @@ -140,7 +140,7 @@ def test_tie_mean_averages_numeric_and_uses_target_time(patch_get_continuous): window="PT7M30S", ) assert result.iloc[0]["value"] == pytest.approx(22.2) - # Time is set to the target since no real observation falls at the midpoint + # Time is set to the target because no real observation falls at the midpoint assert result.iloc[0]["time"] == targets[0] diff --git a/tests/waterdata_progress_test.py b/tests/waterdata_progress_test.py index c509d320b..05155cc75 100644 --- a/tests/waterdata_progress_test.py +++ b/tests/waterdata_progress_test.py @@ -132,7 +132,7 @@ def test_note_retry_is_noop_when_disabled(): def test_note_retry_accepts_integer_wait(): # An int ``wait`` (e.g. whole seconds) must render without raising: # ``round(int, 1)`` returns an int and ``int.is_integer()`` only exists on - # Python 3.12+, while the package minimum is 3.10. Renders like the float. + # Python 3.12+, whereas the package minimum is 3.10. Renders like the float. stream = io.StringIO() reporter = ProgressReporter(stream=stream, enabled=True) reporter.note_retry(attempt=1, wait=5) diff --git a/tests/waterdata_test.py b/tests/waterdata_test.py index fa0930249..039d31992 100644 --- a/tests/waterdata_test.py +++ b/tests/waterdata_test.py @@ -558,7 +558,7 @@ def test_get_cql_unknown_service_raises(): def test_waterdata_services_literal_matches_output_id_map(): """The WATERDATA_SERVICES Literal and _OUTPUT_ID_BY_COLLECTION must enumerate - the same collections: get_cql validates against the dict while the Literal + the same collections: get_cql validates against the dict, whereas the Literal types the public signature, so drift would let one accept a collection the other rejects.""" from typing import get_args @@ -585,7 +585,7 @@ def test_construct_api_requests_single_value_stays_get(): def test_construct_api_requests_folds_lists_into_a_text_filter(): """With a CQL-text ``filter``, the API ignores a POST body, so the lists are added to the filter as ``IN`` clauses and sent by GET; each value is quoted, - since every queryable is typed as a string.""" + because every queryable is typed as a string.""" req = _construct_api_requests( "daily", monitoring_location_id=["USGS-05427718", "USGS-0542'8500"], diff --git a/tests/waterdata_utils_test.py b/tests/waterdata_utils_test.py index 9348ffbe1..5f958038c 100644 --- a/tests/waterdata_utils_test.py +++ b/tests/waterdata_utils_test.py @@ -303,7 +303,7 @@ def test_walk_pages_raises_with_class_name_when_cause_stringifies_empty(): def test_walk_pages_raises_on_5xx_mid_pagination(): - """A 5xx mid-pagination must raise — partial data is no longer returned + """A 5xx mid-pagination must raise — partial data are no longer returned because the API has no resume cursor, so truncating without an error would return an incomplete frame the caller cannot distinguish from a complete one.""" page2_503 = mock.MagicMock() @@ -339,7 +339,7 @@ def test_walk_pages_raises_on_mid_pagination_429(): def test_walk_pages_wraps_initial_page_parse_error(): """A 200 response whose body fails to parse on the FIRST page used to propagate out - of ``_walk_pages`` as a raw ``JSONDecodeError``, while the SAME failure on a + of ``_walk_pages`` as a raw ``JSONDecodeError``, whereas the SAME failure on a subsequent page was wrapped via ``_paginated_failure_message``. The asymmetry meant operators got different exception types for the same logical bug depending on which page encountered it. The initial-parse wrapper removes the asymmetry.""" From a99c07638fe0b16d6e8397f18addb098ecf6a769 Mon Sep 17 00:00:00 2001 From: thodson-usgs Date: Thu, 22 Oct 2026 16:37:36 -0500 Subject: [PATCH 3/9] docs: second STA8 copy-edit pass Prose only; no identifiers, runtime strings, or doctest blocks changed. - Capitalize 'State' consistently for a U.S. State, including attributive uses ('State code', 'State FIPS'); lowercase for Mexican states and Canadian provinces - More 'since'/'while' -> because/whereas (STA8 pp. 45, 60); 'data' plural (p. 48) - Commas: before 'whereas' and nonrestrictive 'which' (pp. 22, 35), serial comma (p. 26), after the year in a full date (p. 145) - Related numbers in figures (p. 146); 'that is' for i.e. in running text (p. 125); water-quality unit modifier (p. 28) - American spelling (behavior, judgment, neighboring), 'gage', Water Quality Portal capitalization, and a garbled sentence in configuration_test --- CONTEXT.md | 2 +- NEWS.md | 2 +- README.md | 4 ++-- dataretrieval/_configuration_core.py | 4 ++-- dataretrieval/_querying.py | 2 +- dataretrieval/_validation.py | 2 +- dataretrieval/configuration.py | 2 +- dataretrieval/credentials.py | 2 +- dataretrieval/exceptions.py | 2 +- dataretrieval/ngwmn.py | 6 +++--- dataretrieval/nldi.py | 2 +- dataretrieval/nwdc.py | 7 ++++--- dataretrieval/transport/fanout.py | 2 +- dataretrieval/waterdata/metadata.py | 8 ++++---- dataretrieval/waterdata/samples.py | 2 +- demos/WaterData_demo.ipynb | 4 ++-- demos/hydroshare/USGS_NLDI_Examples.ipynb | 2 +- demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb | 2 +- demos/hydroshare/USGS_WaterData_SiteInfo_Examples.ipynb | 2 +- .../USGS_WaterData_SiteInventory_Examples.ipynb | 2 +- tests/configuration_test.py | 8 ++++---- tests/deprecation_test.py | 2 +- tests/ngwmn_test.py | 2 +- tests/waterdata_chunking_test.py | 2 +- tests/waterdata_test.py | 2 +- tests/wqp_test.py | 4 ++-- 26 files changed, 41 insertions(+), 40 deletions(-) diff --git a/CONTEXT.md b/CONTEXT.md index 1995e05fc..edbafff0c 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -66,7 +66,7 @@ rate limit, a service error, a timeout. Distinguished from a **deterministic failure**, which would fail identically every time — an unresolvable hostname, an unsupported scheme, a malformed request. Only transient failures are retried, and only transient failures produce a resumable interruption. Both -answers follow from one judgement about what a failure means, and must be +answers follow from one judgment about what a failure means, and must be consistent. **Stall timeout** — How long a call may receive nothing at all before retrying diff --git a/NEWS.md b/NEWS.md index e3b67284a..975384026 100644 --- a/NEWS.md +++ b/NEWS.md @@ -94,7 +94,7 @@ **05/01/2026:** The `nadp` module is now deprecated. Calling any of `get_annual_MDN_map`, `get_annual_NTN_map`, or `get_zip` will emit a `DeprecationWarning`. The module is scheduled for removal on or after **2026-11-01**. NADP is not a USGS data source; users should retrieve NADP data directly from https://nadp.slh.wisc.edu/. -**04/23/2026:** Added `waterdata.get_nearest_continuous(targets, ...)` — for each of N target timestamps, fetches the single continuous observation closest to that timestamp in one HTTP round-trip (auto-chunked when the resulting CQL filter is long, via the facility added in #238). The helper is designed for workflows that pair many discrete-measurement timestamps with surrounding instantaneous data, which the OGC `time` parameter can't express because it only accepts one instant or one interval per request. Ties at window midpoints are resolved per a configurable `on_tie` ∈ {`"first"`, `"last"`, `"mean"`}; the default `window="PT7M30S"` matches a 15-minute continuous gauge. +**04/23/2026:** Added `waterdata.get_nearest_continuous(targets, ...)` — for each of N target timestamps, fetches the single continuous observation closest to that timestamp in one HTTP round-trip (auto-chunked when the resulting CQL filter is long, via the facility added in #238). The helper is designed for workflows that pair many discrete-measurement timestamps with surrounding instantaneous data, which the OGC `time` parameter can't express because it only accepts one instant or one interval per request. Ties at window midpoints are resolved per a configurable `on_tie` ∈ {`"first"`, `"last"`, `"mean"`}; the default `window="PT7M30S"` matches a 15-minute continuous gage. **04/22/2026:** Highlights since the `v1.1.0` release (2025-11-26), which shipped the `waterdata` module: diff --git a/README.md b/README.md index 3cd0da9de..5cf147323 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ print(f"Retrieved {len(df)} records") print(f"Site: {df['monitoring_location_id'].iloc[0]}") print(f"Mean discharge: {df['value'].mean():.2f} {df['unit_of_measure'].iloc[0]}") ``` -Retrieve streamflow at multiple locations from October 1, 2024 to the present: +Retrieve streamflow at multiple locations from October 1, 2024, to the present: ```python df, metadata = waterdata.get_daily( @@ -229,7 +229,7 @@ sites, metadata = ngwmn.get_sites(state="Wisconsin") print(f"Found {len(sites)} NGWMN sites in Wisconsin") -# Pull water levels from the first twenty sites over a time window. +# Pull water levels from the first 20 sites over a time window. water_levels, metadata = ngwmn.get_water_level( monitoring_location_id=sites["monitoring_location_id"][:20], datetime=["2022-01-01", "2024-01-01"], diff --git a/dataretrieval/_configuration_core.py b/dataretrieval/_configuration_core.py index 73b89726b..dc18982f7 100644 --- a/dataretrieval/_configuration_core.py +++ b/dataretrieval/_configuration_core.py @@ -682,7 +682,7 @@ def _cwd_id() -> tuple[int, int]: Only identifies the directory; :func:`_resolve_against_cwd` is what turns a missing cwd into a :class:`ConfigurationError`. Both are needed, because ``stat`` on a *deleted* working directory still succeeds -- the process holds the - open handle -- while resolving its path does not. + open handle -- whereas resolving its path does not. """ try: st = os.stat(".") @@ -773,7 +773,7 @@ def _coerce_count(value: object, label: str, optional: str) -> str: #: :data:`_VALIDATORS` holds its grammar. A roster with the completeness guard #: below rather than an if/elif chain with an implicit integer fallback, so a new #: setting must declare its type here or fail at import -- rather than parse as an -#: integer without any error from the typed surfaces while the untyped environment +#: integer without any error from the typed surfaces whereas the untyped environment #: accepts it. (Integers are matched as :class:`numbers.Integral` -- a numpy or pandas #: integer is a legitimate count from Python, and ``tomllib`` only ever yields ``int``, #: so the wider check cannot change a TOML outcome.) diff --git a/dataretrieval/_querying.py b/dataretrieval/_querying.py index dcaf99b72..3bad17b0c 100644 --- a/dataretrieval/_querying.py +++ b/dataretrieval/_querying.py @@ -2,7 +2,7 @@ "Compose a USGS query URL, send it, map the status, retry a transient" -- the half of the old ``utils`` module that issues requests, as used by ``wqp``, -``nldi``, ``streamstats`` and ``nwdc``. Its other half (pandas +``nldi``, ``streamstats``, and ``nwdc``. Its other half (pandas column reshaping) shared nothing with this but a filename: no caller used both, and the two have disjoint dependencies -- this one needs ``exceptions`` and ``transport``, that one needs ``codes`` and pandas. diff --git a/dataretrieval/_validation.py b/dataretrieval/_validation.py index 5abe9502b..c83184177 100644 --- a/dataretrieval/_validation.py +++ b/dataretrieval/_validation.py @@ -100,7 +100,7 @@ def require_one_of( A further step, for a vocabulary narrower than the service's: how to obtain what this function does not accept. Added rather than substituted -- unlike the checks below, there is no derived remedy - here, since naming the options *is* the message. + here, because naming the options *is* the message. Raises ------ diff --git a/dataretrieval/configuration.py b/dataretrieval/configuration.py index 69da9a6c8..8aeea4f5d 100644 --- a/dataretrieval/configuration.py +++ b/dataretrieval/configuration.py @@ -872,7 +872,7 @@ def _display_progress(_adapter: str | None = None) -> str: #: How each setting renders in :func:`show_configuration`. Keyed by the same #: names as :data:`_ALL_SETTINGS`, and asserted to cover them, so a setting #: added to one without the other fails at import instead of printing a -#: neighbouring setting's value in the one report that exists to report +#: neighboring setting's value in the one report that exists to report #: provenance accurately. #: #: Every renderer takes the adapter to resolve for, so the adapter-override diff --git a/dataretrieval/credentials.py b/dataretrieval/credentials.py index d30a6791d..0a7e6ac30 100644 --- a/dataretrieval/credentials.py +++ b/dataretrieval/credentials.py @@ -115,7 +115,7 @@ def refuse_credential_keywords(names: Iterable[str]) -> None: A usability check, not a security control (ADR 0009). It gives the caller who guesses that a credential goes here a ``TypeError`` naming ``with configure(Configuration(api_key=...)):`` instead of a token in a URL -- the bare - call is a no-op, since ``configure`` is a context manager. + call is a no-op, because ``configure`` is a context manager. """ forbidden = set() for name in names: diff --git a/dataretrieval/exceptions.py b/dataretrieval/exceptions.py index 6505db88f..61adf0333 100644 --- a/dataretrieval/exceptions.py +++ b/dataretrieval/exceptions.py @@ -381,7 +381,7 @@ def parse_retry_after(value: str | None) -> float | None: the client retry sooner against a service that just named a long delay, and would deny the caller the number it needs on ``.retry_after``. Clock skew can inflate a date-form value, but accepting one leads to a recoverable - escalation while ignoring it leads to re-sending to a service that has + escalation whereas ignoring it leads to re-sending to a service that has already named a delay. A date that has *already* passed yields no value at all rather than diff --git a/dataretrieval/ngwmn.py b/dataretrieval/ngwmn.py index 176f90c8c..8ec78006c 100644 --- a/dataretrieval/ngwmn.py +++ b/dataretrieval/ngwmn.py @@ -415,9 +415,9 @@ def get_providers( State filter. Accepts a full name (``"Wisconsin"``), a two-letter postal code (``"WI"``), or a two-digit ANSI/FIPS code (``"55"``). The 50 States, the District of Columbia, and the five U.S. territories. - Sent as the API's ``state`` field, as a postal code. Only one - State at a time — a multi-value state filter - returns no records for this collection. + Sent as the API's ``state`` field, as a postal code. Only one State at + a time — a multi-value state filter returns no records for this + collection. agency_code : str or iterable of str, optional Provider agency code. organization_type : str or iterable of str, optional diff --git a/dataretrieval/nldi.py b/dataretrieval/nldi.py index 55a54ecf1..d8c2309fb 100644 --- a/dataretrieval/nldi.py +++ b/dataretrieval/nldi.py @@ -89,7 +89,7 @@ def _query_nldi( response_data = response.json() except JSONDecodeError: # even with a 200 status code, the response sometimes does not return JSON - # data which causes a JSONDecodeError + # data, which causes a JSONDecodeError pass return response_data diff --git a/dataretrieval/nwdc.py b/dataretrieval/nwdc.py index bde4c1d3f..521511f64 100644 --- a/dataretrieval/nwdc.py +++ b/dataretrieval/nwdc.py @@ -149,9 +149,10 @@ def get_wateruse( variable; omitting it returns a 400 listing the model's valid variable IDs (raised as a :class:`~dataretrieval.exceptions.DataRetrievalError`). state : string, int, or iterable, optional - One or more U.S. States or territories to query. Each accepts a full name - (``"Wisconsin"``), a two-letter postal code (``"WI"``), or a two-digit ANSI/FIPS - code (``"55"`` or ``55``), matching :func:`dataretrieval.ngwmn.get_sites`. + One or more U.S. States or territories to query. Each accepts a full + name (``"Wisconsin"``), a two-letter postal code (``"WI"``), or a + two-digit ANSI/FIPS code (``"55"`` or ``55``), matching + :func:`dataretrieval.ngwmn.get_sites`. county : string or iterable, optional One or more five-digit county FIPS codes — State FIPS + county FIPS, e.g. ``"55025"`` for Dane County, Wisconsin. diff --git a/dataretrieval/transport/fanout.py b/dataretrieval/transport/fanout.py index 5d21d1894..d82b098fd 100644 --- a/dataretrieval/transport/fanout.py +++ b/dataretrieval/transport/fanout.py @@ -100,7 +100,7 @@ class FanOutPlan(Protocol[_ChunkCo]): :meth:`FanOut.resume` keys completed work by position. The item type is whatever an adapter's own ``fetch`` accepts -- this executor passes each item through unchanged and never inspects it, so the OGC getters yield - kwargs dicts whereas Water Use yields ready :class:`httpx.Request` objects. + kwargs dicts, whereas Water Use yields ready :class:`httpx.Request` objects. The query's ``canonical_url`` is not part of the plan; it is an argument to :class:`FanOut`. diff --git a/dataretrieval/waterdata/metadata.py b/dataretrieval/waterdata/metadata.py index faa929c3d..c964b1bf8 100644 --- a/dataretrieval/waterdata/metadata.py +++ b/dataretrieval/waterdata/metadata.py @@ -133,9 +133,9 @@ def get_monitoring_locations( county equivalents. A `lookup table `_ is available. The only countries with - political subdivisions other than the US are Mexico and Canada. The Mexican - states have U.S. State codes ranging from 81 to 86 and Canadian provinces have - State codes ranging from 90 to 98. + political subdivisions other than the US are Mexico and Canada. The + Mexican states have U.S. state codes ranging from 81 to 86 and Canadian + provinces have state codes ranging from 90 to 98. state_name : string or iterable of strings, optional The name of the State or State equivalent in which the monitoring location is located. @@ -163,7 +163,7 @@ def get_monitoring_locations( each other, from the smallest (cataloging units) to the largest (regions). basin_code : string or iterable of strings, optional - The Basin Code or "drainage basin code" is a two-digit code that further + The Basin Code or "drainage basin code" is a 2-digit code that further subdivides the 8-digit hydrologic-unit code. The drainage basin code is defined by the USGS State Office where the monitoring location is located. diff --git a/dataretrieval/waterdata/samples.py b/dataretrieval/waterdata/samples.py index 05a943d7f..c407589a7 100644 --- a/dataretrieval/waterdata/samples.py +++ b/dataretrieval/waterdata/samples.py @@ -385,7 +385,7 @@ def get_samples_summary( row per (characteristic group, characteristic, user-supplied characteristic) combination with result and activity counts and the first / most recent activity dates — useful for taking inventory of what discrete-sample data - exists at a monitoring location before pulling the underlying observations + exist at a monitoring location before pulling the underlying observations with :func:`get_samples`. The summary service is single-site only: it accepts exactly one monitoring diff --git a/demos/WaterData_demo.ipynb b/demos/WaterData_demo.ipynb index c113d7294..e6f20113f 100644 --- a/demos/WaterData_demo.ipynb +++ b/demos/WaterData_demo.ipynb @@ -53,7 +53,7 @@ "These functions retrieve metadata tables that can be used to refine your data requests.\n", "\n", "- `get_reference_table()` - Not sure which parameter code you're looking for, or which hydrologic unit your study area is in? This function will help you find the right input values for the data endpoints to retrieve the information you want.\n", - "- `get_codes()` - Similar to `get_reference_table()`, this function retrieves dataframes containing available input values that correspond to the Samples water quality database.\n", + "- `get_codes()` - Similar to `get_reference_table()`, this function retrieves dataframes containing available input values that correspond to the Samples water-quality database.\n", "\n", "### Data endpoints\n", "- `get_daily()` - Daily values for monitoring locations, parameters, stat codes, and more.\n", @@ -63,7 +63,7 @@ "- `get_latest_continuous()` - Latest instantaneous values for requested monitoring locations, parameter codes, statistical codes, and more.\n", "- `get_latest_daily()` - Latest daily values for requested monitoring locations, parameter codes, statistical codes, and more.\n", "- `get_field_measurements()` - Physically measured values (a.k.a. discrete) of gage height, discharge, groundwater levels, and more for requested monitoring locations.\n", - "- `get_samples()` - Discrete water quality sample results for monitoring locations, observed properties, and more." + "- `get_samples()` - Discrete water-quality sample results for monitoring locations, observed properties, and more." ] }, { diff --git a/demos/hydroshare/USGS_NLDI_Examples.ipynb b/demos/hydroshare/USGS_NLDI_Examples.ipynb index 9a2738611..e5b44933f 100644 --- a/demos/hydroshare/USGS_NLDI_Examples.ipynb +++ b/demos/hydroshare/USGS_NLDI_Examples.ipynb @@ -110,7 +110,7 @@ "id": "8", "metadata": {}, "source": [ - "Now we can call the `get_basin` function to get the coordinates of the polygon making up the basin boundary associated with this monitoring site - i.e., the watershed area upstream of the given monitoring site. The result will be returned as a geopandas dataframe unless the `as_json` argument is used and set to True." + "Now we can call the `get_basin` function to get the coordinates of the polygon making up the basin boundary associated with this monitoring site - that is, the watershed area upstream of the given monitoring site. The result will be returned as a geopandas dataframe unless the `as_json` argument is used and set to True." ] }, { diff --git a/demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb b/demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb index 0a2e6c0f8..9aceee770 100644 --- a/demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb +++ b/demos/hydroshare/USGS_NWDC_WaterUse_Examples.ipynb @@ -6,7 +6,7 @@ "source": [ "# USGS dataretrieval Python Package Water-Use Examples\n", "\n", - "This notebook provides examples of using the Python dataretrieval package to retrieve water-use data from the USGS [National Water Availability Assessment Data Companion (NWDC)](https://water.usgs.gov/nwaa-data/). The NWDC serves national-scale, *modeled* water-use estimates on a HUC12 (12-digit hydrologic unit) grid, queryable for any county, state, or hydrologic unit. It is the modern replacement for the retired legacy water-use service.\n", + "This notebook provides examples of using the Python dataretrieval package to retrieve water-use data from the USGS [National Water Availability Assessment Data Companion (NWDC)](https://water.usgs.gov/nwaa-data/). The NWDC serves national-scale, *modeled* water-use estimates on a HUC12 (12-digit hydrologic unit) grid, queryable for any county, State, or hydrologic unit. It is the modern replacement for the retired legacy water-use service.\n", "\n", "The dataretrieval package exposes the service through a single function, `nwdc.get_wateruse`, which returns a tuple of a pandas data frame and an associated metadata object." ] diff --git a/demos/hydroshare/USGS_WaterData_SiteInfo_Examples.ipynb b/demos/hydroshare/USGS_WaterData_SiteInfo_Examples.ipynb index 6890e3642..25581041d 100644 --- a/demos/hydroshare/USGS_WaterData_SiteInfo_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_SiteInfo_Examples.ipynb @@ -54,7 +54,7 @@ "The dataretrieval package has several functions that allow you to retrieve data from the USGS Water Data API. This example uses the `get_monitoring_locations()` function to retrieve information about USGS monitoring locations. The function accepts many optional query arguments; supplying one or more of them filters the locations that are returned. The arguments used in the examples below are:\n", "\n", "* **monitoring_location_id** (string or iterable of strings): A unique identifier for a single monitoring location. A monitoring location id joins the code of the agency responsible for the location (e.g. `USGS`) and the location's id number (e.g. `10109000`) with a hyphen (e.g. `USGS-10109000`).\n", - "* **state_code** (string or iterable of strings): State code. A two-digit ANSI code (formerly FIPS code) as defined by the American National Standards Institute, used to define states and equivalents.\n", + "* **state_code** (string or iterable of strings): State code. A two-digit ANSI code (formerly FIPS code) as defined by the American National Standards Institute, used to define States and equivalents.\n", "* **state_name** (string or iterable of strings): The name of the State or State equivalent in which the monitoring location is located.\n", "* **hydrologic_unit_code** (string or iterable of strings): A hydrologic unit code (HUC) of two to eight digits identifying a hydrologic unit (region, sub-region, accounting unit, or cataloging unit). For example, `hydrologic_unit_code=\"16010203\"` selects locations within that cataloging unit.\n", "* **site_type_code** (string or iterable of strings): A code describing the hydrologic setting of the monitoring location, such as stream, spring, or well. For example, `site_type_code=\"ST\"` returns streams only.\n", diff --git a/demos/hydroshare/USGS_WaterData_SiteInventory_Examples.ipynb b/demos/hydroshare/USGS_WaterData_SiteInventory_Examples.ipynb index 968a663fd..a98e7213e 100644 --- a/demos/hydroshare/USGS_WaterData_SiteInventory_Examples.ipynb +++ b/demos/hydroshare/USGS_WaterData_SiteInventory_Examples.ipynb @@ -56,7 +56,7 @@ "#### Commonly Used Arguments\n", "\n", "* **monitoring_location_id** (string or iterable of strings): A unique identifier for a single monitoring location, formed by joining the agency code (e.g. `USGS`) and the location's ID number with a hyphen (e.g. `USGS-05114000`).\n", - "* **state_name** (string or iterable of strings): The full name of the State or State equivalent in which the monitoring location is located (e.g. `\"Ohio\"`, `\"Utah\"`). Note that this is the spelled-out state name, not a two-letter postal abbreviation.\n", + "* **state_name** (string or iterable of strings): The full name of the State or State equivalent in which the monitoring location is located (e.g. `\"Ohio\"`, `\"Utah\"`). Note that this is the spelled-out State name, not a two-letter postal abbreviation.\n", "* **county_name** (string or iterable of strings): The name of the county (or county equivalent) in which the monitoring location is located.\n", "* **site_type_code** (string or iterable of strings): A code describing the hydrologic setting of the monitoring location (e.g. stream, spring, or well).\n", "* **site_type** (string or iterable of strings): A text description of the hydrologic setting of the monitoring location.\n", diff --git a/tests/configuration_test.py b/tests/configuration_test.py index f84cdbd40..be6fc77b0 100644 --- a/tests/configuration_test.py +++ b/tests/configuration_test.py @@ -1720,7 +1720,7 @@ def test_a_loaded_profile_beats_the_environment(config_file, monkeypatch): those two rules alone predict that ``API_USGS_CONCURRENT`` in the shell takes precedence. It does not: what enters the chain is the caller *naming* the profile in code, which is a more deliberate act than a variable inherited from whatever started - the process, and being overridden by that variable is the behaviour a caller would + the process, and being overridden by that variable is the behavior a caller would report as a bug. The inversion is also bounded, which the second half asserts: it covers @@ -1813,9 +1813,9 @@ def test_the_package_built_in_default_is_the_floor(config_file): def test_the_top_two_rungs_cannot_tie(config_file): """Rungs 1 and 2 both target one adapter, so no block can hold both. - That is what sis the highest rung of the ladder needing a tie-break rule nobody - could remember: the same-adapter rule rejects the pairing where the order would - matter, and between *nested* blocks the ordinary rule applies -- the innermost + That is what spares the highest rung of the ladder from needing a tie-break rule + nobody could remember: the same-adapter rule rejects the pairing where the order + would matter, and between *nested* blocks the ordinary rule applies -- the innermost decides, whichever kind of configuration it holds. """ config_file(_LADDER_FILE) diff --git a/tests/deprecation_test.py b/tests/deprecation_test.py index ae565dfab..2e780db08 100644 --- a/tests/deprecation_test.py +++ b/tests/deprecation_test.py @@ -1,4 +1,4 @@ -"""The behavioural claim: a downstream ``-W error::DeprecationWarning`` +"""The behavioral claim: a downstream ``-W error::DeprecationWarning`` filter must not break the library.""" import warnings diff --git a/tests/ngwmn_test.py b/tests/ngwmn_test.py index a0cf4a69a..c5d667d41 100644 --- a/tests/ngwmn_test.py +++ b/tests/ngwmn_test.py @@ -616,7 +616,7 @@ def test_a_configured_base_url_redirects_ngwmn_alone(httpx_mock): def test_state_queryables_still_diverge_upstream(): """The NGWMN ``sites`` and ``providers`` collections expose different state queryables (``sites`` -> ``state_name`` full name; ``providers`` -> ``state`` - 2-letter code). The single-``state`` shim (``ngwmn._STATE_QUERYABLE``) exists only + two-letter code). The single-``state`` shim (``ngwmn._STATE_QUERYABLE``) exists only to hide that asymmetry. If this test fails, the upstream API has unified the two queryables and the diff --git a/tests/waterdata_chunking_test.py b/tests/waterdata_chunking_test.py index 5ad8aaf01..afcc63d81 100644 --- a/tests/waterdata_chunking_test.py +++ b/tests/waterdata_chunking_test.py @@ -7,7 +7,7 @@ - every multi-value list contributes ``len(",".join(map(str, v)))``, - the ``filter`` kwarg contributes ``len(filter)``. -That isolates planner behaviour from the real HTTP request builder. +That isolates planner behavior from the real HTTP request builder. The one exception is ``test_joint_planner_url_construction_long_filter_and_long_sites``, which uses the real ``_construct_api_requests`` so URL-encoding diff --git a/tests/waterdata_test.py b/tests/waterdata_test.py index 039d31992..98efbbc10 100644 --- a/tests/waterdata_test.py +++ b/tests/waterdata_test.py @@ -1990,7 +1990,7 @@ def test_get_daily_parameter_code_as_series(self): Regression for the gap PR #229 originally left on every multi-value parameter other than ``monitoring_location_id``. Pre-fix, the Series - was passed through to ``requests`` which str-serialized it into the + was passed through to ``requests``, which str-serialized it into the URL (or POST body). Post-fix, ``_normalize_str_iterable`` materializes it to ``list`` at the function boundary. """ diff --git a/tests/wqp_test.py b/tests/wqp_test.py index 144140f74..a66b283ce 100644 --- a/tests/wqp_test.py +++ b/tests/wqp_test.py @@ -85,7 +85,7 @@ def test_get_results_preserves_leading_zero_codes(httpx_mock): def test_get_results(httpx_mock): - """Tests water quality portal ratings query""" + """Tests Water Quality Portal ratings query""" request_url = ( "https://www.waterqualitydata.us/data/Result/Search?siteid=WIDNR_WQX-10032762" "&characteristicName=Specific+conductance&startDateLo=05-01-2011&startDateHi=09-30-2011" @@ -110,7 +110,7 @@ def test_get_results(httpx_mock): def test_get_results_WQX3(httpx_mock): - """Tests water quality portal results query with new WQX3.0 profile""" + """Tests Water Quality Portal results query with new WQX3.0 profile""" request_url = ( "https://www.waterqualitydata.us/wqx3/Result/search?siteid=WIDNR_WQX-10032762" "&characteristicName=Specific+conductance&startDateLo=05-01-2011&startDateHi=09-30-2011" From d0ebb159a1a0484890cba6a65efe16db02cf8001 Mon Sep 17 00:00:00 2001 From: thodson-usgs Date: Sat, 24 Oct 2026 08:10:57 -0500 Subject: [PATCH 4/9] refactor: clean up what the nwis removal left behind - Drop the retry wrapper the NWQN demo put around waterdata.get_monitoring_locations, which already retries; carry USGS- IDs end to end instead of stripping and re-adding the prefix; delete the agency_code filter that no longer removes anything. - Delete the ignore-variadic-names ruff exemption: with it off, ARG001 reports nothing. - Use the glossary's "single-shot" instead of the new "single-request", and state shared-module rules without hand-written adapter lists (one said NGWMN never receives the key). - Replace the WQP-specific URL-too-long pseudo-code with a remedy that holds for every caller; make the format_datetime warning name the columns to check rather than the nonexistent datetime_index. - Move the ADR "Note (2026-10)" paragraphs into each record's Notes with an amended Status (ADR 0000); restore ADR 0010's decision-time survey; correct ADR 0003's note, which said rules still present were deleted. - Document that utils.query does not retry, the statement the removal deleted along with its NWIS rationale. - Remove a duplicate URL-too-long test, the NWIS payload in test_header, and the hard-coded wateruse horizon in the deprecation test. Co-Authored-By: Claude Opus 5.5 (1M context) --- .pyscn-known-clones.json | 6 +-- CONTEXT.md | 4 +- dataretrieval/_querying.py | 28 +++++--------- dataretrieval/_response_metadata.py | 11 +----- dataretrieval/exceptions.py | 16 ++++---- dataretrieval/ogc/chunking.py | 2 +- dataretrieval/rdb.py | 11 ++---- dataretrieval/transport/http.py | 4 +- dataretrieval/utils.py | 5 +-- dataretrieval/wateruse.py | 4 +- demos/nwqn_data_pull/retrieve_nwqn_samples.py | 38 ++++++++----------- .../retrieve_nwqn_streamflow.py | 38 +++++++------------ .../decisions/0001-modular-monolith.rst | 11 +++++- .../decisions/0003-dependency-direction.rst | 15 ++++++-- .../decisions/0005-legacy-nwis.rst | 22 +++++++---- .../0006-service-neutral-transport.rst | 3 ++ .../decisions/0007-adapter-facades.rst | 8 ++-- .../0010-adapter-scoped-settings.rst | 25 ++++++++---- .../decisions/0013-core-and-domain-terms.rst | 9 ++++- docs/source/architecture/index.rst | 26 +++++++------ pyproject.toml | 6 --- tests/configuration_test.py | 3 +- tests/deprecation_test.py | 8 ++-- tests/utils_test.py | 26 +++---------- 24 files changed, 151 insertions(+), 178 deletions(-) diff --git a/.pyscn-known-clones.json b/.pyscn-known-clones.json index 6e2235adc..a0f05fd83 100644 --- a/.pyscn-known-clones.json +++ b/.pyscn-known-clones.json @@ -78,9 +78,5 @@ "clone_type": 4, "rationale": "Two Water Data getters matched as a semantic (type-4) clone at 0.672, just above the 0.65 threshold. Expect this pair to appear and disappear between runs as either getter is edited; that churn is not a new clone." } - ], - "sub_threshold_accepted": { - "_comment": "Families that pyscn 1.29.0 did NOT report at its defaults (they sat under its min_lines=10 / min_nodes=20) but that a deliberate scan at min_nodes=8 found on 2026-08-09. Not re-scanned with 1.32.4, whose min_lines is 8. Recorded so they are not rediscovered and re-litigated. They are NOT counted in `observed` above.", - "groups": [] - } + ] } diff --git a/CONTEXT.md b/CONTEXT.md index edbafff0c..83814c9f0 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -107,8 +107,8 @@ what the service offers. from an origin to connected features, flowlines, or basins. **NWIS** — The legacy USGS waterservices interface. Retired: the -`dataretrieval.nwis` adapter was removed in the next major release (2026-10), -so `import dataretrieval.nwis` raises `ModuleNotFoundError`. The term is kept +`dataretrieval.nwis` adapter has been removed (ADR 0005), so +`import dataretrieval.nwis` raises `ModuleNotFoundError`. The term is kept because "NWIS" survives as a data-provider name and data value in other services (WQP `providers=NWIS`, the USGS NWIS time-zone code list) and in this history. diff --git a/dataretrieval/_querying.py b/dataretrieval/_querying.py index 3bad17b0c..22e1b029f 100644 --- a/dataretrieval/_querying.py +++ b/dataretrieval/_querying.py @@ -1,4 +1,4 @@ -"""The one-shot HTTP query path behind the single-request service adapters. +"""The HTTP query path behind the single-shot service adapters. "Compose a USGS query URL, send it, map the status, retry a transient" -- the half of the old ``utils`` module that issues requests, as used by ``wqp``, @@ -10,7 +10,8 @@ The module is private because the *names* are not: ``query`` and ``to_str`` keep their documented ``dataretrieval.utils`` path, the way ``Ambient`` and ``BaseMetadata`` do from their own implementation leaves. This path serves the -single-request adapters; the chunked services use the chunked transport instead. +single-shot adapters, and NWDC borrows its status mapping; the services that +chunk or fan out send their requests through ``transport`` instead. """ from __future__ import annotations @@ -73,21 +74,11 @@ def to_str(listlike: object, delimiter: str = ",") -> str | None: return None -_URL_TOO_LONG_EXAMPLE = """ - # n is the number of chunks to divide the query into \n - split_list = np.array_split(site_list, n) - data_list = [] # list to store chunk results in \n - # loop through chunks and make requests \n - for site_list in split_list: \n - data, _ = wqp.get_results(siteid=site_list) \n - data_list.append(data) # append results to list""" - - def _url_too_long_error(detail: str) -> URLTooLong: return URLTooLong( - "Request URL too long. Modify your query to use fewer sites. " - f"{detail}. Pseudo-code example of how to split your query: " - f"\n {_URL_TOO_LONG_EXAMPLE}" + f"Request URL too long ({detail}). Modify your query to pass fewer " + "values in its list arguments, or split a long list across several " + "calls and concatenate the results." ) @@ -98,7 +89,7 @@ def _raise_for_status( ) -> None: """Raise the typed :class:`DataRetrievalError` for an HTTP error response. - A success status returns ``None``. Shared by the single-request :func:`query` path + A success status returns ``None``. Shared by the :func:`query` path (and ``streamstats`` / ``nwdc``). Delegates the status-to-type mapping to :func:`dataretrieval.exceptions.error_for_status`, except a too-long-URL status (413 / 414): that gets the same actionable "split your query" @@ -187,7 +178,7 @@ def _query_with_retry( retry_policy: RetryPolicy | None = None, adapter: str | None = None, ) -> httpx.Response: - """Send an active-service query with bounded transient retry by default. + """Send a query with bounded transient retry by default. When ``delimiter`` is ``None``, iterable values are materialized for ``httpx`` to encode as repeated query parameters. Strings remain scalar. @@ -224,7 +215,8 @@ def query( """Send a query. Wrapper for ``httpx.get`` that handles errors, converts listed query - parameters to comma-separated strings, and returns the response. + parameters to comma-separated strings, and returns the response. It sends + one attempt and does not retry, regardless of ``API_USGS_RETRIES``. Parameters ---------- diff --git a/dataretrieval/_response_metadata.py b/dataretrieval/_response_metadata.py index 831f10177..b8c7815d8 100644 --- a/dataretrieval/_response_metadata.py +++ b/dataretrieval/_response_metadata.py @@ -44,18 +44,11 @@ def __init__(self, response: httpx.Response) -> None: self.header = response.headers self.comment: str | None = None - # # not sure what statistic_info is - # self.statistic_info = None - - # # disclaimer seems to be only part of importWaterML1 - # self.disclaimer = None - @property def site_info(self) -> Any: raise NotImplementedError( - "This metadata object has no site_info: only the wqp " - "metadata class implements it, and the getter that produced this " - "result does not return site descriptions alongside data. Fetch " + "This metadata object has no site_info: the getter that produced " + "this result does not return site descriptions alongside data. Fetch " "them using a separate function from the same adapter -- " "dataretrieval.waterdata.get_monitoring_locations(" "monitoring_location_id=...) for Water Data, " diff --git a/dataretrieval/exceptions.py b/dataretrieval/exceptions.py index 61adf0333..b070ec011 100644 --- a/dataretrieval/exceptions.py +++ b/dataretrieval/exceptions.py @@ -1,7 +1,6 @@ """Exception taxonomy for ``dataretrieval``. -Every service module (``wqp``, ``nldi``, ``waterdata``, -``streamstats``) raises a subclass of :class:`DataRetrievalError` when a request +Every service module raises a subclass of :class:`DataRetrievalError` when a request fails, so one ``except dataretrieval.DataRetrievalError`` catches them all. That includes connection-level failures (timeouts, DNS, refused connections), which remain inside this taxonomy rather than leaking ``httpx`` exceptions. A @@ -22,9 +21,8 @@ batched retrieval, and :class:`DataCurrencyWarning` for an upstream dataset that has stopped being updated. -This module has no third-party runtime dependencies -- ``httpx`` is imported only for -type checking. Any module can therefore import it without importing pandas or httpx, and -without risking an import cycle. +This module has no third-party dependencies, so any module can import it without +importing pandas or httpx, and without risking an import cycle. """ from __future__ import annotations @@ -83,7 +81,7 @@ class DataRetrievalError(Exception): """ #: HTTP status that triggered the error, or ``None`` for errors without one - #: (connection failure, too-long URL, no data). Set by :class:`HTTPError`. + #: (connection failure, too-long URL). Set by :class:`HTTPError`. status_code: int | None = None #: Seconds the server specified to wait before retrying (its ``Retry-After`` #: header), or ``None`` when it sent none. Set by :class:`TransientError`. @@ -205,7 +203,7 @@ class RateLimited(TransientError): class ServiceUnavailable(TransientError): """A request was rejected with a server error (HTTP 5xx). - Raised by both the single-request ``query`` path and the Water Data path, so a 5xx + Raised by both the single-shot ``query`` path and the Water Data path, so a 5xx is raised as one type whichever subsystem issued the request. ``.status_code`` holds the actual 5xx; it falls back to 503 only on a bare hand-construction. """ @@ -229,7 +227,7 @@ class RequestTooLarge(DataRetrievalError): class URLTooLong(RequestTooLarge): """A single request URL was too long for the service. - Raised on the single-request ``query`` path (which sends one un-chunked request), + Raised on the single-shot ``query`` path (which sends one un-chunked request), whether the URL is rejected client-side before sending or by the server (see :func:`error_for_status`). Remediation: query fewer sites, or split the call manually. @@ -339,7 +337,7 @@ def error_for_status( ) -> DataRetrievalError: """Return the typed :class:`DataRetrievalError` for an HTTP error *status*. - The one status-to-type mapping every request path shares (the single-request + The one status-to-type mapping every request path shares (the single-shot ``query`` path, ``waterdata``, ``streamstats``), so a given status becomes the same type everywhere: diff --git a/dataretrieval/ogc/chunking.py b/dataretrieval/ogc/chunking.py index 821ee4ec2..df70de898 100644 --- a/dataretrieval/ogc/chunking.py +++ b/dataretrieval/ogc/chunking.py @@ -91,7 +91,7 @@ def parallel_chunks(n: int) -> Iterator[None]: A per-call setting rather than an environment variable, and scoped to a ``with`` block: ADR 0009. Outside any block the getters use the conservative default. Only the OGC getters (Water Data, NGWMN) read this; - wrapping a single-shot call (WQP, NLDI, StreamStats) in the block is a no-op. + wrapping a call to any other adapter in the block is a no-op. Parameters ---------- diff --git a/dataretrieval/rdb.py b/dataretrieval/rdb.py index 40da669ac..f2a8b2110 100644 --- a/dataretrieval/rdb.py +++ b/dataretrieval/rdb.py @@ -11,10 +11,8 @@ it is informational only and skipped during parsing. - Tab-separated data rows. -This module exposes the parsing primitives that -``dataretrieval.waterdata.ratings`` uses. Callers layer their own -post-processing (ratings-specific ``df.attrs`` provenance, etc.) on top of -the raw frame. +This module exposes the parsing primitives. Callers layer their own +post-processing (such as ``df.attrs`` provenance) on top of the raw frame. """ from __future__ import annotations @@ -46,9 +44,8 @@ def read_rdb(text: str, dtypes: dict[str, type] | None = None) -> pd.DataFrame: Returns ------- pandas.DataFrame - The parsed data. An RDB consisting only of comment lines (e.g. a - "no sites found" response) returns an empty DataFrame rather than - raising. + The parsed data. An RDB consisting only of comment lines returns an + empty DataFrame rather than raising. Raises ------ diff --git a/dataretrieval/transport/http.py b/dataretrieval/transport/http.py index 3a20f135e..d64c551c9 100644 --- a/dataretrieval/transport/http.py +++ b/dataretrieval/transport/http.py @@ -55,8 +55,8 @@ def default_headers(target_url: str | httpx.URL | None = None) -> dict[str, str] resolution reads the config file and can raise :class:`~dataretrieval.exceptions.ConfigurationError` for a malformed file or a profile it no longer defines. Resolving first would let a Water Data - configuration problem fail a WQP or NGWMN call that would - never have received the key. + configuration problem fail a call to a host that would never have received + the key. """ headers = { "Accept-Encoding": "compress, gzip", diff --git a/dataretrieval/utils.py b/dataretrieval/utils.py index 68e3cf2e0..ede216d62 100644 --- a/dataretrieval/utils.py +++ b/dataretrieval/utils.py @@ -59,7 +59,6 @@ def format_datetime( The data frame with a formatted 'datetime' column. """ - # create a datetime index from the columns in qwdata response df[tz_field] = df[tz_field].map(tz) df["datetime"] = pd.to_datetime( @@ -72,8 +71,8 @@ def format_datetime( if df["datetime"].isna().any(): count = df["datetime"].isna().sum() warnings.warn( - f"Warning: {count} incomplete dates found, " - + "consider setting datetime_index to False.", + f"{count} incomplete dates found; those rows are NaT in 'datetime'. " + f"Check their {date_field!r}, {time_field!r}, and {tz_field!r} values.", UserWarning, stacklevel=2, ) diff --git a/dataretrieval/wateruse.py b/dataretrieval/wateruse.py index d9960354b..c46d8a2e7 100644 --- a/dataretrieval/wateruse.py +++ b/dataretrieval/wateruse.py @@ -34,9 +34,7 @@ from dataretrieval.nwdc import * # noqa: F403 # re-export the public surface #: When the alias may be deleted. Read from the shared horizon table rather than spelled -#: here, so it is reviewed and extended with every other published removal; this follows -#: the dated-removal convention every entry in -#: :data:`~dataretrieval._deprecation.REMOVALS` uses. +#: here, so it is reviewed and extended with every other published removal. NWDC_RENAME_REMOVAL_DATE = REMOVALS["wateruse"] __all__ = list(_nwdc.__all__) diff --git a/demos/nwqn_data_pull/retrieve_nwqn_samples.py b/demos/nwqn_data_pull/retrieve_nwqn_samples.py index 3a2ad177b..b2c9cae58 100644 --- a/demos/nwqn_data_pull/retrieve_nwqn_samples.py +++ b/demos/nwqn_data_pull/retrieve_nwqn_samples.py @@ -30,17 +30,14 @@ def map_retrieval(site): print(f"Retrieving samples from site {site}") # skip bad sites if site in BAD_NLDI_SITES: - site_list = [site] + location_ids = [f"USGS-{site}"] # else query slowly else: sleep(randint(0, 5)) - site_list = find_neighboring_sites(site) - - # reformat for wqp - site_list = [f"USGS-{site}" for site in site_list] + location_ids = find_neighboring_sites(site) df, _ = wqp_get_results( - siteid=site_list, + siteid=location_ids, project=PROJECT, ) @@ -81,11 +78,6 @@ def wrapper(*args, **kwargs): return decorator -@exponential_backoff(max_retries=5, base_delay=1) -def get_monitoring_locations(*args, **kwargs): - return waterdata.get_monitoring_locations(*args, **kwargs) - - @exponential_backoff(max_retries=5, base_delay=1) def wqp_get_results(*args, **kwargs): return wqp.get_results(*args, **kwargs) @@ -107,8 +99,14 @@ def find_neighboring_sites(site, search_factor=0.1, fudge_factor=3.0): fudge_factor : float, optional An additional fudge factor to apply to the search distance, because watersheds are not circular. + + Returns + ------- + list of str + Monitoring location IDs (``USGS-`` prefixed) of the site and its + neighbors. """ - site_df, _ = get_monitoring_locations( + site_df, _ = waterdata.get_monitoring_locations( monitoring_location_id=f"USGS-{site}", skip_geometry=True ) drain_area_sq_mi = site_df["drainage_area"].values[0] @@ -131,22 +129,18 @@ def find_neighboring_sites(site, search_factor=0.1, fudge_factor=3.0): features = pd.concat(gdfs, ignore_index=True) - df, _ = get_monitoring_locations( + df, _ = waterdata.get_monitoring_locations( monitoring_location_id=list(features.identifier), skip_geometry=True ) # drop sites with dissimilar drainage areas - df = df.where( - (df["drainage_area"] / drain_area_sq_mi) > search_factor, - ).dropna(how="all") - - # return bare site numbers (strip the "USGS-" agency prefix) - site_list = df["monitoring_location_id"].str.removeprefix("USGS-").to_list() + df = df[df["drainage_area"] / drain_area_sq_mi > search_factor] + location_ids = df["monitoring_location_id"].to_list() # include the original search site among the neighbors - if site not in site_list: - site_list.append(site) + if f"USGS-{site}" not in location_ids: + location_ids.append(f"USGS-{site}") - return site_list + return location_ids def _estimate_watershed_length_km(drain_area_sq_mi): diff --git a/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py b/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py index 680626b0e..543c5ac1b 100644 --- a/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py +++ b/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py @@ -7,11 +7,7 @@ import lithops import numpy as np import pandas as pd -from retrieve_nwqn_samples import ( - BAD_NLDI_SITES, - find_neighboring_sites, - get_monitoring_locations, -) +from retrieve_nwqn_samples import BAD_NLDI_SITES, find_neighboring_sites from dataretrieval import waterdata @@ -23,17 +19,18 @@ def map_retrieval(site): """Map function to pull daily streamflow from the USGS Water Data API""" print(f"Retrieving daily streamflow from site {site}") + site_id = f"USGS-{site}" if site in BAD_NLDI_SITES: - site_list = [site] + location_ids = [site_id] # else query slowly else: sleep(randint(0, 5)) - site_list = find_neighboring_sites(site) + location_ids = find_neighboring_sites(site) # Daily mean discharge, approved values only (filtered by the service). df, _ = waterdata.get_daily( - monitoring_location_id=[f"USGS-{s}" for s in site_list], + monitoring_location_id=location_ids, parameter_code="00060", statistic_id="00003", approval_status="Approved", @@ -44,23 +41,16 @@ def map_retrieval(site): print(len(df), "records retrieved") # process the results if not df.empty: - # index by bare site number and day, keeping only the discharge value - df["site_no"] = df["monitoring_location_id"].str.removeprefix("USGS-") - df = df.set_index(["site_no", "time"])[["value"]].dropna() + # index by monitoring location and day, keeping only the discharge value + df = df.set_index(["monitoring_location_id", "time"])[["value"]].dropna() - site_info, _ = get_monitoring_locations( - monitoring_location_id=[f"USGS-{s}" for s in site_list], + site_info, _ = waterdata.get_monitoring_locations( + monitoring_location_id=location_ids, skip_geometry=True, ) - # keep only USGS sites; USACE sites may share a site number, which - # creates index conflicts later - site_info = site_info[site_info["agency_code"] == "USGS"] - site_info["site_no"] = site_info["monitoring_location_id"].str.removeprefix( - "USGS-" - ) - site_info = site_info.set_index("site_no") + site_info = site_info.set_index("monitoring_location_id") - main_site = site_info.loc[site] + main_site = site_info.loc[site_id] main_site_drainage_area = main_site["drainage_area"] # compute fraction of drainage area @@ -72,15 +62,13 @@ def map_retrieval(site): # apply drainage area fraction df = pd.merge(df, site_info, left_index=True, right_index=True) - df["value"] *= site_info.loc[ - df.index.get_level_values("site_no"), "drain_fraction" - ].values + df["value"] *= df["drain_fraction"] # order sites by the difference in drainage area fraction fill_order = site_info.sort_values("fraction_diff", ascending=True) fill_order = fill_order.index.values - flow_sites = df.index.get_level_values("site_no").values + flow_sites = df.index.get_level_values("monitoring_location_id").values fill_order = set(fill_order).intersection(flow_sites) output = pd.DataFrame() diff --git a/docs/source/architecture/decisions/0001-modular-monolith.rst b/docs/source/architecture/decisions/0001-modular-monolith.rst index a1854efb0..3f0639eed 100644 --- a/docs/source/architecture/decisions/0001-modular-monolith.rst +++ b/docs/source/architecture/decisions/0001-modular-monolith.rst @@ -6,6 +6,9 @@ Status Accepted +Amended after acceptance under :doc:`0000-documenting-decisions`; the +``Notes`` section records every clause added or corrected. + Context ------- @@ -49,5 +52,9 @@ fitness function requires the runtime import graph, including package facades, to stay acyclic. The installed-wheel CI job verifies that the whole monolith ships as one usable artifact. -Note (2026-10): ``dataretrieval.nwis`` was removed, so the contract that kept -modern modules from depending on legacy NWIS is deleted with the module. +Notes +----- + +The Compliance paragraph was corrected after acceptance. It also named the +contract that kept modern modules from depending on legacy NWIS, which was +deleted with ``dataretrieval.nwis`` (:doc:`0005-legacy-nwis`). diff --git a/docs/source/architecture/decisions/0003-dependency-direction.rst b/docs/source/architecture/decisions/0003-dependency-direction.rst index 9436b9b92..d37ed715b 100644 --- a/docs/source/architecture/decisions/0003-dependency-direction.rst +++ b/docs/source/architecture/decisions/0003-dependency-direction.rst @@ -6,6 +6,9 @@ Status Accepted +Amended after acceptance under :doc:`0000-documenting-decisions`; the +``Notes`` section records every clause added or corrected. + Context ------- @@ -53,10 +56,6 @@ independence; ``lint-imports`` checks all of it against the transitive import graph in pre-commit and CI. A boundary that legitimately moves is one edit, in that file, alongside the ADR it cites. -Note (2026-10): ``dataretrieval.nwis`` was removed, so the NWIS quarantine -contract and the Decision's two rules naming NWIS above are deleted along with -the module. - These rules were previously asserted a second time in ``tests/architecture_test.py``, by hand-parsing the AST. That duplication is gone. The tests now cover only what the configured contracts cannot express — @@ -80,3 +79,11 @@ The OGC consumer list is an allowlist, so a new service module fails the contrac someone places it deliberately. It should shrink as private seams move. Any growth requires explicit architecture review, and a change to the dependency policy requires this ADR to be superseded. + +Notes +----- + +The first Compliance paragraph was corrected after acceptance to drop the NWIS +quarantine contract, which was deleted with ``dataretrieval.nwis`` +(:doc:`0005-legacy-nwis`). The Decision's two rules naming NWIS are kept as +accepted; with the module removed, they constrain nothing. diff --git a/docs/source/architecture/decisions/0005-legacy-nwis.rst b/docs/source/architecture/decisions/0005-legacy-nwis.rst index 7185daa33..217d26267 100644 --- a/docs/source/architecture/decisions/0005-legacy-nwis.rst +++ b/docs/source/architecture/decisions/0005-legacy-nwis.rst @@ -4,8 +4,10 @@ ADR 0005: Quarantine and retire legacy NWIS Status ------ -Accepted; completed -- ``dataretrieval.nwis`` removed in the next major release -(2026-10), ahead of the 2027-05-06 horizon. +Accepted. Carried out: ``dataretrieval.nwis`` has been removed. + +Amended after acceptance under :doc:`0000-documenting-decisions`; the +``Notes`` section records every clause added or corrected. Context ------- @@ -44,8 +46,14 @@ Consequences Compliance ---------- -Note (2026-10): ``dataretrieval.nwis`` has been removed, so -``import dataretrieval.nwis`` raises ``ModuleNotFoundError`` and the -``nwis-quarantine`` contract that once kept modern modules from importing it is -deleted. The deprecation tests that verified one warning per public call and -named Water Data replacements are gone with the module. +``import dataretrieval.nwis`` raises ``ModuleNotFoundError``. + +Notes +----- + +The module was removed before the 2027-05-06 horizon, because USGS is +decommissioning the waterservices endpoints it called. The Compliance section +was rewritten at removal: it described the deprecation tests that verified one +warning per public call and named Water Data replacements, and the +``nwis-quarantine`` contract in ``.importlinter``. Both were removed with the +module. diff --git a/docs/source/architecture/decisions/0006-service-neutral-transport.rst b/docs/source/architecture/decisions/0006-service-neutral-transport.rst index 7ebf95391..8db3dd8b9 100644 --- a/docs/source/architecture/decisions/0006-service-neutral-transport.rst +++ b/docs/source/architecture/decisions/0006-service-neutral-transport.rst @@ -164,3 +164,6 @@ One sentence of the original Decision was also corrected rather than added to: it scoped automatic retry to "gateway 5xx", which was never true of a fanned-out call -- those re-send any 5xx, and only the single-shot adapters are limited to the gateway statuses. The decision is unchanged; the sentence now describes it. + +The sentence saying deprecated NWIS calls retain their compatibility behavior +was removed with ``dataretrieval.nwis`` (:doc:`0005-legacy-nwis`). diff --git a/docs/source/architecture/decisions/0007-adapter-facades.rst b/docs/source/architecture/decisions/0007-adapter-facades.rst index 28578faea..2dd0796bc 100644 --- a/docs/source/architecture/decisions/0007-adapter-facades.rst +++ b/docs/source/architecture/decisions/0007-adapter-facades.rst @@ -95,9 +95,7 @@ collection families independent of each other, restricts the facade-only consumers (NGWMN and ``waterdata.cql``) to the OGC facade, and prevents one adapter from importing another. The identifier-column rule is covered by ``tests/nwdc_test.py::test_huc12_id_kept_as_string_with_leading_zero`` and the equivalent -leading-zero assertions in the WQP adapter tests. Note (2026-10): the NWIS -adapter tests that once asserted the same rule were removed with -``dataretrieval.nwis``. +leading-zero assertions in the WQP adapter tests. Notes ----- @@ -107,3 +105,7 @@ clauses were added after the original decision; the rest of the record is unchanged. They consolidate under ADR 0000 the rules the code was stating in prose. The scoping note in particular records why ``_querying.py`` reassigning ``__module__`` is not a violation of this record, a question an audit raised. + +The identifier-column Compliance sentence was corrected when +``dataretrieval.nwis`` was removed (:doc:`0005-legacy-nwis`): it also cited the +NWIS adapter tests, which were removed with the module. diff --git a/docs/source/architecture/decisions/0010-adapter-scoped-settings.rst b/docs/source/architecture/decisions/0010-adapter-scoped-settings.rst index e824f08e4..a512708a4 100644 --- a/docs/source/architecture/decisions/0010-adapter-scoped-settings.rst +++ b/docs/source/architecture/decisions/0010-adapter-scoped-settings.rst @@ -19,6 +19,9 @@ decision 8. Decisions 2, 3, 4, 6 and 7 remain in effect: the tiers, source-major precedence, package-wide environment variables, the host-scoped key, and the adapter names. +Amended after acceptance under :doc:`0000-documenting-decisions`; the +``Notes`` section records every clause added or corrected. + Context ------- @@ -65,10 +68,15 @@ from shows the premise is false. The settings themselves differ: - no - gateway only - no + * - ``nwis`` (deprecated, not an adapter key) + - ``waterservices.usgs.gov`` + - no + - fixed, no retry + - yes ``concurrency`` and ``parallel_chunks`` are meaningless for the four single-shot adapters -- there is nothing to fan out. ``ssl_check`` applies to -three adapters (``waterdata``, ``nwdc``, ``wqp``) and is currently a +four adapters (``waterdata``, ``nwdc``, ``nwis``, ``wqp``) and is currently a per-call keyword outside the chain entirely; it is passed to ``httpx``'s ``verify``, verified by spying on the client. A flat namespace accepts ``configure(streamstats={"parallel_chunks": 8})`` without error, which is @@ -160,8 +168,7 @@ Settings are scoped to the **adapter**, not the service, and not the host. ``waterdata``, ``ngwmn``, ``nwdc``, ``wqp``, ``nldi``, ``streamstats``. The deprecated ``nwis`` is deliberately absent: its calls pin ``max_retries=0``, so a ``[nwis]`` table could only be reported as in effect and - then ignored -- the failure this decision exists to prevent. Note (2026-10): - ``nwis`` has since been removed entirely. + then ignored -- the failure this decision exists to prevent. 8. **Each adapter is a named, typed parameter on** ``configure()``, annotated with its own ``TypedDict``, so a type checker rejects a setting the adapter @@ -227,13 +234,11 @@ Consequences the package that reads ``os.environ`` for a setting. - **``ssl_check`` stays a per-call argument and does not become a setting.** - It is a defaulted keyword on 13 shipped getters across three adapters -- - ``wqp`` (9), ``waterdata`` (3) and ``nwdc`` (1) -- and it is + It is a defaulted keyword on 23 shipped getters across four adapters -- + ``wqp`` (9), ``nwis`` (10), ``waterdata`` (3) and ``nwdc`` (1) -- and it is passed to ``httpx``'s ``verify``. It was added in 2023 to what were then the only modules; the OGC getters were added later and never adopted it, so its - distribution records the package's history rather than a boundary. (Note - (2026-10): the ``nwis`` adapter, which held 10 of the getters, has been - removed.) + distribution records the package's history rather than a boundary. Three reasons not to promote it. It disables certificate verification, so as a per-call keyword it is a visible, scoped decision, while a config-file key @@ -284,3 +289,7 @@ Notes - The ``wateruse`` module is renamed ``nwdc`` in a separate change; the service names itself "National Water Availability Assessment Data Companion" and serves ten models, only five of which are water use. +- ``dataretrieval.nwis`` has since been removed (:doc:`0005-legacy-nwis`). The + survey table, decision 7, and the ``ssl_check`` counts describe the package + when this record was accepted; ``ssl_check`` is now a keyword on 13 getters + across three adapters. diff --git a/docs/source/architecture/decisions/0013-core-and-domain-terms.rst b/docs/source/architecture/decisions/0013-core-and-domain-terms.rst index 80cb9ba58..0432f3150 100644 --- a/docs/source/architecture/decisions/0013-core-and-domain-terms.rst +++ b/docs/source/architecture/decisions/0013-core-and-domain-terms.rst @@ -6,6 +6,9 @@ Status Accepted +Amended after acceptance under :doc:`0000-documenting-decisions`; the +``Notes`` section records every clause added or corrected. + Context ------- @@ -105,8 +108,7 @@ Consequences - The recurring question -- may this docstring say *site*? -- has an answer that does not depend on who is reviewing. In ``nwis`` it may, because that is the spelling its service and its parameters use. In ``transport`` it may not, - because nothing there is about NWIS. (Note (2026-10): the ``nwis`` module has - since been removed; the example stands as the reasoning that applied to it.) + because nothing there is about NWIS. - Enforcement splits. A core term can be checked mechanically, since one spelling is correct everywhere. A domain term cannot: the correct spelling depends on which adapter the prose is about, so it stays a review judgement. @@ -146,3 +148,6 @@ made the gap visible rather than creating it. The per-service spellings in the table above were read from the adapters on 2026-09-01. + +The ``nwis`` example under Consequences names a module that has since been +removed (:doc:`0005-legacy-nwis`); the reasoning it illustrates is unchanged. diff --git a/docs/source/architecture/index.rst b/docs/source/architecture/index.rst index 2625d0ece..d10f09ec1 100644 --- a/docs/source/architecture/index.rst +++ b/docs/source/architecture/index.rst @@ -165,12 +165,13 @@ Shared components behavior there. ``dataretrieval._querying`` - The one-shot HTTP query path the single-request adapters (``wqp``, - ``nldi``, ``streamstats``, ``nwdc``) use: compose the URL, send - it, map the status, retry a transient. It was moved out of ``utils`` because the two - halves were in one file for no other reason -- this one depends on - ``exceptions`` and ``transport``, the shaping half on ``codes`` and - pandas, and no caller used both. The implementation module is private; the established public + The one-shot HTTP query path the single-shot adapters (``wqp``, + ``nldi``, ``streamstats``) use, and whose status mapping ``nwdc`` borrows: + compose the URL, send it, map the status, retry a transient. It was moved + out of ``utils`` because the two halves were in one file for no other + reason -- this one depends on ``exceptions`` and ``transport``, the shaping + half on ``codes`` and pandas, and no caller used both. The implementation + module is private; the established public function paths remain ``dataretrieval.utils.query`` and ``dataretrieval.utils.to_str``. @@ -285,12 +286,13 @@ config-file format -- are catalogued once in the architecturally is the behavior around them: ``API_USGS_RETRIES`` - Number of retries after the first attempt on supported active request paths; - defaults to four. Backoff is exponential with full jitter and waits for - bounded ``Retry-After`` values. Only failures that may not recur on a later - attempt are re-sent: 429 and gateway 5xx, not a 500 rejecting the query - itself, and not a transport failure that is determined before the request - is sent (unresolvable host, unsupported scheme). + Number of retries after the first attempt; defaults to four. Backoff is + exponential with full jitter and waits for bounded ``Retry-After`` values. + Only failures that may not recur on a later attempt are re-sent: 429 and + gateway 5xx, not a 500 rejecting the query itself, and not a transport + failure that is determined before the request is sent (unresolvable host, + unsupported scheme). The public ``dataretrieval.utils.query`` does not opt + in. ``API_USGS_STALL_TIMEOUT`` Seconds a call may go without receiving any data before retrying stops and diff --git a/pyproject.toml b/pyproject.toml index 7370f694c..0dc907b6b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -170,12 +170,6 @@ ignore = [ "SIM117", # Use a single `with` statement with multiple contexts ] -[tool.ruff.lint.flake8-unused-arguments] -# Getters with a ``**kwargs`` passthrough (Water Data's ``**queryables``, WQP's -# search filters) accept variadic parameters a given call may not consume. -# Exempt variadic parameters while checking named parameters with ARG001. -ignore-variadic-names = true - [tool.ruff.lint.mccabe] max-complexity = 20 diff --git a/tests/configuration_test.py b/tests/configuration_test.py index be6fc77b0..b31e45cf9 100644 --- a/tests/configuration_test.py +++ b/tests/configuration_test.py @@ -1011,8 +1011,7 @@ def test_broken_config_does_not_break_unrelated_services(config_file): """ config_file("this is not = valid toml [[[\n") - # Unauthorized hosts never get the key, so they never read the configuration. - assert "X-Api-Key" not in _default_headers("https://example.invalid/data") + # Other hosts never get the key, so they never read the configuration. assert "X-Api-Key" not in _default_headers("https://www.waterqualitydata.us/data") # The authorized host still raises rather than sending the request diff --git a/tests/deprecation_test.py b/tests/deprecation_test.py index 2e780db08..b98831f4e 100644 --- a/tests/deprecation_test.py +++ b/tests/deprecation_test.py @@ -6,7 +6,7 @@ import pytest import dataretrieval.wqp as wqp -from dataretrieval._deprecation import REMOVALS, warn_deprecated +from dataretrieval._deprecation import warn_deprecated from dataretrieval.exceptions import DataCurrencyWarning @@ -33,11 +33,9 @@ def test_data_currency_is_not_a_deprecation(): def test_warn_deprecated_names_replacement_and_horizon(): with pytest.warns( - DeprecationWarning, match=r"on or after 2027-08-11.*use `x` instead" + DeprecationWarning, match=r"on or after 2027-01-01.*use `x` instead" ): - warn_deprecated( - "`dataretrieval.wateruse`", replacement="`x`", removal=REMOVALS["wateruse"] - ) + warn_deprecated("`a`", replacement="`x`", removal="2027-01-01") def test_warn_deprecated_without_a_date_promises_nothing_specific(): diff --git a/tests/utils_test.py b/tests/utils_test.py index 460e20287..5da236964 100644 --- a/tests/utils_test.py +++ b/tests/utils_test.py @@ -30,31 +30,15 @@ def test_scope_restores_previous_value(self): class Test_query: """Tests of the query function (mocked — no live calls).""" - def test_url_too_long(self, httpx_mock): - """A 413 / 414 from the service (an over-long query URL, Issue #64) is - raised as the typed URLTooLong.""" - url = "https://example.invalid/x" - httpx_mock.add_response(method="GET", status_code=414) - with pytest.raises(exceptions.URLTooLong): - utils.query(url, {"sites": ["01491000", "01491001"]}) - def test_header(self, httpx_mock): """query() sends a User-Agent header and returns the response.""" - httpx_mock.add_response(method="GET", json={"value": {"timeSeries": []}}) - url = "https://example.invalid/x" - payload = { - "format": "json", - "startDT": "2010-10-01", - "endDT": "2010-10-10", - "sites": "01646500", - "multi_index": True, - } - response = utils.query(url, payload) + httpx_mock.add_response(method="GET") + response = utils.query("https://example.invalid/x", {"a": "1"}) assert response.status_code == 200 # GET was successful assert "user-agent" in response.request.headers def test_query_does_not_opt_into_retry(self, httpx_mock, monkeypatch): - """The public legacy query path still raises the first transient failure.""" + """The public ``utils.query`` still raises the first transient failure.""" url = "https://example.invalid/x" request_url = f"{url}?a=1" httpx_mock.add_response(method="GET", url=request_url, status_code=503) @@ -630,8 +614,8 @@ def test_joins_date_time_and_zone_into_utc(self): def test_warns_and_keeps_going_when_a_timestamp_will_not_parse(self): """An unparseable row becomes NaT rather than failing the whole frame, but dropping timestamps would return an incomplete frame with - nothing to mark the gap -- so it warns, and names the switch that - avoids the loss.""" + nothing to mark the gap -- so it warns, and names the columns to + check.""" df = pd.DataFrame( { # A missing date field, as an RDB row with an unrecorded From c83d473c05701ac1f4c3bd89a01739bc0c1678ac Mon Sep 17 00:00:00 2001 From: thodson-usgs Date: Sat, 24 Oct 2026 08:11:45 -0500 Subject: [PATCH 5/9] refactor(demos): stop re-fetching NWQN monitoring locations find_neighboring_sites already fetched every neighbor's monitoring location to filter by drainage area, then returned only the IDs, so the streamflow script requested the same rows again. It now returns the frame; only the BAD_NLDI_SITES branch fetches on its own. The streamflow get_daily call requests only the three columns the script reads, and the unused update_dataframe(overwrite=) parameter and project locals are gone. Co-Authored-By: Claude Opus 5.5 (1M context) --- demos/nwqn_data_pull/retrieve_nwqn_samples.py | 18 ++++++++---------- .../nwqn_data_pull/retrieve_nwqn_streamflow.py | 15 ++++++--------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/demos/nwqn_data_pull/retrieve_nwqn_samples.py b/demos/nwqn_data_pull/retrieve_nwqn_samples.py index b2c9cae58..84971a524 100644 --- a/demos/nwqn_data_pull/retrieve_nwqn_samples.py +++ b/demos/nwqn_data_pull/retrieve_nwqn_samples.py @@ -34,7 +34,8 @@ def map_retrieval(site): # else query slowly else: sleep(randint(0, 5)) - location_ids = find_neighboring_sites(site) + neighbors = find_neighboring_sites(site) + location_ids = neighbors["monitoring_location_id"].to_list() df, _ = wqp_get_results( siteid=location_ids, @@ -102,9 +103,9 @@ def find_neighboring_sites(site, search_factor=0.1, fudge_factor=3.0): Returns ------- - list of str - Monitoring location IDs (``USGS-`` prefixed) of the site and its - neighbors. + pandas.DataFrame + Monitoring locations of the site and its neighbors, as returned by + ``waterdata.get_monitoring_locations``. """ site_df, _ = waterdata.get_monitoring_locations( monitoring_location_id=f"USGS-{site}", skip_geometry=True @@ -134,13 +135,12 @@ def find_neighboring_sites(site, search_factor=0.1, fudge_factor=3.0): ) # drop sites with dissimilar drainage areas df = df[df["drainage_area"] / drain_area_sq_mi > search_factor] - location_ids = df["monitoring_location_id"].to_list() # include the original search site among the neighbors - if f"USGS-{site}" not in location_ids: - location_ids.append(f"USGS-{site}") + if f"USGS-{site}" not in df["monitoring_location_id"].values: + df = pd.concat([df, site_df], ignore_index=True) - return location_ids + return df def _estimate_watershed_length_km(drain_area_sq_mi): @@ -163,8 +163,6 @@ def _estimate_watershed_length_km(drain_area_sq_mi): if __name__ == "__main__": - project = "National Water Quality Assessment Program (NAWQA)" - site_df = pd.read_csv( "NWQN_sites.csv", comment="#", diff --git a/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py b/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py index 543c5ac1b..b7e08f783 100644 --- a/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py +++ b/demos/nwqn_data_pull/retrieve_nwqn_streamflow.py @@ -22,11 +22,14 @@ def map_retrieval(site): site_id = f"USGS-{site}" if site in BAD_NLDI_SITES: - location_ids = [site_id] + site_info, _ = waterdata.get_monitoring_locations( + monitoring_location_id=site_id, skip_geometry=True + ) # else query slowly else: sleep(randint(0, 5)) - location_ids = find_neighboring_sites(site) + site_info = find_neighboring_sites(site) + location_ids = site_info["monitoring_location_id"].to_list() # Daily mean discharge, approved values only (filtered by the service). df, _ = waterdata.get_daily( @@ -35,6 +38,7 @@ def map_retrieval(site): statistic_id="00003", approval_status="Approved", time=f"{START_DATE}/{END_DATE}", + properties=["monitoring_location_id", "time", "value"], skip_geometry=True, ) @@ -44,10 +48,6 @@ def map_retrieval(site): # index by monitoring location and day, keeping only the discharge value df = df.set_index(["monitoring_location_id", "time"])[["value"]].dropna() - site_info, _ = waterdata.get_monitoring_locations( - monitoring_location_id=location_ids, - skip_geometry=True, - ) site_info = site_info.set_index("monitoring_location_id") main_site = site_info.loc[site_id] @@ -105,7 +105,6 @@ def map_retrieval(site): def update_dataframe( original_df: pd.DataFrame, new_df: pd.DataFrame, - overwrite: bool = False, ) -> pd.DataFrame: """Update a DataFrame with values from another DataFrame. @@ -121,8 +120,6 @@ def update_dataframe( if __name__ == "__main__": - project = "National Water Quality Assessment Program (NAWQA)" - site_df = pd.read_csv( "NWQN_sites.csv", comment="#", From 0b32a1b419b7dbbbdc2ca48e7387f8e14b44ea6d Mon Sep 17 00:00:00 2001 From: thodson-usgs Date: Mon, 26 Oct 2026 12:13:24 -0500 Subject: [PATCH 6/9] feat: name the replacements when dataretrieval.nwis is imported Restore dataretrieval/nwis.py as a stub that raises ImportError on import, so every spelling (import dataretrieval.nwis, from dataretrieval import nwis, from dataretrieval.nwis import get_dv) names the waterdata replacements and the last release that ships the module: pip install "dataretrieval==1.4.0". NEWS, CONTEXT, and ADR 0005 say the same, and .importlinter places the stub in the top layer. Co-Authored-By: Claude Opus 5.5 (1M context) --- .importlinter | 3 ++- CONTEXT.md | 3 ++- NEWS.md | 2 +- dataretrieval/nwis.py | 21 +++++++++++++++++++ .../decisions/0005-legacy-nwis.rst | 4 +++- tests/contracts/removed_modules_test.py | 20 ++++++++++++++++++ 6 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 dataretrieval/nwis.py create mode 100644 tests/contracts/removed_modules_test.py diff --git a/.importlinter b/.importlinter index 2c3efe590..eaddad093 100644 --- a/.importlinter +++ b/.importlinter @@ -24,7 +24,8 @@ layers = ; The deprecated ``wateruse`` alias re-exports ``nwdc``, so it sits above the ; adapters rather than beside them. A compatibility facade may depend on the ; adapter it forwards to; nothing may depend on the facade. - wateruse +; The removed ``nwis`` stub only raises ``ImportError``, so nothing may import it. + nwis | wateruse ngwmn | nldi | nwdc | streamstats | waterdata | wqp ogc utils diff --git a/CONTEXT.md b/CONTEXT.md index 83814c9f0..80ec26284 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -108,7 +108,8 @@ from an origin to connected features, flowlines, or basins. **NWIS** — The legacy USGS waterservices interface. Retired: the `dataretrieval.nwis` adapter has been removed (ADR 0005), so -`import dataretrieval.nwis` raises `ModuleNotFoundError`. The term is kept +`import dataretrieval.nwis` raises `ImportError` naming the replacements +and the last release that includes it (1.4.0). The term is kept because "NWIS" survives as a data-provider name and data value in other services (WQP `providers=NWIS`, the USGS NWIS time-zone code list) and in this history. diff --git a/NEWS.md b/NEWS.md index 975384026..626128c2f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -**10/22/2026:** **Breaking change:** `dataretrieval.nwis` is removed, ahead of its 2027-05-06 horizon, because USGS is [decommissioning the legacy waterservices endpoints](https://waterdata.usgs.gov/blog/api-waterservices-decom/) the module called. `import dataretrieval.nwis` now raises `ModuleNotFoundError`. Migrate to the `waterdata` getters: `get_dv` -> `get_daily`, `get_iv` -> `get_continuous`, `get_info` / `what_sites` -> `get_monitoring_locations`, the data catalog -> `get_time_series_metadata`, `get_discharge_peaks` -> `get_peaks`, `get_ratings` -> `get_ratings`, `get_stats` -> `get_stats_por` / `get_stats_date_range`, `get_discharge_measurements` / `get_gwlevels` -> `get_field_measurements`, and qw -> `get_samples`; water use moves to `nwdc.get_wateruse`. **Breaking change:** `dataretrieval.exceptions.NoSitesError` (and its `dataretrieval.NoSitesError` re-export) is removed; only the waterservices path raised it, and the modern getters return an empty `DataFrame` when nothing matches. The other published deprecations are unchanged and remain on their horizons: the `get_time_series_metadata()` v0 filters (`begin_utc`, `end_utc`, `state`, `state_name`, `hydrologic_unit_code`) on or after 2027-06-01, `get_cql(service=)` on or after 2027-08-09, the `wateruse` module alias on or after 2027-08-11, and `ogc.interruptions` on or after 2027-08-25. +**10/22/2026:** **Breaking change:** `dataretrieval.nwis` is removed, ahead of its 2027-05-06 horizon, because USGS is [decommissioning the legacy waterservices endpoints](https://waterdata.usgs.gov/blog/api-waterservices-decom/) the module called. `import dataretrieval.nwis` (or any import from it) now raises `ImportError` with a message naming the replacement getters. To keep using `nwis` while the waterservices endpoints remain online, pin the last release that includes it: `pip install "dataretrieval==1.4.0"`. Migrate to the `waterdata` getters: `get_dv` -> `get_daily`, `get_iv` -> `get_continuous`, `get_info` / `what_sites` -> `get_monitoring_locations`, the data catalog -> `get_time_series_metadata`, `get_discharge_peaks` -> `get_peaks`, `get_ratings` -> `get_ratings`, `get_stats` -> `get_stats_por` / `get_stats_date_range`, `get_discharge_measurements` / `get_gwlevels` -> `get_field_measurements`, and qw -> `get_samples`; water use moves to `nwdc.get_wateruse`. **Breaking change:** `dataretrieval.exceptions.NoSitesError` (and its `dataretrieval.NoSitesError` re-export) is removed; only the waterservices path raised it, and the modern getters return an empty `DataFrame` when nothing matches. The other published deprecations are unchanged and remain on their horizons: the `get_time_series_metadata()` v0 filters (`begin_utc`, `end_utc`, `state`, `state_name`, `hydrologic_unit_code`) on or after 2027-06-01, `get_cql(service=)` on or after 2027-08-09, the `wateruse` module alias on or after 2027-08-11, and `ogc.interruptions` on or after 2027-08-25. **10/16/2026:** **Bug fix:** the time-zone table behind the `*DateTime` columns that `waterdata.get_samples()` and `wqp.get_results()` append, and behind `utils.format_datetime()`, now follows the code lists those services use: the USGS NWIS time-zone list (Samples, and the USGS records that the Water Quality Portal passes through) and the WQX TimeZone domain (Water Quality Portal). USGS records write American Samoa as `ZP-11`, which was missing, so every timed American Samoa row from `get_samples()`, and every timed USGS American Samoa row from `get_results()`, had a `NaT` datetime; it is now UTC-11. 39 other codes from the two lists that used to become `NaT` now resolve, among them the remaining `ZP*` offsets, `IDLW`, `IDLE`, `NZT`, `SWT`, and the retired WQX codes `AHST` and `YST`. **Behavior change:** codes that the table read with a different meaning from the USGS list now take the USGS meaning: `CAST` (+9:30), `CCT` (+8), `EASST` (+11), `EAST` (+10), `NFT` (-3:30), `NZDT` (+13), `WAST` (+7), and `WAT` (-1). `FJST` is now UTC+13. Where the two lists disagree, WQX wins: `SST` stays American Samoa (UTC-11), the meaning the Water Quality Portal returns, and `BST` is UTC-11. diff --git a/dataretrieval/nwis.py b/dataretrieval/nwis.py new file mode 100644 index 000000000..c7cb15f66 --- /dev/null +++ b/dataretrieval/nwis.py @@ -0,0 +1,21 @@ +"""Removed: ``dataretrieval.nwis`` is retired. + +USGS is decommissioning the legacy waterservices endpoints this module called +(https://waterdata.usgs.gov/blog/api-waterservices-decom/). The module is kept +only so that every spelling of the import -- ``import dataretrieval.nwis``, +``from dataretrieval import nwis``, ``from dataretrieval.nwis import get_dv`` -- +fails with a message that names the replacement, rather than a bare +``ModuleNotFoundError``. +""" + +raise ImportError( + "dataretrieval.nwis has been removed, because USGS is retiring the legacy " + "waterservices endpoints it called. Use dataretrieval.waterdata instead: " + "get_dv -> get_daily, get_iv -> get_continuous, get_info / what_sites -> " + "get_monitoring_locations, get_discharge_peaks -> get_peaks, get_stats -> " + "get_stats_por / get_stats_date_range, get_discharge_measurements / " + "get_gwlevels -> get_field_measurements, qw -> get_samples; water use is " + "dataretrieval.nwdc.get_wateruse. To keep using nwis while the endpoints " + "remain online, pin the last release that includes it: " + 'pip install "dataretrieval==1.4.0"' +) diff --git a/docs/source/architecture/decisions/0005-legacy-nwis.rst b/docs/source/architecture/decisions/0005-legacy-nwis.rst index 217d26267..67acca66b 100644 --- a/docs/source/architecture/decisions/0005-legacy-nwis.rst +++ b/docs/source/architecture/decisions/0005-legacy-nwis.rst @@ -46,7 +46,9 @@ Consequences Compliance ---------- -``import dataretrieval.nwis`` raises ``ModuleNotFoundError``. +``dataretrieval/nwis.py`` is a stub: importing it raises ``ImportError`` naming +the Water Data replacements and the last release that includes the module +(1.4.0). Notes ----- diff --git a/tests/contracts/removed_modules_test.py b/tests/contracts/removed_modules_test.py new file mode 100644 index 000000000..4edea8ed5 --- /dev/null +++ b/tests/contracts/removed_modules_test.py @@ -0,0 +1,20 @@ +"""A removed module must fail on import with a message naming what to do instead.""" + +from __future__ import annotations + +import pytest + +_NWIS_IMPORTS = [ + "import dataretrieval.nwis", + "from dataretrieval import nwis", + "from dataretrieval.nwis import get_dv", +] + + +@pytest.mark.parametrize("statement", _NWIS_IMPORTS) +def test_nwis_import_names_the_replacement_and_the_pin(statement: str) -> None: + with pytest.raises(ImportError) as excinfo: + exec(statement, {}) + message = str(excinfo.value) + assert "dataretrieval.waterdata" in message + assert 'pip install "dataretrieval==1.4.0"' in message From 494d3edf00527495a11dc20b0e2c3f595ca66802 Mon Sep 17 00:00:00 2001 From: thodson-usgs Date: Mon, 26 Oct 2026 12:21:18 -0500 Subject: [PATCH 7/9] refactor: point the nwis ImportError at modules, not getters Co-Authored-By: Claude Opus 5.5 (1M context) --- dataretrieval/nwis.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/dataretrieval/nwis.py b/dataretrieval/nwis.py index c7cb15f66..72ac3257b 100644 --- a/dataretrieval/nwis.py +++ b/dataretrieval/nwis.py @@ -10,12 +10,8 @@ raise ImportError( "dataretrieval.nwis has been removed, because USGS is retiring the legacy " - "waterservices endpoints it called. Use dataretrieval.waterdata instead: " - "get_dv -> get_daily, get_iv -> get_continuous, get_info / what_sites -> " - "get_monitoring_locations, get_discharge_peaks -> get_peaks, get_stats -> " - "get_stats_por / get_stats_date_range, get_discharge_measurements / " - "get_gwlevels -> get_field_measurements, qw -> get_samples; water use is " - "dataretrieval.nwdc.get_wateruse. To keep using nwis while the endpoints " + "waterservices endpoints it called. Use dataretrieval.waterdata instead, or " + "dataretrieval.nwdc for water use. To keep using nwis while the endpoints " "remain online, pin the last release that includes it: " 'pip install "dataretrieval==1.4.0"' ) From 8f47c2e0816f1c9aea1b9b5fdc4b4f9a90af02f5 Mon Sep 17 00:00:00 2001 From: thodson-usgs Date: Mon, 26 Oct 2026 13:43:22 -0500 Subject: [PATCH 8/9] refactor: pin nwis users to dataretrieval<=1.4.0 Co-Authored-By: Claude Opus 5.5 (1M context) --- NEWS.md | 2 +- dataretrieval/nwis.py | 2 +- tests/contracts/removed_modules_test.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NEWS.md b/NEWS.md index 626128c2f..4eadadde9 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -**10/22/2026:** **Breaking change:** `dataretrieval.nwis` is removed, ahead of its 2027-05-06 horizon, because USGS is [decommissioning the legacy waterservices endpoints](https://waterdata.usgs.gov/blog/api-waterservices-decom/) the module called. `import dataretrieval.nwis` (or any import from it) now raises `ImportError` with a message naming the replacement getters. To keep using `nwis` while the waterservices endpoints remain online, pin the last release that includes it: `pip install "dataretrieval==1.4.0"`. Migrate to the `waterdata` getters: `get_dv` -> `get_daily`, `get_iv` -> `get_continuous`, `get_info` / `what_sites` -> `get_monitoring_locations`, the data catalog -> `get_time_series_metadata`, `get_discharge_peaks` -> `get_peaks`, `get_ratings` -> `get_ratings`, `get_stats` -> `get_stats_por` / `get_stats_date_range`, `get_discharge_measurements` / `get_gwlevels` -> `get_field_measurements`, and qw -> `get_samples`; water use moves to `nwdc.get_wateruse`. **Breaking change:** `dataretrieval.exceptions.NoSitesError` (and its `dataretrieval.NoSitesError` re-export) is removed; only the waterservices path raised it, and the modern getters return an empty `DataFrame` when nothing matches. The other published deprecations are unchanged and remain on their horizons: the `get_time_series_metadata()` v0 filters (`begin_utc`, `end_utc`, `state`, `state_name`, `hydrologic_unit_code`) on or after 2027-06-01, `get_cql(service=)` on or after 2027-08-09, the `wateruse` module alias on or after 2027-08-11, and `ogc.interruptions` on or after 2027-08-25. +**10/22/2026:** **Breaking change:** `dataretrieval.nwis` is removed, ahead of its 2027-05-06 horizon, because USGS is [decommissioning the legacy waterservices endpoints](https://waterdata.usgs.gov/blog/api-waterservices-decom/) the module called. `import dataretrieval.nwis` (or any import from it) now raises `ImportError` with a message naming the replacement getters. To keep using `nwis` while the waterservices endpoints remain online, pin the last release that includes it: `pip install "dataretrieval<=1.4.0"`. Migrate to the `waterdata` getters: `get_dv` -> `get_daily`, `get_iv` -> `get_continuous`, `get_info` / `what_sites` -> `get_monitoring_locations`, the data catalog -> `get_time_series_metadata`, `get_discharge_peaks` -> `get_peaks`, `get_ratings` -> `get_ratings`, `get_stats` -> `get_stats_por` / `get_stats_date_range`, `get_discharge_measurements` / `get_gwlevels` -> `get_field_measurements`, and qw -> `get_samples`; water use moves to `nwdc.get_wateruse`. **Breaking change:** `dataretrieval.exceptions.NoSitesError` (and its `dataretrieval.NoSitesError` re-export) is removed; only the waterservices path raised it, and the modern getters return an empty `DataFrame` when nothing matches. The other published deprecations are unchanged and remain on their horizons: the `get_time_series_metadata()` v0 filters (`begin_utc`, `end_utc`, `state`, `state_name`, `hydrologic_unit_code`) on or after 2027-06-01, `get_cql(service=)` on or after 2027-08-09, the `wateruse` module alias on or after 2027-08-11, and `ogc.interruptions` on or after 2027-08-25. **10/16/2026:** **Bug fix:** the time-zone table behind the `*DateTime` columns that `waterdata.get_samples()` and `wqp.get_results()` append, and behind `utils.format_datetime()`, now follows the code lists those services use: the USGS NWIS time-zone list (Samples, and the USGS records that the Water Quality Portal passes through) and the WQX TimeZone domain (Water Quality Portal). USGS records write American Samoa as `ZP-11`, which was missing, so every timed American Samoa row from `get_samples()`, and every timed USGS American Samoa row from `get_results()`, had a `NaT` datetime; it is now UTC-11. 39 other codes from the two lists that used to become `NaT` now resolve, among them the remaining `ZP*` offsets, `IDLW`, `IDLE`, `NZT`, `SWT`, and the retired WQX codes `AHST` and `YST`. **Behavior change:** codes that the table read with a different meaning from the USGS list now take the USGS meaning: `CAST` (+9:30), `CCT` (+8), `EASST` (+11), `EAST` (+10), `NFT` (-3:30), `NZDT` (+13), `WAST` (+7), and `WAT` (-1). `FJST` is now UTC+13. Where the two lists disagree, WQX wins: `SST` stays American Samoa (UTC-11), the meaning the Water Quality Portal returns, and `BST` is UTC-11. diff --git a/dataretrieval/nwis.py b/dataretrieval/nwis.py index 72ac3257b..cd2f5bb70 100644 --- a/dataretrieval/nwis.py +++ b/dataretrieval/nwis.py @@ -13,5 +13,5 @@ "waterservices endpoints it called. Use dataretrieval.waterdata instead, or " "dataretrieval.nwdc for water use. To keep using nwis while the endpoints " "remain online, pin the last release that includes it: " - 'pip install "dataretrieval==1.4.0"' + 'pip install "dataretrieval<=1.4.0"' ) diff --git a/tests/contracts/removed_modules_test.py b/tests/contracts/removed_modules_test.py index 4edea8ed5..fe6e70e92 100644 --- a/tests/contracts/removed_modules_test.py +++ b/tests/contracts/removed_modules_test.py @@ -17,4 +17,4 @@ def test_nwis_import_names_the_replacement_and_the_pin(statement: str) -> None: exec(statement, {}) message = str(excinfo.value) assert "dataretrieval.waterdata" in message - assert 'pip install "dataretrieval==1.4.0"' in message + assert 'pip install "dataretrieval<=1.4.0"' in message From 8717ab5dbb2106521c9dedd43f2400dffa08852a Mon Sep 17 00:00:00 2001 From: thodson-usgs Date: Mon, 26 Oct 2026 13:43:33 -0500 Subject: [PATCH 9/9] docs: consolidate the NEWS entry for the nwis removal Point to the waterdata and nwdc modules instead of listing each getter, matching the nwis ImportError. Co-Authored-By: Claude Opus 5.5 (1M context) --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 4eadadde9..8a095f384 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -**10/22/2026:** **Breaking change:** `dataretrieval.nwis` is removed, ahead of its 2027-05-06 horizon, because USGS is [decommissioning the legacy waterservices endpoints](https://waterdata.usgs.gov/blog/api-waterservices-decom/) the module called. `import dataretrieval.nwis` (or any import from it) now raises `ImportError` with a message naming the replacement getters. To keep using `nwis` while the waterservices endpoints remain online, pin the last release that includes it: `pip install "dataretrieval<=1.4.0"`. Migrate to the `waterdata` getters: `get_dv` -> `get_daily`, `get_iv` -> `get_continuous`, `get_info` / `what_sites` -> `get_monitoring_locations`, the data catalog -> `get_time_series_metadata`, `get_discharge_peaks` -> `get_peaks`, `get_ratings` -> `get_ratings`, `get_stats` -> `get_stats_por` / `get_stats_date_range`, `get_discharge_measurements` / `get_gwlevels` -> `get_field_measurements`, and qw -> `get_samples`; water use moves to `nwdc.get_wateruse`. **Breaking change:** `dataretrieval.exceptions.NoSitesError` (and its `dataretrieval.NoSitesError` re-export) is removed; only the waterservices path raised it, and the modern getters return an empty `DataFrame` when nothing matches. The other published deprecations are unchanged and remain on their horizons: the `get_time_series_metadata()` v0 filters (`begin_utc`, `end_utc`, `state`, `state_name`, `hydrologic_unit_code`) on or after 2027-06-01, `get_cql(service=)` on or after 2027-08-09, the `wateruse` module alias on or after 2027-08-11, and `ogc.interruptions` on or after 2027-08-25. +**10/22/2026:** **Breaking change:** `dataretrieval.nwis` is removed, ahead of its 2027-05-06 horizon, because USGS is [decommissioning the legacy waterservices endpoints](https://waterdata.usgs.gov/blog/api-waterservices-decom/) the module called. `import dataretrieval.nwis` (or any import from it) now raises `ImportError`. Use `waterdata` instead, or `nwdc` for water use. To keep using `nwis` while the waterservices endpoints remain online, pin the last release that includes it: `pip install "dataretrieval<=1.4.0"`. **Breaking change:** `dataretrieval.exceptions.NoSitesError` (and its `dataretrieval.NoSitesError` re-export) is removed; only the waterservices path raised it, and the modern getters return an empty `DataFrame` when nothing matches. The other published deprecations are unchanged and remain on their horizons: the `get_time_series_metadata()` v0 filters (`begin_utc`, `end_utc`, `state`, `state_name`, `hydrologic_unit_code`) on or after 2027-06-01, `get_cql(service=)` on or after 2027-08-09, the `wateruse` module alias on or after 2027-08-11, and `ogc.interruptions` on or after 2027-08-25. **10/16/2026:** **Bug fix:** the time-zone table behind the `*DateTime` columns that `waterdata.get_samples()` and `wqp.get_results()` append, and behind `utils.format_datetime()`, now follows the code lists those services use: the USGS NWIS time-zone list (Samples, and the USGS records that the Water Quality Portal passes through) and the WQX TimeZone domain (Water Quality Portal). USGS records write American Samoa as `ZP-11`, which was missing, so every timed American Samoa row from `get_samples()`, and every timed USGS American Samoa row from `get_results()`, had a `NaT` datetime; it is now UTC-11. 39 other codes from the two lists that used to become `NaT` now resolve, among them the remaining `ZP*` offsets, `IDLW`, `IDLE`, `NZT`, `SWT`, and the retired WQX codes `AHST` and `YST`. **Behavior change:** codes that the table read with a different meaning from the USGS list now take the USGS meaning: `CAST` (+9:30), `CCT` (+8), `EASST` (+11), `EAST` (+10), `NFT` (-3:30), `NZDT` (+13), `WAST` (+7), and `WAT` (-1). `FJST` is now UTC+13. Where the two lists disagree, WQX wins: `SST` stays American Samoa (UTC-11), the meaning the Water Quality Portal returns, and `BST` is UTC-11.