Examples

Modern development should use WaterData.* functions, which query the newer USGS Waterdata OGC and Samples APIs. These services are more performant and return cleaner, modern data formats.

Index

Waterdata API Examples

These examples use data retrieved from the USGS Waterdata OGC API and the Samples API.

Examining Site 01491000

In this example we fetch information for site "01491000" located on the Choptank River near Greensboro, MD. Site identifiers in the modern API typically include the agency prefix (e.g., USGS-).

First we will obtain metadata about the monitoring location.

using DataRetrieval
siteID = "USGS-01491000"
df, response = WaterData.monitoring_locations(monitoring_location_id=siteID);

# print the site information table
df
1×41 DataFrame
Rowgeometrywell_constructed_depthcountry_codeagency_namehole_constructed_depthhorizontal_positional_accuracyaltitude_method_namevertical_datumdrainage_areadistrict_codemonitoring_location_numbernational_aquifer_codeagency_codestate_codecounty_namebasin_codecountry_nameminor_civil_division_codealtitudehorizontal_position_method_codeconstruction_dateoriginal_horizontal_datumaltitude_method_codeaquifer_codevertical_datum_namesite_type_codehydrologic_unit_codehorizontal_positional_accuracy_codeoriginal_horizontal_datum_namemonitoring_location_namecontributing_drainage_areahorizontal_position_method_namemonitoring_location_idsite_typealtitude_accuracyaquifer_type_codecounty_codestate_nameuses_daylight_savingsdepth_source_codetime_zone_abbreviation
Object…NothingStringStringNothingStringStringStringFloat64StringStringNothingStringStringStringNothingStringNothingFloat64StringMissingStringStringNothingStringStringStringStringStringStringNothingStringStringStringFloat64NothingStringStringStringNothingString
1Object{String, Any}("type"=>"Point", "coordinates"=>Any[-75.7858, 38.9972])USU.S. Geological SurveyAccurate to + or - 1 sec.Interpolated from Digital Elevation ModelNAVD88113.02401491000USGS24Caroline CountyUnited States of America2.73MmissingNAD83NNorth American Vertical Datum of 1988ST020600050203SNorth American Datum of 1983CHOPTANK RIVER NEAR GREENSBORO, MDInterpolated from MAP.USGS-01491000Stream0.1011MarylandYEST

We can also look at the raw API response status.

# print the response status code
response.status
200

Now we can get daily discharge values. We will obtain data for the first three days of January 1980.

# parameter_code 00060 is discharge
df, response = WaterData.daily(monitoring_location_id=siteID,
                              parameter_code="00060",
                              time="1980-01-01/1980-01-03");

# print the data frame
df
3×11 DataFrame
Rowgeometrytimestatistic_idtime_series_idapproval_statusqualifiermonitoring_location_idparameter_codevaluelast_modifiedunit_of_measure
Object…DateTimeStringStringStringNothingStringStringFloat64MissingString
1Object{String, Any}("type"=>"Point", "coordinates"=>Any[-75.7858, 38.9972])1980-01-03T00:00:0000003847d8581ff6c45f58ff7cb90dec31fabApprovedUSGS-014910000006092.0missingft^3/s
2Object{String, Any}("type"=>"Point", "coordinates"=>Any[-75.7858, 38.9972])1980-01-02T00:00:0000003847d8581ff6c45f58ff7cb90dec31fabApprovedUSGS-014910000006096.0missingft^3/s
3Object{String, Any}("type"=>"Point", "coordinates"=>Any[-75.7858, 38.9972])1980-01-01T00:00:0000003847d8581ff6c45f58ff7cb90dec31fabApprovedUSGS-0149100000060100.0missingft^3/s

Plotting Flow Data for Site 01646500

In this example we fetch and plot instantaneous (continuous) flow data for site "01646500" (Potomac River near Washington D.C.) for December 1, 2022.

using DataRetrieval, DataFrames
siteID = "USGS-01646500"
df, response = WaterData.continuous(monitoring_location_id=siteID,
                                    parameter_code="00060",
                                    time="2022-12-01/2022-12-05");
# Clean up missing values and sort the data
df = dropmissing(df, [:time, :value])
sort!(df, :time)

