USGS Study Package From Primitives¶
This notebook demonstrates the composable primitives in ras_commander.usgs for USGS gauge study assembly.
What You'll Learn:
- UsgsObservations — metadata, datasets, peak flow, summaries, gap analysis
- UsgsDrainageAreaComparison — multi-source area comparison with agreement status
- How to assemble a study report from primitives (notebook-local workflow)
Key Principle: Keep study packaging, readiness assessment, and report assembly in notebook or project code. The library exposes only composable primitives.
# Uncomment to install/upgrade ras-commander from pip
#!pip install --upgrade ras-commander
#Import the ras-commander package
from ras_commander import *
Development Mode¶
To test with a local development copy instead of the pip-installed package, convert this cell to code and convert the cell above to markdown:
import sys
from pathlib import Path
# Add repo root to path
notebook_dir = Path.cwd()
repo_root = notebook_dir.parent if notebook_dir.name == 'examples' else notebook_dir
if str(repo_root) not in sys.path:
sys.path.insert(0, str(repo_root))
from ras_commander import *
import json
from pathlib import Path
from ras_commander.usgs import (
UsgsObservations,
UsgsDrainageAreaComparison,
)
Gauge Metadata and Continuous Observations¶
Retrieve metadata and observation datasets for USGS gauge 05577500 (Sangamon River at Springfield, IL).
site_id = "05577500"
start_datetime = "2024-01-01"
end_datetime = "2024-12-31"
metadata = UsgsObservations.get_gauge_metadata(site_id)
print(f"Gauge: {metadata.get('station_name', 'N/A')}")
print(f"Site ID: {site_id}")
print(f"Drainage area: {metadata.get('drainage_area_sqmi', 'N/A')} sq mi")
print(f"Latitude: {metadata.get('latitude', 'N/A')}")
print(f"Longitude: {metadata.get('longitude', 'N/A')}")
assert isinstance(metadata, dict), "Metadata should be a dict"
assert 'drainage_area_sqmi' in metadata, "Should have drainage area"
print(f"\nMetadata keys: {sorted(metadata.keys())}")
Gauge: SPRING CREEK AT SPRINGFIELD, IL
Site ID: 05577500
Drainage area: 107.0 sq mi
Latitude: 39.81541667
Longitude: -89.6994167
Metadata keys: ['available_parameters', 'county', 'drainage_area_sqmi', 'gage_datum_ft', 'huc_cd', 'latitude', 'longitude', 'site_id', 'site_type', 'state', 'station_name']
continuous_flow = UsgsObservations.get_dataset(
site_id=site_id,
dataset_id="continuous_flow",
start_datetime=start_datetime,
end_datetime=end_datetime,
)
daily_flow = UsgsObservations.get_dataset(
site_id=site_id,
dataset_id="daily_flow",
start_datetime=start_datetime,
end_datetime=end_datetime,
)
print(f"Continuous flow: {len(continuous_flow)} records")
print(f"Daily flow: {len(daily_flow)} records")
assert len(continuous_flow) > 0 or len(daily_flow) > 0, "Should have flow data"
if not continuous_flow.empty:
print(f"\nContinuous flow columns: {list(continuous_flow.columns)}")
print(f"Date range: {continuous_flow.index.min()} to {continuous_flow.index.max()}")
if not daily_flow.empty:
print(f"\nDaily flow columns: {list(daily_flow.columns)}")
print(f"Date range: {daily_flow.index.min()} to {daily_flow.index.max()}")
Continuous flow: 32881 records
Daily flow: 366 records
Continuous flow columns: ['datetime', 'value']
Date range: 0 to 32880
Daily flow columns: ['datetime', 'value']
Date range: 0 to 365
Dataset Summary and Gap Analysis¶
Use summarize_dataset and analyze_gaps to build report-ready metadata for each dataset.
continuous_flow_summary = UsgsObservations.summarize_dataset(
dataset_id="continuous_flow",
frame=continuous_flow,
status="ok" if not continuous_flow.empty else "empty",
)
continuous_flow_gaps = UsgsObservations.analyze_gaps(
dataset_id="continuous_flow",
frame=continuous_flow,
)
print("=== Continuous Flow Summary ===")
for key, val in continuous_flow_summary.items():
print(f" {key}: {val}")
print("\n=== Continuous Flow Gap Analysis ===")
for key, val in continuous_flow_gaps.items():
print(f" {key}: {val}")
assert isinstance(continuous_flow_summary, dict), "Summary should be dict"
assert isinstance(continuous_flow_gaps, dict), "Gaps should be dict"
=== Continuous Flow Summary ===
dataset_id: continuous_flow
observation_type: continuous
parameter: flow
status: ok
units: cfs
record_count: 32881
file_name: continuous_flow.csv
columns: ['datetime', 'value']
start_datetime: 2024-01-01T06:00:00+00:00
end_datetime: 2025-01-01T05:45:00+00:00
error: None
=== Continuous Flow Gap Analysis ===
has_gaps: True
gap_count: 358
gap_locations: [(np.datetime64('2024-01-12T18:30:00.000000'), np.datetime64('2024-01-12T22:30:00.000000'), 15), (np.datetime64('2024-01-12T22:30:00.000000'), np.datetime64('2024-01-13T02:30:00.000000'), 15), (np.datetime64('2024-01-13T02:30:00.000000'), np.datetime64('2024-01-13T06:30:00.000000'), 15), (np.datetime64('2024-01-13T06:30:00.000000'), np.datetime64('2024-01-13T10:30:00.000000'), 15), (np.datetime64('2024-01-13T10:30:00.000000'), np.datetime64('2024-01-13T14:30:00.000000'), 15), (np.datetime64('2024-01-13T14:30:00.000000'), np.datetime64('2024-01-13T18:30:00.000000'), 15), (np.datetime64('2024-01-13T18:30:00.000000'), np.datetime64('2024-01-13T22:30:00.000000'), 15), (np.datetime64('2024-01-13T22:30:00.000000'), np.datetime64('2024-01-14T02:30:00.000000'), 15), (np.datetime64('2024-01-14T02:30:00.000000'), np.datetime64('2024-01-14T06:30:00.000000'), 15), (np.datetime64('2024-01-14T06:30:00.000000'), np.datetime64('2024-01-14T10:30:00.000000'), 15), (np.datetime64('2024-01-14T10:30:00.000000'), np.datetime64('2024-01-14T14:30:00.000000'), 15), (np.datetime64('2024-01-14T14:30:00.000000'), np.datetime64('2024-01-14T18:30:00.000000'), 15), (np.datetime64('2024-01-14T18:30:00.000000'), np.datetime64('2024-01-14T22:30:00.000000'), 15), (np.datetime64('2024-01-14T22:30:00.000000'), np.datetime64('2024-01-15T02:30:00.000000'), 15), (np.datetime64('2024-01-15T02:30:00.000000'), np.datetime64('2024-01-15T06:30:00.000000'), 15), (np.datetime64('2024-01-15T06:30:00.000000'), np.datetime64('2024-01-15T10:30:00.000000'), 15), (np.datetime64('2024-01-15T10:30:00.000000'), np.datetime64('2024-01-15T14:30:00.000000'), 15), (np.datetime64('2024-01-15T14:30:00.000000'), np.datetime64('2024-01-15T18:30:00.000000'), 15), (np.datetime64('2024-01-15T18:30:00.000000'), np.datetime64('2024-01-15T22:30:00.000000'), 15), (np.datetime64('2024-01-15T22:30:00.000000'), np.datetime64('2024-01-16T02:30:00.000000'), 15), (np.datetime64('2024-01-16T02:30:00.000000'), np.datetime64('2024-01-16T06:30:00.000000'), 15), (np.datetime64('2024-01-16T06:30:00.000000'), np.datetime64('2024-01-16T10:30:00.000000'), 15), (np.datetime64('2024-01-16T10:30:00.000000'), np.datetime64('2024-01-16T14:30:00.000000'), 15), (np.datetime64('2024-01-16T14:30:00.000000'), np.datetime64('2024-01-16T18:30:00.000000'), 15), (np.datetime64('2024-01-16T18:30:00.000000'), np.datetime64('2024-01-16T22:30:00.000000'), 15), (np.datetime64('2024-01-16T22:30:00.000000'), np.datetime64('2024-01-17T02:30:00.000000'), 15), (np.datetime64('2024-01-17T02:30:00.000000'), np.datetime64('2024-01-17T06:30:00.000000'), 15), (np.datetime64('2024-01-17T06:30:00.000000'), np.datetime64('2024-01-17T10:30:00.000000'), 15), (np.datetime64('2024-01-17T10:30:00.000000'), np.datetime64('2024-01-17T14:30:00.000000'), 15), (np.datetime64('2024-01-17T14:30:00.000000'), np.datetime64('2024-01-17T18:30:00.000000'), 15), (np.datetime64('2024-01-17T18:30:00.000000'), np.datetime64('2024-01-17T22:30:00.000000'), 15), (np.datetime64('2024-01-17T22:30:00.000000'), np.datetime64('2024-01-18T02:30:00.000000'), 15), (np.datetime64('2024-01-18T02:30:00.000000'), np.datetime64('2024-01-18T06:30:00.000000'), 15), (np.datetime64('2024-01-18T06:30:00.000000'), np.datetime64('2024-01-18T10:30:00.000000'), 15), (np.datetime64('2024-01-18T10:30:00.000000'), np.datetime64('2024-01-18T14:30:00.000000'), 15), (np.datetime64('2024-01-18T14:30:00.000000'), np.datetime64('2024-01-18T18:30:00.000000'), 15), (np.datetime64('2024-01-18T18:30:00.000000'), np.datetime64('2024-01-18T22:30:00.000000'), 15), (np.datetime64('2024-01-18T22:30:00.000000'), np.datetime64('2024-01-19T02:30:00.000000'), 15), (np.datetime64('2024-01-19T02:30:00.000000'), np.datetime64('2024-01-19T06:30:00.000000'), 15), (np.datetime64('2024-01-19T06:30:00.000000'), np.datetime64('2024-01-19T10:30:00.000000'), 15), (np.datetime64('2024-01-19T10:30:00.000000'), np.datetime64('2024-01-19T14:30:00.000000'), 15), (np.datetime64('2024-01-19T14:30:00.000000'), np.datetime64('2024-01-19T18:30:00.000000'), 15), (np.datetime64('2024-01-19T18:30:00.000000'), np.datetime64('2024-01-19T22:30:00.000000'), 15), (np.datetime64('2024-01-19T22:30:00.000000'), np.datetime64('2024-01-20T02:30:00.000000'), 15), (np.datetime64('2024-01-20T02:30:00.000000'), np.datetime64('2024-01-20T06:30:00.000000'), 15), (np.datetime64('2024-01-20T06:30:00.000000'), np.datetime64('2024-01-20T10:30:00.000000'), 15), (np.datetime64('2024-01-20T10:30:00.000000'), np.datetime64('2024-01-20T14:30:00.000000'), 15), (np.datetime64('2024-01-20T14:30:00.000000'), np.datetime64('2024-01-20T18:30:00.000000'), 15), (np.datetime64('2024-01-20T18:30:00.000000'), np.datetime64('2024-01-20T22:30:00.000000'), 15), (np.datetime64('2024-01-20T22:30:00.000000'), np.datetime64('2024-01-21T02:30:00.000000'), 15), (np.datetime64('2024-01-21T02:30:00.000000'), np.datetime64('2024-01-21T06:30:00.000000'), 15), (np.datetime64('2024-01-21T06:30:00.000000'), np.datetime64('2024-01-21T10:30:00.000000'), 15), (np.datetime64('2024-01-21T10:30:00.000000'), np.datetime64('2024-01-21T14:30:00.000000'), 15), (np.datetime64('2024-01-21T14:30:00.000000'), np.datetime64('2024-01-21T18:30:00.000000'), 15), (np.datetime64('2024-01-21T18:30:00.000000'), np.datetime64('2024-01-21T22:30:00.000000'), 15), (np.datetime64('2024-01-21T22:30:00.000000'), np.datetime64('2024-01-22T02:30:00.000000'), 15), (np.datetime64('2024-01-22T02:30:00.000000'), np.datetime64('2024-01-22T06:30:00.000000'), 15), (np.datetime64('2024-01-22T06:30:00.000000'), np.datetime64('2024-01-22T10:30:00.000000'), 15), (np.datetime64('2024-01-22T10:30:00.000000'), np.datetime64('2024-01-22T14:30:00.000000'), 15), (np.datetime64('2024-01-22T14:30:00.000000'), np.datetime64('2024-01-22T18:30:00.000000'), 15), (np.datetime64('2024-01-22T18:30:00.000000'), np.datetime64('2024-01-22T22:30:00.000000'), 15), (np.datetime64('2024-01-22T22:30:00.000000'), np.datetime64('2024-01-23T02:30:00.000000'), 15), (np.datetime64('2024-01-23T02:30:00.000000'), np.datetime64('2024-01-23T06:30:00.000000'), 15), (np.datetime64('2024-01-23T06:30:00.000000'), np.datetime64('2024-01-23T10:30:00.000000'), 15), (np.datetime64('2024-01-23T10:30:00.000000'), np.datetime64('2024-01-23T14:30:00.000000'), 15), (np.datetime64('2024-01-23T14:30:00.000000'), np.datetime64('2024-01-23T18:30:00.000000'), 15), (np.datetime64('2024-01-23T18:30:00.000000'), np.datetime64('2024-01-23T22:30:00.000000'), 15), (np.datetime64('2024-01-23T22:30:00.000000'), np.datetime64('2024-01-24T02:30:00.000000'), 15), (np.datetime64('2024-01-24T02:30:00.000000'), np.datetime64('2024-01-24T06:30:00.000000'), 15), (np.datetime64('2024-01-24T06:30:00.000000'), np.datetime64('2024-01-24T10:30:00.000000'), 15), (np.datetime64('2024-01-24T10:30:00.000000'), np.datetime64('2024-01-24T14:30:00.000000'), 15), (np.datetime64('2024-01-24T14:30:00.000000'), np.datetime64('2024-01-24T18:30:00.000000'), 15), (np.datetime64('2024-01-24T18:30:00.000000'), np.datetime64('2024-01-24T22:30:00.000000'), 15), (np.datetime64('2024-01-24T22:30:00.000000'), np.datetime64('2024-01-25T02:30:00.000000'), 15), (np.datetime64('2024-01-25T02:30:00.000000'), np.datetime64('2024-01-25T06:30:00.000000'), 15), (np.datetime64('2024-01-25T06:30:00.000000'), np.datetime64('2024-01-25T10:30:00.000000'), 15), (np.datetime64('2024-01-25T10:30:00.000000'), np.datetime64('2024-01-25T14:30:00.000000'), 15), (np.datetime64('2024-01-25T14:30:00.000000'), np.datetime64('2024-01-25T18:30:00.000000'), 15), (np.datetime64('2024-01-25T18:30:00.000000'), np.datetime64('2024-01-25T22:30:00.000000'), 15), (np.datetime64('2024-01-25T22:30:00.000000'), np.datetime64('2024-01-26T02:30:00.000000'), 15), (np.datetime64('2024-01-26T02:30:00.000000'), np.datetime64('2024-01-26T06:30:00.000000'), 15), (np.datetime64('2024-01-26T06:30:00.000000'), np.datetime64('2024-01-26T10:30:00.000000'), 15), (np.datetime64('2024-01-26T10:30:00.000000'), np.datetime64('2024-01-26T14:30:00.000000'), 15), (np.datetime64('2024-01-26T14:30:00.000000'), np.datetime64('2024-01-26T18:15:00.000000'), 14), (np.datetime64('2024-02-02T11:30:00.000000'), np.datetime64('2024-02-02T12:00:00.000000'), 1), (np.datetime64('2024-02-02T12:15:00.000000'), np.datetime64('2024-02-02T12:45:00.000000'), 1), (np.datetime64('2024-02-02T13:30:00.000000'), np.datetime64('2024-02-02T14:00:00.000000'), 1), (np.datetime64('2024-02-02T14:15:00.000000'), np.datetime64('2024-02-02T14:45:00.000000'), 1), (np.datetime64('2024-02-02T14:45:00.000000'), np.datetime64('2024-02-02T15:30:00.000000'), 2), (np.datetime64('2024-02-02T15:30:00.000000'), np.datetime64('2024-02-02T16:00:00.000000'), 1), (np.datetime64('2024-02-02T19:45:00.000000'), np.datetime64('2024-02-02T20:15:00.000000'), 1), (np.datetime64('2024-02-02T23:15:00.000000'), np.datetime64('2024-02-02T23:45:00.000000'), 1), (np.datetime64('2024-02-02T23:45:00.000000'), np.datetime64('2024-02-03T00:15:00.000000'), 1), (np.datetime64('2024-02-03T01:00:00.000000'), np.datetime64('2024-02-03T01:30:00.000000'), 1), (np.datetime64('2024-02-03T14:30:00.000000'), np.datetime64('2024-02-03T15:00:00.000000'), 1), (np.datetime64('2024-02-03T17:15:00.000000'), np.datetime64('2024-02-03T17:45:00.000000'), 1), (np.datetime64('2024-02-03T17:45:00.000000'), np.datetime64('2024-02-03T18:15:00.000000'), 1), (np.datetime64('2024-02-03T20:30:00.000000'), np.datetime64('2024-02-03T21:00:00.000000'), 1), (np.datetime64('2024-02-03T23:15:00.000000'), np.datetime64('2024-02-03T23:45:00.000000'), 1), (np.datetime64('2024-02-04T01:30:00.000000'), np.datetime64('2024-02-04T02:00:00.000000'), 1), (np.datetime64('2024-02-04T03:15:00.000000'), np.datetime64('2024-02-04T03:45:00.000000'), 1), (np.datetime64('2024-02-04T08:15:00.000000'), np.datetime64('2024-02-04T09:15:00.000000'), 3), (np.datetime64('2024-02-04T09:30:00.000000'), np.datetime64('2024-02-04T10:00:00.000000'), 1), (np.datetime64('2024-02-04T10:30:00.000000'), np.datetime64('2024-02-04T11:00:00.000000'), 1), (np.datetime64('2024-02-04T11:45:00.000000'), np.datetime64('2024-02-04T12:15:00.000000'), 1), (np.datetime64('2024-02-04T12:30:00.000000'), np.datetime64('2024-02-04T13:00:00.000000'), 1), (np.datetime64('2024-02-04T13:15:00.000000'), np.datetime64('2024-02-04T13:45:00.000000'), 1), (np.datetime64('2024-02-04T13:45:00.000000'), np.datetime64('2024-02-04T14:30:00.000000'), 2), (np.datetime64('2024-02-04T14:30:00.000000'), np.datetime64('2024-02-04T15:00:00.000000'), 1), (np.datetime64('2024-02-04T15:45:00.000000'), np.datetime64('2024-02-04T16:15:00.000000'), 1), (np.datetime64('2024-02-04T16:15:00.000000'), np.datetime64('2024-02-04T16:45:00.000000'), 1), (np.datetime64('2024-02-04T16:45:00.000000'), np.datetime64('2024-02-04T17:15:00.000000'), 1), (np.datetime64('2024-02-04T19:15:00.000000'), np.datetime64('2024-02-04T19:45:00.000000'), 1), (np.datetime64('2024-02-04T22:00:00.000000'), np.datetime64('2024-02-04T22:30:00.000000'), 1), (np.datetime64('2024-04-07T03:45:00.000000'), np.datetime64('2024-04-07T04:15:00.000000'), 1), (np.datetime64('2024-04-07T07:00:00.000000'), np.datetime64('2024-04-07T07:30:00.000000'), 1), (np.datetime64('2024-04-07T08:00:00.000000'), np.datetime64('2024-04-07T08:30:00.000000'), 1), (np.datetime64('2024-04-07T11:30:00.000000'), np.datetime64('2024-04-07T12:00:00.000000'), 1), (np.datetime64('2024-04-07T12:00:00.000000'), np.datetime64('2024-04-07T12:30:00.000000'), 1), (np.datetime64('2024-04-07T13:15:00.000000'), np.datetime64('2024-04-07T13:45:00.000000'), 1), (np.datetime64('2024-04-07T13:45:00.000000'), np.datetime64('2024-04-07T14:15:00.000000'), 1), (np.datetime64('2024-04-07T14:15:00.000000'), np.datetime64('2024-04-07T14:45:00.000000'), 1), (np.datetime64('2024-04-07T17:00:00.000000'), np.datetime64('2024-04-07T17:30:00.000000'), 1), (np.datetime64('2024-04-07T17:45:00.000000'), np.datetime64('2024-04-07T18:15:00.000000'), 1), (np.datetime64('2024-04-07T18:15:00.000000'), np.datetime64('2024-04-07T18:45:00.000000'), 1), (np.datetime64('2024-04-07T18:45:00.000000'), np.datetime64('2024-04-07T19:15:00.000000'), 1), (np.datetime64('2024-04-07T21:30:00.000000'), np.datetime64('2024-04-07T22:00:00.000000'), 1), (np.datetime64('2024-04-07T22:15:00.000000'), np.datetime64('2024-04-07T22:45:00.000000'), 1), (np.datetime64('2024-04-10T14:15:00.000000'), np.datetime64('2024-04-10T14:45:00.000000'), 1), (np.datetime64('2024-04-10T15:30:00.000000'), np.datetime64('2024-04-10T16:00:00.000000'), 1), (np.datetime64('2024-04-10T17:30:00.000000'), np.datetime64('2024-04-10T18:00:00.000000'), 1), (np.datetime64('2024-04-11T03:45:00.000000'), np.datetime64('2024-04-11T04:30:00.000000'), 2), (np.datetime64('2024-04-11T21:30:00.000000'), np.datetime64('2024-04-11T22:00:00.000000'), 1), (np.datetime64('2024-04-12T01:15:00.000000'), np.datetime64('2024-04-12T01:45:00.000000'), 1), (np.datetime64('2024-04-12T17:15:00.000000'), np.datetime64('2024-04-12T18:15:00.000000'), 3), (np.datetime64('2024-04-15T18:45:00.000000'), np.datetime64('2024-04-15T19:15:00.000000'), 1), (np.datetime64('2024-04-16T01:45:00.000000'), np.datetime64('2024-04-16T02:15:00.000000'), 1), (np.datetime64('2024-04-16T12:00:00.000000'), np.datetime64('2024-04-16T12:30:00.000000'), 1), (np.datetime64('2024-04-16T13:00:00.000000'), np.datetime64('2024-04-16T13:30:00.000000'), 1), (np.datetime64('2024-04-16T14:00:00.000000'), np.datetime64('2024-04-16T14:30:00.000000'), 1), (np.datetime64('2024-04-16T14:45:00.000000'), np.datetime64('2024-04-16T15:15:00.000000'), 1), (np.datetime64('2024-04-16T15:15:00.000000'), np.datetime64('2024-04-16T15:45:00.000000'), 1), (np.datetime64('2024-04-16T15:45:00.000000'), np.datetime64('2024-04-16T16:15:00.000000'), 1), (np.datetime64('2024-04-16T16:30:00.000000'), np.datetime64('2024-04-16T17:00:00.000000'), 1), (np.datetime64('2024-04-16T17:15:00.000000'), np.datetime64('2024-04-16T18:15:00.000000'), 3), (np.datetime64('2024-04-16T18:15:00.000000'), np.datetime64('2024-04-16T19:15:00.000000'), 3), (np.datetime64('2024-04-16T19:30:00.000000'), np.datetime64('2024-04-16T20:45:00.000000'), 4), (np.datetime64('2024-04-16T21:00:00.000000'), np.datetime64('2024-04-16T21:30:00.000000'), 1), (np.datetime64('2024-04-16T23:00:00.000000'), np.datetime64('2024-04-16T23:30:00.000000'), 1), (np.datetime64('2024-04-17T00:00:00.000000'), np.datetime64('2024-04-17T00:30:00.000000'), 1), (np.datetime64('2024-04-17T05:15:00.000000'), np.datetime64('2024-04-17T05:45:00.000000'), 1), (np.datetime64('2024-04-17T12:45:00.000000'), np.datetime64('2024-04-17T13:45:00.000000'), 3), (np.datetime64('2024-04-17T13:45:00.000000'), np.datetime64('2024-04-17T14:15:00.000000'), 1), (np.datetime64('2024-04-17T14:15:00.000000'), np.datetime64('2024-04-17T14:45:00.000000'), 1), (np.datetime64('2024-04-17T14:45:00.000000'), np.datetime64('2024-04-17T15:15:00.000000'), 1), (np.datetime64('2024-04-17T15:30:00.000000'), np.datetime64('2024-04-17T16:00:00.000000'), 1), (np.datetime64('2024-04-17T17:00:00.000000'), np.datetime64('2024-04-17T17:30:00.000000'), 1), (np.datetime64('2024-04-17T17:30:00.000000'), np.datetime64('2024-04-17T18:00:00.000000'), 1), (np.datetime64('2024-04-17T18:15:00.000000'), np.datetime64('2024-04-17T18:45:00.000000'), 1), (np.datetime64('2024-04-17T20:45:00.000000'), np.datetime64('2024-04-17T21:15:00.000000'), 1), (np.datetime64('2024-04-18T15:30:00.000000'), np.datetime64('2024-04-18T16:00:00.000000'), 1), (np.datetime64('2024-04-18T18:00:00.000000'), np.datetime64('2024-04-18T18:30:00.000000'), 1), (np.datetime64('2024-04-18T18:45:00.000000'), np.datetime64('2024-04-18T20:00:00.000000'), 4), (np.datetime64('2024-04-18T20:15:00.000000'), np.datetime64('2024-04-18T20:45:00.000000'), 1), (np.datetime64('2024-04-18T23:45:00.000000'), np.datetime64('2024-04-19T00:15:00.000000'), 1), (np.datetime64('2024-04-19T00:15:00.000000'), np.datetime64('2024-04-19T00:45:00.000000'), 1), (np.datetime64('2024-04-19T18:00:00.000000'), np.datetime64('2024-04-19T18:30:00.000000'), 1), (np.datetime64('2024-04-20T23:00:00.000000'), np.datetime64('2024-04-20T23:30:00.000000'), 1), (np.datetime64('2024-04-20T23:45:00.000000'), np.datetime64('2024-04-21T00:15:00.000000'), 1), (np.datetime64('2024-04-21T21:15:00.000000'), np.datetime64('2024-04-21T21:45:00.000000'), 1), (np.datetime64('2024-04-22T16:00:00.000000'), np.datetime64('2024-04-22T16:45:00.000000'), 2), (np.datetime64('2024-04-22T20:15:00.000000'), np.datetime64('2024-04-22T20:45:00.000000'), 1), (np.datetime64('2024-04-23T17:30:00.000000'), np.datetime64('2024-04-23T18:00:00.000000'), 1), (np.datetime64('2024-04-25T15:00:00.000000'), np.datetime64('2024-04-25T15:30:00.000000'), 1), (np.datetime64('2024-04-25T17:30:00.000000'), np.datetime64('2024-04-25T18:00:00.000000'), 1), (np.datetime64('2024-04-25T19:00:00.000000'), np.datetime64('2024-04-25T19:30:00.000000'), 1), (np.datetime64('2024-04-25T19:30:00.000000'), np.datetime64('2024-04-25T20:00:00.000000'), 1), (np.datetime64('2024-04-26T08:15:00.000000'), np.datetime64('2024-04-26T08:45:00.000000'), 1), (np.datetime64('2024-04-26T10:30:00.000000'), np.datetime64('2024-04-26T11:00:00.000000'), 1), (np.datetime64('2024-04-26T13:15:00.000000'), np.datetime64('2024-04-26T14:00:00.000000'), 2), (np.datetime64('2024-04-26T14:00:00.000000'), np.datetime64('2024-04-26T14:30:00.000000'), 1), (np.datetime64('2024-04-27T16:00:00.000000'), np.datetime64('2024-04-27T16:30:00.000000'), 1), (np.datetime64('2024-04-27T17:15:00.000000'), np.datetime64('2024-04-27T17:45:00.000000'), 1), (np.datetime64('2024-04-27T17:45:00.000000'), np.datetime64('2024-04-27T18:15:00.000000'), 1), (np.datetime64('2024-04-27T18:15:00.000000'), np.datetime64('2024-04-27T18:45:00.000000'), 1), (np.datetime64('2024-04-28T19:00:00.000000'), np.datetime64('2024-04-28T19:45:00.000000'), 2), (np.datetime64('2024-04-29T05:30:00.000000'), np.datetime64('2024-04-29T06:00:00.000000'), 1), (np.datetime64('2024-05-02T12:30:00.000000'), np.datetime64('2024-05-02T13:00:00.000000'), 1), (np.datetime64('2024-05-02T19:15:00.000000'), np.datetime64('2024-05-02T19:45:00.000000'), 1), (np.datetime64('2024-05-03T03:30:00.000000'), np.datetime64('2024-05-03T04:00:00.000000'), 1), (np.datetime64('2024-05-04T16:00:00.000000'), np.datetime64('2024-05-04T16:30:00.000000'), 1), (np.datetime64('2024-05-04T20:00:00.000000'), np.datetime64('2024-05-04T20:30:00.000000'), 1), (np.datetime64('2024-05-04T22:15:00.000000'), np.datetime64('2024-05-04T22:45:00.000000'), 1), (np.datetime64('2024-05-07T09:45:00.000000'), np.datetime64('2024-05-07T10:15:00.000000'), 1), (np.datetime64('2024-05-07T10:45:00.000000'), np.datetime64('2024-05-07T11:15:00.000000'), 1), (np.datetime64('2024-05-07T19:15:00.000000'), np.datetime64('2024-05-07T19:45:00.000000'), 1), (np.datetime64('2024-05-12T16:00:00.000000'), np.datetime64('2024-05-12T16:30:00.000000'), 1), (np.datetime64('2024-05-12T18:00:00.000000'), np.datetime64('2024-05-12T18:30:00.000000'), 1), (np.datetime64('2024-05-13T20:15:00.000000'), np.datetime64('2024-05-13T20:45:00.000000'), 1), (np.datetime64('2024-05-13T21:00:00.000000'), np.datetime64('2024-05-13T21:30:00.000000'), 1), (np.datetime64('2024-05-14T15:00:00.000000'), np.datetime64('2024-05-14T15:45:00.000000'), 2), (np.datetime64('2024-05-16T16:00:00.000000'), np.datetime64('2024-05-16T16:30:00.000000'), 1), (np.datetime64('2024-05-16T16:45:00.000000'), np.datetime64('2024-05-16T17:15:00.000000'), 1), (np.datetime64('2024-05-20T14:15:00.000000'), np.datetime64('2024-05-20T15:15:00.000000'), 3), (np.datetime64('2024-05-20T15:15:00.000000'), np.datetime64('2024-05-20T16:00:00.000000'), 2), (np.datetime64('2024-05-20T16:00:00.000000'), np.datetime64('2024-05-20T16:30:00.000000'), 1), (np.datetime64('2024-05-20T21:00:00.000000'), np.datetime64('2024-05-20T22:00:00.000000'), 3), (np.datetime64('2024-05-20T22:00:00.000000'), np.datetime64('2024-05-20T22:30:00.000000'), 1), (np.datetime64('2024-05-21T15:00:00.000000'), np.datetime64('2024-05-21T15:30:00.000000'), 1), (np.datetime64('2024-05-21T15:45:00.000000'), np.datetime64('2024-05-21T17:00:00.000000'), 4), (np.datetime64('2024-05-21T17:00:00.000000'), np.datetime64('2024-05-21T17:30:00.000000'), 1), (np.datetime64('2024-05-21T17:45:00.000000'), np.datetime64('2024-05-21T19:00:00.000000'), 4), (np.datetime64('2024-05-21T19:00:00.000000'), np.datetime64('2024-05-21T20:00:00.000000'), 3), (np.datetime64('2024-05-21T20:15:00.000000'), np.datetime64('2024-05-21T21:45:00.000000'), 5), (np.datetime64('2024-05-21T21:45:00.000000'), np.datetime64('2024-05-21T22:45:00.000000'), 3), (np.datetime64('2024-05-21T22:45:00.000000'), np.datetime64('2024-05-21T23:15:00.000000'), 1), (np.datetime64('2024-05-21T23:30:00.000000'), np.datetime64('2024-05-22T00:45:00.000000'), 4), (np.datetime64('2024-05-22T00:45:00.000000'), np.datetime64('2024-05-22T02:00:00.000000'), 4), (np.datetime64('2024-05-22T02:15:00.000000'), np.datetime64('2024-05-22T02:45:00.000000'), 1), (np.datetime64('2024-05-22T02:45:00.000000'), np.datetime64('2024-05-22T03:30:00.000000'), 2), (np.datetime64('2024-05-22T05:45:00.000000'), np.datetime64('2024-05-22T06:15:00.000000'), 1), (np.datetime64('2024-05-22T06:45:00.000000'), np.datetime64('2024-05-22T07:30:00.000000'), 2), (np.datetime64('2024-05-22T14:15:00.000000'), np.datetime64('2024-05-22T14:45:00.000000'), 1), (np.datetime64('2024-05-22T15:00:00.000000'), np.datetime64('2024-05-22T15:45:00.000000'), 2), (np.datetime64('2024-05-22T15:45:00.000000'), np.datetime64('2024-05-22T16:15:00.000000'), 1), (np.datetime64('2024-05-22T16:15:00.000000'), np.datetime64('2024-05-22T16:45:00.000000'), 1), (np.datetime64('2024-05-22T20:00:00.000000'), np.datetime64('2024-05-22T20:45:00.000000'), 2), (np.datetime64('2024-05-23T16:45:00.000000'), np.datetime64('2024-05-23T17:15:00.000000'), 1), (np.datetime64('2024-05-23T21:45:00.000000'), np.datetime64('2024-05-23T22:15:00.000000'), 1), (np.datetime64('2024-05-24T18:30:00.000000'), np.datetime64('2024-05-24T19:00:00.000000'), 1), (np.datetime64('2024-05-26T12:00:00.000000'), np.datetime64('2024-05-26T12:45:00.000000'), 2), (np.datetime64('2024-05-28T02:00:00.000000'), np.datetime64('2024-05-28T02:30:00.000000'), 1), (np.datetime64('2024-05-28T21:15:00.000000'), np.datetime64('2024-05-28T21:45:00.000000'), 1), (np.datetime64('2024-05-29T14:15:00.000000'), np.datetime64('2024-05-29T14:45:00.000000'), 1), (np.datetime64('2024-05-29T15:45:00.000000'), np.datetime64('2024-05-29T16:15:00.000000'), 1), (np.datetime64('2024-05-29T16:15:00.000000'), np.datetime64('2024-05-29T16:45:00.000000'), 1), (np.datetime64('2024-05-29T17:00:00.000000'), np.datetime64('2024-05-29T17:30:00.000000'), 1), (np.datetime64('2024-05-30T16:30:00.000000'), np.datetime64('2024-05-30T17:00:00.000000'), 1), (np.datetime64('2024-05-30T20:15:00.000000'), np.datetime64('2024-05-30T20:45:00.000000'), 1), (np.datetime64('2024-05-30T23:45:00.000000'), np.datetime64('2024-05-31T00:15:00.000000'), 1), (np.datetime64('2024-05-31T00:15:00.000000'), np.datetime64('2024-05-31T00:45:00.000000'), 1), (np.datetime64('2024-06-01T22:00:00.000000'), np.datetime64('2024-06-01T22:45:00.000000'), 2), (np.datetime64('2024-06-01T22:45:00.000000'), np.datetime64('2024-06-01T23:30:00.000000'), 2), (np.datetime64('2024-06-03T20:00:00.000000'), np.datetime64('2024-06-03T20:30:00.000000'), 1), (np.datetime64('2024-06-08T19:00:00.000000'), np.datetime64('2024-06-08T19:45:00.000000'), 2), (np.datetime64('2024-06-08T20:00:00.000000'), np.datetime64('2024-06-08T20:30:00.000000'), 1), (np.datetime64('2024-06-08T20:45:00.000000'), np.datetime64('2024-06-08T21:15:00.000000'), 1), (np.datetime64('2024-06-10T16:15:00.000000'), np.datetime64('2024-06-10T16:45:00.000000'), 1), (np.datetime64('2024-06-10T18:00:00.000000'), np.datetime64('2024-06-10T18:30:00.000000'), 1), (np.datetime64('2024-06-10T19:45:00.000000'), np.datetime64('2024-06-10T20:15:00.000000'), 1), (np.datetime64('2024-06-10T20:15:00.000000'), np.datetime64('2024-06-10T21:00:00.000000'), 2), (np.datetime64('2024-06-14T00:45:00.000000'), np.datetime64('2024-06-14T01:30:00.000000'), 2), (np.datetime64('2024-06-16T20:00:00.000000'), np.datetime64('2024-06-16T20:30:00.000000'), 1), (np.datetime64('2024-06-17T16:45:00.000000'), np.datetime64('2024-06-17T17:15:00.000000'), 1), (np.datetime64('2024-06-17T21:15:00.000000'), np.datetime64('2024-06-17T21:45:00.000000'), 1), (np.datetime64('2024-06-18T19:30:00.000000'), np.datetime64('2024-06-18T20:00:00.000000'), 1), (np.datetime64('2024-06-22T15:00:00.000000'), np.datetime64('2024-06-22T15:45:00.000000'), 2), (np.datetime64('2024-06-22T17:00:00.000000'), np.datetime64('2024-06-22T17:30:00.000000'), 1), (np.datetime64('2024-06-23T07:30:00.000000'), np.datetime64('2024-06-23T08:00:00.000000'), 1), (np.datetime64('2024-06-23T23:00:00.000000'), np.datetime64('2024-06-23T23:30:00.000000'), 1), (np.datetime64('2024-06-27T13:15:00.000000'), np.datetime64('2024-06-27T13:45:00.000000'), 1), (np.datetime64('2024-06-30T09:15:00.000000'), np.datetime64('2024-06-30T09:45:00.000000'), 1), (np.datetime64('2024-06-30T12:45:00.000000'), np.datetime64('2024-06-30T13:15:00.000000'), 1), (np.datetime64('2024-06-30T15:15:00.000000'), np.datetime64('2024-06-30T15:45:00.000000'), 1), (np.datetime64('2024-06-30T17:00:00.000000'), np.datetime64('2024-06-30T17:30:00.000000'), 1), (np.datetime64('2024-06-30T18:00:00.000000'), np.datetime64('2024-06-30T18:45:00.000000'), 2), (np.datetime64('2024-06-30T19:00:00.000000'), np.datetime64('2024-06-30T20:00:00.000000'), 3), (np.datetime64('2024-06-30T20:30:00.000000'), np.datetime64('2024-06-30T21:00:00.000000'), 1), (np.datetime64('2024-06-30T21:00:00.000000'), np.datetime64('2024-06-30T21:30:00.000000'), 1), (np.datetime64('2024-07-16T06:45:00.000000'), np.datetime64('2024-07-16T07:15:00.000000'), 1), (np.datetime64('2024-07-17T21:45:00.000000'), np.datetime64('2024-07-17T22:15:00.000000'), 1), (np.datetime64('2024-07-18T17:00:00.000000'), np.datetime64('2024-07-18T17:30:00.000000'), 1), (np.datetime64('2024-07-25T09:45:00.000000'), np.datetime64('2024-07-25T10:15:00.000000'), 1), (np.datetime64('2024-07-28T02:30:00.000000'), np.datetime64('2024-07-28T03:15:00.000000'), 2), (np.datetime64('2024-07-30T12:45:00.000000'), np.datetime64('2024-07-30T13:30:00.000000'), 2), (np.datetime64('2024-08-01T08:30:00.000000'), np.datetime64('2024-08-01T09:00:00.000000'), 1), (np.datetime64('2024-08-13T17:15:00.000000'), np.datetime64('2024-08-13T17:45:00.000000'), 1), (np.datetime64('2024-08-15T09:45:00.000000'), np.datetime64('2024-08-15T10:15:00.000000'), 1), (np.datetime64('2024-08-15T12:30:00.000000'), np.datetime64('2024-08-15T13:00:00.000000'), 1), (np.datetime64('2024-08-18T17:30:00.000000'), np.datetime64('2024-08-18T18:00:00.000000'), 1), (np.datetime64('2024-08-18T18:30:00.000000'), np.datetime64('2024-08-18T19:00:00.000000'), 1), (np.datetime64('2024-08-18T21:30:00.000000'), np.datetime64('2024-08-18T22:00:00.000000'), 1), (np.datetime64('2024-08-19T18:00:00.000000'), np.datetime64('2024-08-19T18:30:00.000000'), 1), (np.datetime64('2024-08-28T06:30:00.000000'), np.datetime64('2024-08-28T07:00:00.000000'), 1), (np.datetime64('2024-09-01T19:45:00.000000'), np.datetime64('2024-09-01T20:15:00.000000'), 1), (np.datetime64('2024-09-01T21:45:00.000000'), np.datetime64('2024-09-01T22:15:00.000000'), 1), (np.datetime64('2024-09-06T20:15:00.000000'), np.datetime64('2024-09-06T21:15:00.000000'), 3), (np.datetime64('2024-09-15T00:30:00.000000'), np.datetime64('2024-09-15T01:00:00.000000'), 1), (np.datetime64('2024-09-15T20:00:00.000000'), np.datetime64('2024-09-15T20:30:00.000000'), 1), (np.datetime64('2024-09-15T21:15:00.000000'), np.datetime64('2024-09-15T21:45:00.000000'), 1), (np.datetime64('2024-09-21T18:30:00.000000'), np.datetime64('2024-09-21T19:30:00.000000'), 3), (np.datetime64('2024-09-22T08:30:00.000000'), np.datetime64('2024-09-22T09:00:00.000000'), 1), (np.datetime64('2024-09-23T17:15:00.000000'), np.datetime64('2024-09-23T18:15:00.000000'), 3), (np.datetime64('2024-09-24T09:15:00.000000'), np.datetime64('2024-09-24T09:45:00.000000'), 1), (np.datetime64('2024-09-24T12:30:00.000000'), np.datetime64('2024-09-24T13:15:00.000000'), 2), (np.datetime64('2024-09-26T16:00:00.000000'), np.datetime64('2024-09-26T17:15:00.000000'), 4), (np.datetime64('2024-09-28T03:45:00.000000'), np.datetime64('2024-09-28T04:15:00.000000'), 1), (np.datetime64('2024-09-28T08:45:00.000000'), np.datetime64('2024-09-28T09:15:00.000000'), 1), (np.datetime64('2024-09-28T15:45:00.000000'), np.datetime64('2024-09-28T16:15:00.000000'), 1), (np.datetime64('2024-09-29T19:45:00.000000'), np.datetime64('2024-09-29T20:15:00.000000'), 1), (np.datetime64('2024-10-04T13:45:00.000000'), np.datetime64('2024-10-04T14:15:00.000000'), 1), (np.datetime64('2024-10-25T07:30:00.000000'), np.datetime64('2024-10-25T08:00:00.000000'), 1), (np.datetime64('2024-11-25T22:45:00.000000'), np.datetime64('2024-11-25T23:15:00.000000'), 1), (np.datetime64('2024-11-26T02:15:00.000000'), np.datetime64('2024-11-26T02:45:00.000000'), 1), (np.datetime64('2024-11-27T20:30:00.000000'), np.datetime64('2024-11-27T21:00:00.000000'), 1), (np.datetime64('2024-11-27T21:00:00.000000'), np.datetime64('2024-11-27T21:30:00.000000'), 1), (np.datetime64('2024-11-28T17:00:00.000000'), np.datetime64('2024-11-28T17:30:00.000000'), 1), (np.datetime64('2024-11-29T14:30:00.000000'), np.datetime64('2024-11-29T15:00:00.000000'), 1), (np.datetime64('2024-12-02T10:15:00.000000'), np.datetime64('2024-12-02T22:15:00.000000'), 47), (np.datetime64('2024-12-02T22:15:00.000000'), np.datetime64('2024-12-03T10:15:00.000000'), 47), (np.datetime64('2024-12-03T10:15:00.000000'), np.datetime64('2024-12-03T22:15:00.000000'), 47), (np.datetime64('2024-12-03T22:15:00.000000'), np.datetime64('2024-12-04T10:15:00.000000'), 47), (np.datetime64('2024-12-04T10:15:00.000000'), np.datetime64('2024-12-04T22:15:00.000000'), 47), (np.datetime64('2024-12-04T22:15:00.000000'), np.datetime64('2024-12-05T10:15:00.000000'), 47), (np.datetime64('2024-12-05T10:15:00.000000'), np.datetime64('2024-12-05T22:15:00.000000'), 47), (np.datetime64('2024-12-05T22:15:00.000000'), np.datetime64('2024-12-06T10:15:00.000000'), 47), (np.datetime64('2024-12-06T10:15:00.000000'), np.datetime64('2024-12-06T22:15:00.000000'), 47), (np.datetime64('2024-12-06T22:15:00.000000'), np.datetime64('2024-12-07T10:15:00.000000'), 47), (np.datetime64('2024-12-07T10:15:00.000000'), np.datetime64('2024-12-07T21:45:00.000000'), 45), (np.datetime64('2024-12-08T06:45:00.000000'), np.datetime64('2024-12-08T07:15:00.000000'), 1), (np.datetime64('2024-12-09T05:30:00.000000'), np.datetime64('2024-12-09T06:00:00.000000'), 1), (np.datetime64('2024-12-11T17:15:00.000000'), np.datetime64('2024-12-11T17:45:00.000000'), 1), (np.datetime64('2024-12-13T05:45:00.000000'), np.datetime64('2024-12-13T17:45:00.000000'), 47), (np.datetime64('2024-12-13T17:45:00.000000'), np.datetime64('2024-12-14T05:45:00.000000'), 47), (np.datetime64('2024-12-14T05:45:00.000000'), np.datetime64('2024-12-14T16:00:00.000000'), 40), (np.datetime64('2024-12-20T07:00:00.000000'), np.datetime64('2024-12-20T07:30:00.000000'), 1), (np.datetime64('2024-12-20T12:45:00.000000'), np.datetime64('2024-12-20T13:15:00.000000'), 1), (np.datetime64('2024-12-20T13:30:00.000000'), np.datetime64('2024-12-20T14:00:00.000000'), 1), (np.datetime64('2024-12-20T14:15:00.000000'), np.datetime64('2024-12-20T14:45:00.000000'), 1), (np.datetime64('2024-12-20T14:45:00.000000'), np.datetime64('2024-12-20T15:15:00.000000'), 1), (np.datetime64('2024-12-20T15:30:00.000000'), np.datetime64('2024-12-20T16:00:00.000000'), 1), (np.datetime64('2024-12-20T16:15:00.000000'), np.datetime64('2024-12-20T16:45:00.000000'), 1), (np.datetime64('2024-12-21T09:45:00.000000'), np.datetime64('2024-12-21T10:15:00.000000'), 1), (np.datetime64('2024-12-22T17:00:00.000000'), np.datetime64('2024-12-22T17:30:00.000000'), 1), (np.datetime64('2024-12-25T10:00:00.000000'), np.datetime64('2024-12-25T11:15:00.000000'), 4), (np.datetime64('2024-12-25T14:30:00.000000'), np.datetime64('2024-12-25T15:45:00.000000'), 4), (np.datetime64('2024-12-27T12:45:00.000000'), np.datetime64('2024-12-27T14:00:00.000000'), 4), (np.datetime64('2024-12-27T15:15:00.000000'), np.datetime64('2024-12-27T15:45:00.000000'), 1), (np.datetime64('2024-12-27T20:00:00.000000'), np.datetime64('2024-12-27T20:45:00.000000'), 2), (np.datetime64('2024-12-27T20:45:00.000000'), np.datetime64('2024-12-27T21:15:00.000000'), 1), (np.datetime64('2024-12-27T23:15:00.000000'), np.datetime64('2024-12-27T23:45:00.000000'), 1), (np.datetime64('2024-12-28T01:45:00.000000'), np.datetime64('2024-12-28T02:15:00.000000'), 1), (np.datetime64('2024-12-29T08:30:00.000000'), np.datetime64('2024-12-29T09:00:00.000000'), 1), (np.datetime64('2024-12-29T09:00:00.000000'), np.datetime64('2024-12-29T09:30:00.000000'), 1), (np.datetime64('2024-12-29T09:45:00.000000'), np.datetime64('2024-12-29T10:15:00.000000'), 1), (np.datetime64('2024-12-29T10:15:00.000000'), np.datetime64('2024-12-29T10:45:00.000000'), 1), (np.datetime64('2024-12-30T17:45:00.000000'), np.datetime64('2024-12-30T18:15:00.000000'), 1), (np.datetime64('2024-12-30T18:45:00.000000'), np.datetime64('2024-12-30T19:15:00.000000'), 1), (np.datetime64('2024-12-30T20:15:00.000000'), np.datetime64('2024-12-30T20:45:00.000000'), 1), (np.datetime64('2024-12-30T20:45:00.000000'), np.datetime64('2024-12-30T21:15:00.000000'), 1), (np.datetime64('2024-12-30T22:00:00.000000'), np.datetime64('2024-12-30T22:30:00.000000'), 1), (np.datetime64('2024-12-30T23:00:00.000000'), np.datetime64('2024-12-30T23:30:00.000000'), 1), (np.datetime64('2024-12-31T01:00:00.000000'), np.datetime64('2024-12-31T01:30:00.000000'), 1), (np.datetime64('2024-12-31T02:00:00.000000'), np.datetime64('2024-12-31T02:30:00.000000'), 1), (np.datetime64('2024-12-31T03:45:00.000000'), np.datetime64('2024-12-31T05:00:00.000000'), 4), (np.datetime64('2024-12-31T05:30:00.000000'), np.datetime64('2024-12-31T06:00:00.000000'), 1), (np.datetime64('2024-12-31T06:15:00.000000'), np.datetime64('2024-12-31T06:45:00.000000'), 1), (np.datetime64('2024-12-31T14:00:00.000000'), np.datetime64('2024-12-31T14:30:00.000000'), 1)]
max_gap_size: 47
data_coverage: 0.935820810564663
minor_gaps: 235
major_gaps: 123
dataset_id: continuous_flow
status: ok
expected_interval: 15MIN
Peak Flow Data¶
Retrieve annual peak flow records — essential for flood frequency analysis and model calibration.
peak_flow = UsgsObservations.get_peak_flow_data(site_id)
print(f"Peak flow records: {len(peak_flow)}")
assert len(peak_flow) > 0, "Should have peak flow records for a major gauge"
print(f"Columns: {list(peak_flow.columns)}")
print(f"\nFirst 5 records:")
peak_flow.head()
Peak flow records: 78
Columns: ['datetime', 'value', 'gage_height_ft', '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']
First 5 records:
| datetime | value | gage_height_ft | 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 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1948-07-26 | 1050 | 9.05 | USGS | 05577500 | 1948-07-26 | NaN | 1050 | NaN | 9.05 | NaN | NaN | NaN | NaN | NaN | NaN |
| 1 | 1949-01-27 | 639 | 8.14 | USGS | 05577500 | 1949-01-27 | NaN | 639 | NaN | 8.14 | NaN | NaN | NaN | NaN | NaN | NaN |
| 2 | 1950-01-14 | 855 | 8.85 | USGS | 05577500 | 1950-01-14 | NaN | 855 | NaN | 8.85 | NaN | NaN | NaN | NaN | NaN | NaN |
| 3 | 1951-06-28 | 3030 | 12.16 | USGS | 05577500 | 1951-06-28 | NaN | 3030 | NaN | 12.16 | NaN | NaN | NaN | NaN | NaN | NaN |
| 4 | 1952-07-02 | 729 | 8.45 | USGS | 05577500 | 1952-07-02 | NaN | 729 | NaN | 8.45 | NaN | NaN | NaN | NaN | NaN | NaN |
Drainage Area Comparison¶
Compare up to 4 drainage area sources. Agreement status: - close (<=5%): Areas agree well - moderate (<=10%): Minor discrepancies - review (>10%): Needs investigation
drainage_area_review = UsgsDrainageAreaComparison.compare_areas(
gauge_area_sqmi=metadata.get("drainage_area_sqmi"),
official_basin_area_sqmi=125.8,
taudem_area_sqmi=124.9,
model_area_sqmi=126.4,
)
print(f"Reference: {drainage_area_review['reference_label']} "
f"({drainage_area_review['reference_area_sqmi']} sq mi)")
print(f"Agreement status: {drainage_area_review['agreement_status']}")
print(f"Max percent difference: {drainage_area_review['max_abs_percent_difference']:.2f}%")
assert isinstance(drainage_area_review, dict), "Should return dict"
assert 'agreement_status' in drainage_area_review, "Should have agreement_status"
assert drainage_area_review['provided_area_count'] >= 2, "Should compare multiple areas"
print("\n=== Per-Source Comparisons ===")
for key, comp in drainage_area_review['comparisons'].items():
ref_tag = " (REFERENCE)" if comp['is_reference'] else ""
pct = comp['difference_from_reference_percent']
pct_str = f"{pct:+.2f}%" if pct is not None else "--"
print(f" {comp['label']}: {comp['area_sqmi']:.1f} sq mi [{pct_str}]{ref_tag}")
Reference: Gauge (107.0 sq mi)
Agreement status: review
Max percent difference: 18.13%
=== Per-Source Comparisons ===
Gauge: 107.0 sq mi [--] (REFERENCE)
Official Basin: 125.8 sq mi [+17.57%]
TauDEM: 124.9 sq mi [+16.73%]
Model: 126.4 sq mi [+18.13%]
Notebook-Local Report Assembly¶
This cell demonstrates how to assemble a complete study report from the primitives above. This is intentionally notebook-local workflow code — not part of the library's public API.
report = {
"study": {
"site_id": site_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
},
"gauge_metadata": metadata,
"datasets": {
"continuous_flow": continuous_flow_summary,
"daily_flow": UsgsObservations.summarize_dataset(
dataset_id="daily_flow",
frame=daily_flow,
status="ok" if not daily_flow.empty else "empty",
),
"peak_flow": {"record_count": len(peak_flow), "status": "ok" if not peak_flow.empty else "empty"},
},
"data_gaps": {
"continuous_flow": continuous_flow_gaps,
"daily_flow": UsgsObservations.analyze_gaps(
dataset_id="daily_flow",
frame=daily_flow,
),
},
"drainage_area_review": drainage_area_review,
}
def _to_json_safe(value):
"""Recursively convert non-serializable types for JSON output."""
if isinstance(value, dict):
return {key: _to_json_safe(val) for key, val in value.items()}
if isinstance(value, (list, tuple)):
return [_to_json_safe(item) for item in value]
if hasattr(value, "tolist"):
try:
return _to_json_safe(value.tolist())
except Exception:
pass
if hasattr(value, "item"):
try:
return value.item()
except Exception:
pass
if hasattr(value, "isoformat"):
try:
return value.isoformat()
except Exception:
pass
return value
output_dir = Path("out") / f"USGS_{site_id}_study_package"
output_dir.mkdir(parents=True, exist_ok=True)
report_path = output_dir / "report.json"
report_path.write_text(json.dumps(_to_json_safe(report), indent=2), encoding="utf-8")
print(f"Report written to: {report_path}")
print(f"Report size: {report_path.stat().st_size:,} bytes")
print(f"\nDatasets covered: {list(report['datasets'].keys())}")
print(f"Drainage area agreement: {report['drainage_area_review']['agreement_status']}")
assert report_path.exists(), "Report file should exist"
roundtrip = json.loads(report_path.read_text(encoding='utf-8'))
assert roundtrip['study']['site_id'] == site_id, "Report roundtrip should preserve site_id"
print("\nAll assertions passed.")
Report written to: out\USGS_05577500_study_package\report.json
Report size: 43,005 bytes
Datasets covered: ['continuous_flow', 'daily_flow', 'peak_flow']
Drainage area agreement: review
All assertions passed.