Snow Water Equivalent Explained: Depth Is Not Water

On this page

Problem statement

Ask how much snow there is and you can mean two things: how deep it is, or how much water it holds. For skiing the first matters; for rivers, reservoirs and floods only the second does. Snow water equivalent (SWE) is the depth of water the snowpack would make if it melted on the spot, and the ratio between it and the snow depth — the snow's density — changes from fluffy new snow to dense spring snow by a factor of four or five. A snowpack can get shallower while holding more water.

This page measures the relationship at the Niwot SNOTEL station in Colorado, where both depth and SWE have been recorded daily since 2005, and shows why the two peak on different days.

Quick answer

SWE is depth times density relative to water. Where both are measured, density follows directly — and it is anything but constant:

d = d[d.wy.between(2006, 2025)]
m = d.depth_mm >= 127                                   # at least 5 inches on the ground
density = (d.swe_mm / d.depth_mm)[m] * 1000             # kg/m³, water = 1000
print(f"bulk density: 5th {np.percentile(density, 5):.0f}, median {density.median():.0f}, 95th {np.percentile(density, 95):.0f} kg/m³")
peak_swe, peak_depth = d.groupby("wy").swe_mm.idxmax(), d.groupby("wy").depth_mm.idxmax()
lag = (peak_swe - peak_depth).dt.days
print(f"peak SWE came after peak depth in {(lag > 0).sum()} of {len(lag)} water years, by a median of {lag.median():.1f} days")
bulk density: 5th 182, median 260, 95th 425 kg/m³
peak SWE came after peak depth in 20 of 20 water years, by a median of 16.5 days
Water year 2024 at Niwot: snow depth peaks at 1,930 mm on 14 March after a storm and then falls, while snow water equivalent keeps rising to 381 mm on 29 March; below, bulk density rises from about 250 kg/m³ in winter to over 450 in May. Water year 2024 at Niwot: snow depth peaks at 1,930 mm on 14 March after a storm and then falls, while snow water equivalent keeps rising to 381 mm on 29 March; below, bulk density rises from about 250 kg/m³ in winter to over 450 in May.
NRCS SNOTEL 663:CO:SNTL, converted from inches.

Units, light new snow, densification

From snow depth to water: the steps and what they show at Niwot. from depth to water1measure bothpillow and depth sensor2density = SWE / depthmedian 260 kg/m³3new snow is light79 kg/m³4the pack densifies221 → 400 kg/m³, Nov–May5peaks part companySWE 16.5 days after depthEvery water year from 2006 to 2025 spatialworkflow.io
Why depth and water peak apart.

1. Units

SWE is a depth of water, so it is quoted in millimetres or inches, like rainfall. 100 mm of SWE over a square kilometre is 100,000 m³ of water. Snow depth is in the same units but means something else entirely:

y24 = d[d.wy == 2024]
print(f"2024 depth peak: {y24.depth_mm.max():.0f} mm on {y24.depth_mm.idxmax():%d %b}, holding {y24.swe_mm[y24.depth_mm.idxmax()]:.0f} mm of water")
print(f"2024 SWE peak:   {y24.swe_mm.max():.0f} mm on {y24.swe_mm.idxmax():%d %b}, under {y24.depth_mm[y24.swe_mm.idxmax()]:.0f} mm of snow")
2024 depth peak: 1930 mm on 14 Mar, holding 353 mm of water
2024 SWE peak:   381 mm on 29 Mar, under 1295 mm of snow

Two weeks after the deepest snow of 2024, the pack was a third shallower and held more water.

2. New snow is light

On days when depth jumped by at least 250 mm, the SWE gain gives the density of the snow that fell:

dd, ds = d.depth_mm.diff(), d.swe_mm.diff()
storm = dd >= 250
print(f"{storm.sum()} storm days: median new-snow density {(ds[storm] / dd[storm]).median() * 1000:.0f} kg/m³")
40 storm days: median new-snow density 79 kg/m³

Cold Rocky Mountain powder arrives at well under a tenth of the density of water.

3. The pack densifies

Once on the ground, snow settles under its own weight, its crystals round, and in spring meltwater refreezes inside it. Density rises through the season, which is why depth falls while SWE holds or grows:

print(density.groupby(density.index.month).median().round().loc[[11, 1, 3, 4, 5]].to_string())
date
11    221.0
1     238.0
3     280.0
4     350.0
5     400.0
Box plots of bulk density at Niwot by month, medians rising from about 175 kg/m³ in October to 410 in June. Box plots of bulk density at Niwot by month, medians rising from about 175 kg/m³ in October to 410 in June.
SWE divided by depth, 2005–2025.

4. A constant density is a poor substitute

Where only depth is measured, SWE is often estimated with a fixed density. At Niwot, 250 kg/m³ — close to the overall median — is wrong by tens of millimetres on a typical day and by more when it matters most:

est = d.depth_mm * 0.25
print(f"median absolute error: {np.median(np.abs((est - d.swe_mm)[m])):.0f} mm on all snow days, "
      f"{np.median(np.abs((est - d.swe_mm).loc[peak_swe.values])):.0f} mm on the day of peak SWE")
median absolute error: 23 mm on all snow days, 72 mm on the day of peak SWE