# display the first row
first(df)
DataFrameRow (11 columns)
Rowtimestatistic_idtime_series_idapproval_statusqualifiermonitoring_location_idparameter_codevaluecontinuous_idlast_modifiedunit_of_measure
DateTimeStringStringStringNothingStringStringFloat64StringMissingString
12022-12-01T00:00:000001166a4e3fb8abe42fcb0942b5c0fe98f68ApprovedUSGS-01646500000603810.03075ad2a-c255-4a59-a27f-ca363eccb6a0missingft^3/s

We can fetch additional information about the parameter code (units, description) using the reference table service.

pcodedf, response = WaterData.reference_table("parameter-codes", query=Dict("id" => "00060"));
pcodedf
1×13 DataFrame
Rowtime_basisparticle_size_basissample_fractionweight_basistemperature_basismediumparameter_descriptionparameter_nameparameter_group_codestatistical_basisparameter_codeunit_of_measureepa_equivalence
StringNothingNothingNothingNothingStringStringStringStringStringStringStringString
11 DayWaterDischarge, cubic feet per secondDischargePHYMean00060ft3/sNot checked

Now we plot the discharge data. Note that column names in the modern API are standardized (e.g., time and value).

using Plots
plot(df.time, df.value,
     title="Discharge at Potomac River near Washington D.C.",
     ylabel="Discharge (ft³/s)",
     xlabel="Time",
     xrotation=60,
     label="Discharge",
     dpi=200)

Fetching and Plotting Groundwater Levels from Site 393617075380403

In this example we fetch and plot daily groundwater levels (parameter code "72019") for the first six months of 2012.

using DataRetrieval, DataFrames
siteID = "USGS-393617075380403"
df, response = WaterData.daily(monitoring_location_id=siteID,
                              parameter_code="72019",
                              time="2012-01-01/2012-06-30");

# Clean up missing values and sort the data
dropmissing!(df, :value)
sort!(df, :time)

# display the first row
first(df)
DataFrameRow (11 columns)
Rowgeometrytimestatistic_idtime_series_idapproval_statusqualifiermonitoring_location_idparameter_codevaluelast_modifiedunit_of_measure
Object…DateTimeStringStringStringNothingStringStringFloat64MissingString
1Object{String, Any}("type"=>"Point", "coordinates"=>Any[-75.6343, 39.6047])2012-01-21T00:00:0000003159aaabe0d3546fda466d4c75ee7a243ApprovedUSGS-39361707538040372019-0.1missingft

Get parameter metadata:

pcodedf, response = WaterData.reference_table("parameter-codes", query=Dict("id" => "72019"));
pcodedf
1×13 DataFrame
Rowtime_basisparticle_size_basissample_fractionweight_basistemperature_basismediumparameter_descriptionparameter_nameparameter_group_codestatistical_basisparameter_codeunit_of_measureepa_equivalence
NothingNothingNothingNothingNothingStringStringStringStringNothingStringStringString
1WaterDepth to water level, feet below land surfaceWater level, depth LSDPHY72019ftAgree

Plot the groundwater levels:

using Plots
# Use the value column directly
plot(df.time, df.value,
     title="Groundwater Levels at Site 393617075380403",
     ylabel="Depth (ft below land surface)",
     xlabel="Time",
     xrotation=60,
     label="Groundwater Level",
     yflip=true,
     dpi=200,
     margin=5Plots.mm)

NLDI Examples

The Network Linked Data Index (NLDI) API provides functions to navigate flowlines, find basin boundaries, and discover linked features.

Finding a Basin

In this example, we find the basin for a specific NWIS site.

using DataRetrieval, GeoDataFrames
df_basin, response = NLDI.basin("nwissite", "USGS-01491000");

# display the basin data frame
first(df_basin)

We can also navigate upstream or downstream from a feature to find flowlines.

# Navigate upstream main (UM) up to 10 km
df_flow, response = NLDI.flowlines("UM", feature_source="nwissite", feature_id="USGS-01491000", distance=10);

