Skip to content

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.

Python
# 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:

Python
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 *
Python
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).

Python
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())}")
Text Only
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']
Python
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()}")
Text Only
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.

Python
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"
Text Only
=== 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.

Python
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()
Text Only
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

Python
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}")
Text Only
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.

Python
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.")
Text Only
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.