Note
Go to the end to download the full example code.
British Columbia snow stations (DataBC)#
British Columbia runs an automated snow weather station (ASWS) network that reports SWE, snow depth, precipitation, temperature, wind, humidity and barometric pressure hourly, and a manual snow survey (MSS) network of courses measured around the first of the month. Both are in the inventory; only the automated sites carry a daily record.
There is one route, source="databc": station geometry from the BC Data
Catalogue WFS and observations from the province’s snow-data CSV service. No
account is needed. Station codes are BC location codes such as 1A01P,
where the trailing P marks an automated pillow site.
The figures show the stations of a piece of the southern interior coloured by kind, and one winter of SWE and snow depth at the automated sites there.
import matplotlib.pyplot as plt
import easysnowdata as esd
aoi = (-120.5, 49.5, -119.0, 51.0)
box = esd.parse_aoi(aoi)
print(box, box.utm_crs) # the map below is drawn in the AOI's UTM zone
AOI(bounds=(-120.5000, 49.5000, -119.0000, 51.0000), clip=True) EPSG:32611
Where the product comes from.
for src in esd.catalog.get("databc-stations").sources:
print(f"{src.id:20} {src.title:45} {', '.join(src.requires) or 'no account'}")
databc BC Data Catalogue / BC ENV snow data no account
Everything in the box, with the automated sites marked.
everything_gdf = esd.stations.inventory(aoi, networks="databc")
everything_gdf["kind"] = everything_gdf["daily_or_better"].map(
{True: "automated (ASWS)", False: "snow course (MSS)"}
)
print(everything_gdf["kind"].value_counts().to_string())
print(
everything_gdf[["name", "kind", "elevation_m", "earliest_record_date"]].to_string()
)
kind
snow course (MSS) 35
automated (ASWS) 9
name kind elevation_m earliest_record_date
code
1C44P Paradise Lake automated (ASWS) 1640.0 2023-08-30
1C47P Afton snow course (MSS) 693.0 2026-10-06
1D14P Ottomite Mountain automated (ASWS) 1460.0 1980-10-31
1F07P Turtle snow course (MSS) 660.0 2026-10-07
2F01AP Trout Creek West automated (ASWS) 1420.0 2017-10-11
2F03AP McCulloch automated (ASWS) 1245.0 2024-10-27
2F08P Greyback Reservoir automated (ASWS) 1550.0 2016-08-19
2F09P Whiterocks Mountain automated (ASWS) 1800.0 2022-06-28
2F10P Silver Star Mountain automated (ASWS) 1840.0 2015-08-13
2F18P Brenda Mine automated (ASWS) 1460.0 1992-10-01
2F19P Oyama Lake automated (ASWS) 1360.0 2020-08-27
1C07 Lac Le Jeune Lower snow course (MSS) 1270.0 NaT
1C25 Lac Le Jeune Upper snow course (MSS) 1509.0 NaT
1C30 Spahomin snow course (MSS) 1450.0 NaT
1C46 Pennask Creek snow course (MSS) 1718.0 NaT
1E05 Knouff Lake snow course (MSS) 1200.0 NaT
1E12 Mcqueen Lake snow course (MSS) 1100.0 NaT
1F01 Aberdeen Lake snow course (MSS) 1310.0 NaT
1F01A Aberdeen Lake snow course (MSS) 1310.0 NaT
1F01B Haddo Lake snow course (MSS) 1300.0 NaT
1F02 Anglemont snow course (MSS) 1190.0 NaT
2E04 Trapping Creek snow course (MSS) 930.0 NaT
2F01 Trout Creek snow course (MSS) 1430.0 NaT
2F01A Trout Creek West snow course (MSS) 1430.0 NaT
2F02 Summerland Reservoir snow course (MSS) 1280.0 NaT
2F03 McCulloch snow course (MSS) 1280.0 NaT
2F06 Bouleau Creek snow course (MSS) 1520.0 NaT
2F07 Postill Lake snow course (MSS) 1370.0 NaT
2F08 Greyback Reservoir snow course (MSS) 1550.0 NaT
2F09 Whiterocks Mountain snow course (MSS) 1780.0 NaT
2F10 Silver Star Mountain snow course (MSS) 1840.0 NaT
2F11 Isintok Lake snow course (MSS) 1680.0 NaT
2F13 Esperon Creek Upper snow course (MSS) 1620.0 NaT
2F14 Esperon Creek Middle snow course (MSS) 1420.0 NaT
2F15 Esperon Creek Lower snow course (MSS) 1340.0 NaT
2F16 Carrs Landing (Lower) snow course (MSS) 690.0 NaT
2F17 Carrs Landing (Upper) snow course (MSS) 980.0 NaT
2F18 Brenda Mine snow course (MSS) 1460.0 NaT
2F19 Oyama Lake snow course (MSS) 1340.0 NaT
2F21 Bouleau Lake snow course (MSS) 1400.0 NaT
2F22 Pearson Creek snow course (MSS) 940.0 NaT
2F23 MacDonald Lake snow course (MSS) 1740.0 NaT
2F24 Islaht Lake snow course (MSS) 1480.0 NaT
2F25 Postill Lake Upper snow course (MSS) 1540.0 NaT
The courses outnumber the automated sites almost four to one here, and
several pairs share a name: the automated site was put beside the course it
now supplements (2F10 and 2F10P are both Silver Star Mountain).
ax = esd.plotting.points(
everything_gdf.to_crs(box.utm_crs),
column="kind",
legend_label="BC site kind",
title="BC snow stations, southern interior",
)

SWE and snow depth through one water year at the automated sites. The daily snow-depth value is the 16:00 UTC reading, the morning observation in BC.
daily_gdf = everything_gdf[everything_gdf["daily_or_better"].fillna(False).astype(bool)]
obs_ds = esd.stations.load(daily_gdf, variables=["swe", "snwd"], time="2023-10/2024-09")
print(obs_ds["swe"].attrs)
fig, axes = plt.subplots(2, 1, figsize=(9, 7), sharex=True)
esd.plotting.timeseries(obs_ds["swe"], ax=axes[0], title="Water year 2024")
esd.plotting.timeseries(obs_ds["snwd"], ax=axes[1], title="", legend=False)
fig.tight_layout()

{'units': 'cm', 'long_name': 'snow water equivalent', 'native_variables': 'swe_mm', 'interval': 'daily'}
Two stations are in the legend and draw nothing. Ottomite Mountain is
inactive, and McCulloch’s record begins in October 2024, after this water
year ends. The inventory’s is_active and earliest_record_date say so
before anything is loaded; the count of observations says so after.
print(obs_ds["swe"].count(dim="time").to_series().to_string())
station
1C44P 366
1D14P 0
2F01AP 366
2F03AP 0
2F08P 366
2F09P 355
2F10P 365
2F18P 366
2F19P 366
The snow variables are only part of what the automated sites report. For wind, humidity or pressure, an hourly interval, or the quality flags, ask the client directly:
from easysnowdata.stations.clients import DataBCClient
records = DataBCClient().get_data(
station_ids=["1A01P"], variables=["temp", "wind_spd"],
begin_date="2024-03-01", end_date="2024-03-07", interval="hourly",
)
Total running time of the script: (0 minutes 17.260 seconds)