# display the flowlines
first(df_flow)
DataFrameRow (5 columns)
Rowfeature_typegeometrynhdplus_comidgeometry_typecoordinates
StringObject…StringStringArray…
1FeatureObject{String, Any}("type"=>"LineString", "coordinates"=>Any[Any[-75.7862, 39.0001], Any[-75.7862, 38.9998], Any[-75.7853, 38.9987], Any[-75.7853, 38.998], Any[-75.7854, 38.9977], Any[-75.7854, 38.9961], Any[-75.7852, 38.996]])9407484LineStringAny[Any[-75.7862, 39.0001], Any[-75.7862, 38.9998], Any[-75.7853, 38.9987], Any[-75.7853, 38.998], Any[-75.7854, 38.9977], Any[-75.7854, 38.9961], Any[-75.7852, 38.996]]

We can then plot the basin and flowlines geometries directly.

using Plots
p = plot(df_basin.geometry, fillalpha=0.2, c=:blue, label="Basin")
plot!(p, df_flow.geometry, c=:red, linewidth=2, label="Flowlines UM")
title!("Site 01491000 Basin & Flowlines")

Retrieving Linked Features

You can also use NLDI to find all linked features for a given source, or search along navigation lines. We will grab the first few nwissite features and view their rich metadata.

using DataRetrieval, GeoDataFrames

# Retrieve all water quality portal locations
df_features, response = NLDI.features_by_data_source("nwissite");

# display the properties available
first(df_features, 3)

Water Quality Portal (WQP) / Samples API Examples

Modern water quality queries should prefer the WaterData.results or WaterData.samples functions.

Identifying Sites with Chloride Measurements

In this example we identify sites with chloride measurements in New Jersey (state code "US:34").

using DataRetrieval, DataFrames
# Find locations with Chloride measurements
njcl, response = WaterData.locations(state_fips="US:34",
                                    characteristic="Chloride");
# print the number of sites found
nrow(njcl)
5952

Retrieving Water Quality Results

We can also retrieve the actual measurements for a specific location.

# Get narrow profile results for a specific monitoring location
results, response = WaterData.results(
    monitoring_location_identifier="USGS-01408029",
    characteristic="Chloride",
    activity_start_date_lower="2020-01-01"
);

