Century-scale changes in dissolved oxygen, temperature, and salinity in Puget Sound
Data files
Feb 10, 2026 version files 1.07 GB
-
1527887.csv
2.50 MB
-
coast_pnw.p
4.60 MB
-
figure_01.py
7.11 KB
-
figure_02.py
6.35 KB
-
figure_03.py
2.38 KB
-
figure_04.py
4.55 KB
-
figure_05.py
3.04 KB
-
figure_06.py
5.20 KB
-
figure_07.py
4.80 KB
-
figure_08.py
5.15 KB
-
figure_09.py
4.98 KB
-
figure_10.py
6.94 KB
-
figure_functions.py
20.65 KB
-
plat.p
6.92 MB
-
plon.p
6.92 MB
-
ps_casts_DF.p
799.37 MB
-
README.md
54.33 KB
-
site_casts_DF.p
241.81 MB
-
site_depth_avg_var_DF.p
3.06 MB
-
site_polygon_dict.p
1.20 KB
-
skagit_monthly.txt
41.14 KB
-
zm_inverse.p
6.91 MB
Abstract
Over the last century, many coastal ocean regions have experienced a decrease in dissolved oxygen (DO) concentrations. In this work we consider long term changes in DO in an estuary, which may be influenced by both changing ocean conditions and anthropogenic activity. We analyze nearly 100 years of water column profile data in Puget Sound, a temperate, fjordal, urbanized estuary in Washington State, USA and the southernmost region of the Salish Sea. We observe warming of 1.5°C/century, consistent with warming found throughout the Salish Sea region and similar to coastal ocean and local atmospheric warming. We observe that bottom salinity is increasing at a low rate. Finally, we find that bottom DO is declining at a rate of about 0.6 mg/L/century in Main basin, the largest section of Puget Sound. Changes in DO solubility associated with the observed increase in water temperature can account for approximately 50% of this DO loss. In Puget Sound’s distal terminal inlets where hypoxic conditions more commonly occur, trends in DO are generally small and the variability in DO is high, obscuring trends there. Documenting long-term changes in estuary water properties is imperative to inform management decisions for ecosystem health.
Dataset DOI: 10.5061/dryad.v6wwpzh9n
Description of the data and file structure
Scripts - RUN THESE!
File: figure_XX.py
Description: figure_02.pyProcesses dataframes and plots manuscript figures.
File: figure_functions.py
Description: Functions for data and dataframe processing and plotting.
LiveOcean grid attributes (used for plotting and bathymetry)
(MacCready et al., 2021 - see manuscript for full citation; see https://github.com/parkermac/LO.git for public repository)
Note: These files are "pickle" data structures. Specific code to load these files are included in figure_XX.py plotting scripts. If loading these files independently, users require Python with the "pickle" module.
File: plon.p
Description: plaid 2D longitude grid (ndarray) for LiveOcean cas7 domain, used for Matplotlib pcolormesh plotting
File: plat.p
Description: plaid 2D latitude grid (ndarray) for LiveOcean cas7 domain, used for Matplotlib pcolormesh plotting
File: coast_pnw.p
Description: 2D points for graphical LiveOcean domain coastline, used for graphics
File: zm_inverse.p
Description: 2D grid (ndarray) masking out "water" cells in the LiveOcean cas7 domain, used for graphics
Air Temperature & River Data
File: 1527887.csv
Description: Daily minimum and maximum temperatures at Seattle-Tacoma International Airport (GHCND:USW00024233) (NOAA GHCN, 2018; see text for more details and citations), used in figure_3.py.
Variables
- DATE = measurement date
- TMAX = daily maximum temperature (degrees C)
- TMIN = daily minimum temperature (degrees C)
- STATION = agency-specified site identifier
- NAME = station name
- PRCP = daily precipitation (mm)
- TSUN = daily total sunshine (minutes)
File: skagit_monthly.txt
Description: Monthly average discharge at Skagit River near Mount Vernon (USGS 12200500) (USGS, 2024; see text for more details and citations), used in figure_4.py. Original header metadata is included in this file.
Variables
- year_nu = year
- month_nu = month number
- mean_va = mean monthly discharge in cubic feet per second (cfs)
- agency_cd = code for sampling agency
- site_no = agency-specified site number
- parameter_cd = agency-specified code for measured variable (in this case, mean monthly discharge in cfs)
- ts_id = agency-specified time series identifier
Dataframes+
Dataframes are "pickled" dataframes, meaning they are easily readable using Python Pandas' inherent functionality using "pickled" storage. Please see manuscript for data sources used to create dataframes.
Note: These files are "pickle" data structures. Specific code to load these files are included in figure_XX.py plotting scripts. If loading these files independently, users require Python with the "pandas" module.
File: ps_casts_DF.p
Description: This dataframe includes all shipboard profiles within Puget Sound considered in this work. Individual profiles are called "casts" and may have multiple data points at different depths along the profile. Data columns are discussed below.
Variables
- cid - unique cast identifier
- lon - longitude at which cast was recorded
- lat - latitude at which cast was recorded
- time - recorded cast time
- datetime - recorded cast time in DateTime format
- date_ordinal - recorded cast time in DateOrdinal format
- decade - recorded decade of cast (e.g., 1940s)
- year - recorded calendar year of cast
- season - recorded season of cast; seasons are defined in three-month trimesters and use the following shorthand (NOTE: shorthand is purely for coding readability and does not necessarily indicate scientific distinctions between seasons):
- "loDO" = August-November
- "winter" = December-March
- "grow" = April-July
- month - recorded calendar month of cast
- yearday - recorded yearday of cast
- z - recorded data point depth [m]
- var - variable name, one of (see text for more description of conversions):
- CT = conservative temperature in degrees C
- SA = absolute salinity in g/kg
- DO_mg_L = dissolved oxygen concentration [DO] in mg/L
- val - value (specified datapoint for the indicated variable)
- ix - x-index corresponding to longitude on the LiveOcean grid (see manuscript for citations and description)
- iy - y-index corresponding to latitude on the LiveOcean grid (see manuscript for citations and description)
- h - water column depth at specified index on the LiveOcean grid (see manuscript for citations and description)
- data_source - sampling party/agency (see citations)
- Collias (Col.)
- King County (KC)
- WA Dept. of Ecology (Eco.)
- NCEI Salish Sea (NCEI)
- sampling_type - type of profile (see manuscript for descriptions)
- Bottle
- Sonde (unknown type)
- CTD+DO
- ix_iy - string concatenation of ix and iy
File: site_casts_DF.p
Description: This dataframe includes all shipboard profiles for the (5) selected sites with sufficient data for century-scale trend analyses considered in this work. Column nomenclature is the same as above; new columns are discussed below.
New Variables
- site - name of selected site
- surf_deep - depth bin
- surf - depth-average using top 5m of water column
- deep - depth-average using site-specific bottom percentage of water column (see manuscript for details)
- min_segment_h - greatest water column depth within site using the LiveOcean grid (see manuscript for citations and description)
File: site_depth_avg_var_DF.p
Description: This dataframe includes all depth-averaged cast data for the (5) selected sites with sufficient data for century-scale trend analyses considered in this work. Column nomenclature is the same as above.
File: site_polygon_dict.p
Description: Not really a dataframe, rather a "pickled" dictionary of Matplotlib Path objects that bound each site using polygons; this is used for plotting in figure_01.py.
Code/software
Data processing and figure creation was conducted using Python 3.11.11 and the following packages: Matplotlib 3.10.1 (Hunter, 2007; The Matplotlib Development Team, 2025), Numpy 2.1.3 (Harris et al., 2020), Scipy 1.15.25 (The pandas development team, 2020; Virtanen et al., 2020), Pandas 2.2.3 (The pandas development team, 2020), Pickle 4.0 (Van Rossum, 2020), and TEOS 10/Gibbs Seawater (GSW) Oceanographic Toolbox (McDougall & Barker, 2011). Grid and plotting tools adapted in this work from LiveOcean (MacCready et al., 2021) can be found https://github.com/parkermac/LO.git. (Please see manuscript for formal citations.)
Access information
Data from various agencies were used in the creation of this manuscript. Data were compiled and collected by Eugene Collias at the University of Washington (Collias, 1970; Collias & Lincoln, 1977). The Washington State Department of Ecology (WA Dept. of Ecology, 2024) and King County (King County, 2024a, 2024b, 2024c) historical and modern monitoring datasets were used. NOAA National Center for Environmental Information (NCEI)’s Salish cruise datasets were also used, as part of the Ocean Carbon and Acidification Data System (OCADS) (Alin et al., 2021). Further, air temperature data from NOAA Global Historical Climate Network (GHCN) (NOAA GHCN, 2018) and river discharge data from USGS (USGS, 2024) were used. (Please see manuscript for formal citations.)
