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",
)
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()
Water year 2024
{'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)