# display the first result
first(results, 1)
1×181 DataFrame
RowOrg_IdentifierOrg_FormalNameProject_IdentifierProject_NameProject_QAPPApprovedProject_QAPPApprovalAgencyProjectAttachment_FileNameProjectAttachment_FileTypeLocation_IdentifierLocation_NameLocation_TypeLocation_DescriptionLocation_StateLocation_CountryNameLocation_CountyNameLocation_CountryCodeLocation_StatePostalCodeLocation_CountyCodeLocation_HUCEightDigitCodeLocation_HUCTwelveDigitCodeLocation_TribalLandIndicatorLocation_TribalLandLocation_LatitudeLocation_LongitudeLocation_HorzCoordReferenceSystemDatumLocation_LatitudeStandardizedLocation_LongitudeStandardizedLocation_HorzCoordStandardizedDatumAlternateLocation_IdentifierCountActivity_ActivityIdentifierActivity_ActivityIdentifierUserSuppliedActivity_TypeCodeActivity_MediaActivity_MediaSubdivisionActivity_BottomDepthSamplingComponentActivityBiological_AssemblageSampledActivityBiological_ToxicityTestTypeActivity_ConductingOrganizationActivity_CommentActivityLocation_LatitudeActivityLocation_LongitudeActivityLocation_HorzCoordReferenceSystemDatumActivityLocation_SourceMapScaleActivityLocation_LatitudeStandardizedActivityLocation_LongitudeStandardizedActivityLocation_HorzCoordStandardizedDatumActivityLocation_HorzAccuracyMeasureActivityLocation_HorzAccuracyMeasureUnitActivityLocation_HorizontalAccuracyHorzCollectionMethodActivityLocation_DescriptionActivity_StartDateActivity_StartTimeActivity_StartTimeZoneActivity_EndDateActivity_EndTimeActivity_EndTimeZoneActivity_DepthHeightMeasureActivity_DepthHeightMeasureUnitActivity_BottomDepthAltitudeReferencePointActivity_ActivityRelativeDepthActivity_TopDepthMeasureActivity_TopDepthMeasureUnitActivity_BottomDepthMeasureActivity_BottomDepthMeasureUnitSampleCollectionMethod_IdentifierSampleCollectionMethod_IdentifierContextSampleCollectionMethod_NameSampleCollectionMethod_QualifierTypeNameSampleCollectionMethod_DescriptionSampleCollectionMethod_EquipmentNameSampleCollectionMethod_EquipmentCommentSamplePrepMethod_IdentifierSamplePrepMethod_IdentifierContextSamplePrepMethod_NameSamplePrepMethod_QualifierTypeSamplePrepMethod_DescriptionSamplePrepMethod_ContainerLabelSamplePrepMethod_ContainerTypeSamplePrepMethod_ContainerColorSamplePrepMethod_ChemicalPreservativeUsedSamplePrepMethod_ThermalPreservativeUsedSamplePrepMethod_TransportStorageDescriptionActivity_HydrologicConditionActivity_HydrologicEventActivityAttachment_FileNameActivityAttachment_FileTypeActivityAttachment_FileDownloadResult_DataLoggerLineResult_ResultDetectionConditionResult_CharacteristicResult_CharacteristicUserSuppliedResult_CASNumberResult_MethodSpeciationResult_SampleFractionResultBiological_IntentResultBiological_IndividualIdentifierResultBiological_TaxonResultBiological_TaxonUserSuppliedResultBiological_TaxonUserSuppliedReferenceResultBiological_UnidentifiedSpeciesIdentifierResultBiological_SampleTissueAnatomyResultBiological_GroupSummaryCountGroupSummaryWeight_MeasureGroupSummaryWeight_MeasureUnitResultDepthHeight_MeasureResultDepthHeight_MeasureUnitResultDepthHeight_AltitudeReferencePointResultDepthHeight_SamplingPointNameResultDepthHeight_SamplingPointTypeResultDepthHeight_SamplingPointPlaceInSeriesResultDepthHeight_SamplingPointCommentResultDepthHeight_RecordIdentifierUserSuppliedResult_MeasureIdentifierResult_MeasureResult_MeasureUnitResult_MeasureQualifierCodeResult_MeasureStatusIdentifierResult_StatisticalBaseResult_StatisticalNValueResult_MeasureTypeResult_WeightBasisResult_TimeBasisResult_MeasureTemperatureBasisResult_MeasureParticleSizeBasisDataQuality_PrecisionValueDataQuality_BiasValueDataQuality_ConfidenceIntervalValueDataQuality_UpperConfidenceLimitValueDataQuality_LowerConfidenceLimitValueDataQuality_ResultCommentDetectionLimit_TypeADetectionLimit_MeasureADetectionLimit_MeasureUnitADetectionLimit_CommentADetectionLimit_TypeBDetectionLimit_MeasureBDetectionLimit_MeasureUnitBDetectionLimit_CommentBLabInfo_LabSampleSplitRatioLabInfo_LabAccreditationIndicatorLabInfo_LabAccreditationAuthorityLabInfo_TaxonAccreditationIndicatorLabInfo_TaxonAccreditationAuthorityResultAnalyticalMethod_IdentifierResultAnalyticalMethod_IdentifierContextResultAnalyticalMethod_NameResultAnalyticalMethod_QualifierTypeResultAnalyticalMethod_DescriptionResult_ComparableMethodIdentifierResult_ComparableMethodIdentifierContextResult_ComparableMethodModificationLabInfo_NameLabInfo_AnalysisStartDateLabInfo_AnalysisStartTimeLabInfo_AnalysisStartTimeZoneLabInfo_AnalysisEndDateLabInfo_AnalysisEndTimeLabInfo_AnalysisEndTimeZoneLabInfo_LaboratoryCommentLabSamplePrepMethod_IdentifierLabSamplePrepMethod_IdentifierContextLabSamplePrepMethod_NameLabSamplePrepMethod_QualifierTypeLabSamplePrepMethod_DescriptionLabSamplePrepMethod_StartDateLabSamplePrepMethod_StartTimeLabSamplePrepMethod_StartTimeZoneLabSamplePrepMethod_EndDateLabSamplePrepMethod_EndTimeLabSamplePrepMethod_EndTimeZoneLabSamplePrepMethod_DilutionFactorResultAttachment_FileNameResultAttachment_FileTypeResultAttachment_FileDownloadProviderNameResult_CharacteristicComparableResult_CharacteristicGroupOrg_TypeLastChangeDateUSGSpcodeUSGSSampleAquifer
String7String31StringMissingMissingMissingMissingMissingString15StringString7MissingString15String31String15String3String3MissingInt64Int64MissingMissingFloat64Float64String7Float64Float64String7MissingStringMissingStringString7String15MissingMissingMissingStringStringMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingDateTimeString3MissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingInt64?String15?String31?MissingString?String31?MissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingString31String15MissingMissingMissingMissingMissingString15String31String15MissingString31MissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingStringFloat64String7MissingString15MissingMissingString7MissingMissingMissingMissingMissingMissingMissingMissingMissingString?MissingMissingMissingMissingString31Float64String7StringMissingMissingMissingMissingMissingString7String15String15MissingStringMissingMissingMissingStringDateMissingMissingMissingMissingMissingString?MissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingMissingString7MissingString31String31DateInt64Missing
1USGSU.S. Geological Survey["USGS","00003LB00"]missingmissingmissingmissingmissingUSGS-01408029Manasquan River near Allenwood NJStreammissingNew JerseyUnited States of AmericaMonmouth CountyUSNJmissing204030120403010105missingmissing40.1467-74.1222NAD8340.1467-74.1222NAD83missing313052d5-fa3c-4ca9-9549-c90d9805f5bdmissingSample - Routine, regularWaterSurface watermissingmissingmissingU.S. Geological Survey-Water Resources Discipline missingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissing2024-03-2710:30:00EDTmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissing40USDOI/USGSMultiple verticalsmissingDepth-integrated: Multiple verticalsWeighted bottlemissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingStable, normal stageRoutine samplemissingmissingmissingmissingmissingChlorideChloride, water, filtered16887-00-6missingFiltered field and/or labmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingd6990c7a-f266-4274-8f2f-45594e9e6e3c36.8mg/LmissingAcceptedmissingmissingActualmissingmissingmissingmissingmissingmissingmissingmissingmissingHold time parameters were exceeded during the collection to analysis phase of sample processing.missingmissingmissingmissingDetection limit by DQCALC0.05mg/LQuantitation limit value of the specified typemissingmissingmissingmissingmissingIC022USDOI/USGSAnions, wf, ICmissingDESCRIPTION: Anions, filtered water, ion chromatography; CITATION(S): Fishman, M.J., ed., 1993, Methods of analysis by the U.S. Geological Survey National Water Quality Laboratory--Determination of inorganic and organic constituents in water and fluvial sediments: U.S. Geological Survey Open-File Report 93-125, p. 19-25. | USGS | I-2057-90 |<--->| American Public Health Association and American Water Works Association, 2012, Standard methods for the examination of water and wastewater (22d ed.): Washington, D.C., American Public Health Association, method 4110 B-2011, p. 4-5 through 4-7. | STDMETH | 4110 B-2011 |<--->| American Public Health Association, 2020, Standard methods for the examination of water and wastewater: Washington, D.C., American Public Health Association, method 4110 B | STDMETH | 4110 BmissingmissingmissingUSGS-National Water Quality Lab, Denver, CO2024-04-26missingmissingmissingmissingmissing[@ - holding time exceeded]; [c - see result laboratory comment]missingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingmissingUSGSmissingInorganics, Major, Non-metalsFederal/US Government2026-02-12940missing

Summary of Modern vs Legacy Functions

FeatureModern FunctionLegacy Function (Deprecated)
Site MetadataWaterData.monitoring_locationsNWIS.site
Daily ValuesWaterData.dailyNWIS.dv
Continuous ValuesWaterData.continuousNWIS.iv / NWIS.unit
Parameter CodesWaterData.reference_tableNWIS.pcode
QW ResultsWaterData.samples / WaterData.resultsNWIS.qwdata
WQP SitesWaterData.locationsWQP.sites