5. Measure SWE where water matters

A SNOTEL snow pillow measures SWE directly, as weight. That is why water-supply forecasting rests on SWE networks rather than on depth, and why satellite snow maps — which see snow-covered area, not water — have to be combined with models or stations to say anything about volume.

The same depth with different water

The data used on this page

NRCS SNOTEL station Niwot (663:CO:SNTL), daily snow water equivalent (WTEQ) and snow depth (SNWD), water years 2006–2025, from the NRCS AWDB REST API.

import numpy as np
import pandas as pd
import requests

URL = ("https://wcc.sc.egov.usda.gov/awdbRestApi/services/v1/data?stationTriplets=663:CO:SNTL"
       "&elements=WTEQ,SNWD&duration=DAILY&beginDate=2005-10-01&endDate=2025-09-30")
payload = requests.get(URL, timeout=120).json()
cols = {}
for el in payload[0]["data"]:
    v = pd.DataFrame(el["values"])
    cols[el["stationElement"]["elementCode"]] = v.set_index(pd.to_datetime(v["date"]))["value"] * 25.4   # inches -> mm
d = pd.DataFrame(cols).rename(columns={"WTEQ": "swe_mm", "SNWD": "depth_mm"})
d["wy"] = (d.index + pd.DateOffset(months=3)).year
print(len(d), "days;", d.notna().sum().to_dict())
7305 days; {'depth_mm': 7246, 'swe_mm': 7305, 'wy': 7305}

Example 1: the same depth, different water

Two days with the same snow depth can hold very different amounts of water:

near = d[(d.depth_mm >= 1000) & (d.depth_mm <= 1050)]
print(f"{len(near)} days with 1.00-1.05 m of snow: SWE from {near.swe_mm.min():.0f} to {near.swe_mm.max():.0f} mm")
print(near.loc[[near.swe_mm.idxmin(), near.swe_mm.idxmax()], ["depth_mm", "swe_mm"]].round().to_string())
182 days with 1.00-1.05 m of snow: SWE from 180 to 434 mm
            depth_mm  swe_mm
date                        
2006-12-22    1016.0   180.0
2007-04-19    1016.0   434.0

Example 2: water volume over a basin

SWE times area is volume. For a hypothetical 100 km² of terrain holding Niwot's median peak SWE:

peak = d.groupby("wy").swe_mm.max()
volume_m3 = peak.median() / 1000 * 100e6
print(f"median peak SWE {peak.median():.0f} mm over 100 km² = {volume_m3 / 1e6:.0f} million m³ of water")
median peak SWE 380 mm over 100 km² = 38 million m³ of water

A single station does not represent a basin — snow varies with elevation, aspect and wind — but the arithmetic is the reason SWE, not depth, is the quantity forecasters need.

Snow is mostly air

Snow is mostly air. Fresh snow can be ninety per cent or more air by volume; old spring snow perhaps sixty per cent. Depth measures the whole column, air included. SWE measures only the ice, as the depth of water it would melt into, and is therefore the physically meaningful quantity for anything that involves water.

What a column of snow is made of, from new powder to spring snow, at Niwot SNOTEL. snow is mostly airspring snowMay median400 kg/m³ · 60% airsettled packJanuary median238 kg/m³ · 76% airnew powderstorm days79 kg/m³ · 92% airSWE counts only the ice: depth × density ÷ 1000 spatialworkflow.io
Depth counts the air; SWE does not.

The two are linked by density, and density is not a constant. It starts low as snow falls, rises as the pack settles and ages, and climbs steeply in spring as meltwater percolates and refreezes. That is why the deepest day of a winter comes before the wettest one — every year at Niwot in this record, by a median of more than two weeks — and why a depth measurement alone, multiplied by a fixed density, misses most at the moment of peak water storage.

Peak depth before peak SWE, and bridging pillows

The two peaks of the 2024 snowpack at Niwot. water year 2024: two different peaksdatedepthSWEdeepest day14 March1,930 mm353 mmwettest day29 March1,295 mm✓381 mmA third shallower, and holding more water spatialworkflow.io
Which peak a report means matters.
  • SWE is a water depth: mm × area = volume.
  • Density changes: about 80 kg/m³ for new powder here, over 400 in late spring.
  • Peak depth precedes peak SWE; report which peak.
  • Constant-density estimates are weakest in spring, exactly when water matters.
  • Snow pillows can bridge under ice layers and under-read; compare with depth for sudden steps.
  • Satellites measure area, not SWE, except experimental microwave and lidar methods.

FAQ

What is snow water equivalent?

The depth of water the snowpack would produce if melted, usually in millimetres or inches. It equals snow depth times density relative to water.

How do I convert snow depth to SWE?

Multiply by the snow's density relative to water — but density varies from about 0.08 for new snow to over 0.4 in spring, so a fixed value gives large errors.

Why does snow get shallower but hold more water?

The pack settles and densifies, and in spring absorbs meltwater and rain. At Niwot, peak SWE came after peak depth every year from 2006 to 2025.

How is SWE measured?

Directly with snow pillows (as at SNOTEL stations) or snow tubes that weigh a core of snow; indirectly from depth and an assumed or measured density.