So far this winter we’ve gotten only 4.1 inches of snow, well below the normal 19.7 inches, and there is only 2 inches of snow on the ground. At this point last year we had 8 inches and I’d been biking and skiing on the trail to work for two weeks. In his North Pacific Temperature Update blog post, Richard James mentions that winters like this one, with a combined strongly positive Pacific Decadal Oscillation phase and strongly negative North Pacific Mode phase tend to be a “distinctly dry” pattern for interior Alaska. I don’t pretend to understand these large scale climate patterns, but I thought it would be interesting to look at snowfall and snow depth in years with very little mid-November snow. In other years like this one do we eventually get enough snow that the trails fill in and we can fully participate in winter sports like skiing, dog mushing, and fat biking?
We will use daily data from the Global Historical Climate Data set for the Fairbanks International Airport station. Data prior to 1950 is excluded because of poor quality snowfall and snow depth data and because there’s a good chance that our climate has changed since then and patterns from that era aren’t a good model for the current climate in Alaska.
We will look at both snow depth and the cumulative winter snowfall.
The following tables show the ten years with the lowest cumulative snowfall and snow depth values from 1950 to the present on November 18th.
|Year||Cumulative Snowfall (inches)|
|Year||Snow depth (inches)|
2016 has the second-lowest cumulative snowfall behind 1953 and is tied for second with 2014 for snow depth with 1953, 1954 and 1962 all having only 1 inch of snow on November 18th.
It also seems like recent years appear in these tables more frequently than would be expected. Grouping by decade and averaging cumulative snowfall and snow depth yields the pattern in the chart below. The error bars (not shown) are fairly large, so the differences between decades aren’t likely to be statistically significant, but there is a pattern of lower snowfall amounts in recent decades.
Now let’s see what happened in those years with low snowfall and snow depth values in mid-November starting with cumulative snowfall. The following plot (and the subsequent snow depth plot) shows the data for the low-value years (and one very high snowfall year—1990), with each year’s data as a separate line. The smooth dark cyan line through the middle of each plot is the smoothed line through the values for all years; a sort of “average” snowfall and snow depth curve.
In all four mid-November low-snowfall years, the cumulative snowfall values remain below average throughout the winter, but snow did continue to fall as the season went on. Even the lowest winter year here, 2006–2007, still ended the winter with 15 inches of snow on the groud.
The following plot shows snow depth for the four years with the lowest snow depth on November 18th. The data is formatted the same as in the previous plot except we’ve jittered the values slightly to make the plot easier to read.
The pattern here is similar, but the snow depths get much closer to the average values. Snow depth for all four low snow years remain low throughout November, but start rising in December, dramatically in 1954 and 2014.
One of the highest snowfall years between 1950 and 2016 was 1990–1991 (shown on both plots). An impressive 32.8 inches of snow fell in eight days between December 21st and December 28th, accounting for the sharp increase in cumulative snowfall and snow depth shown on both plots. There are five years in the record where the cumulative total for the entire winter was lower than these eight days in 1990.
Despite the lack of snow on the ground to this point in the year, the record shows that we are still likely to get enough snow to fill in the trails. We may need to wait until mid to late December, but it’s even possible we’ll eventually reach the long term average depth before spring.
Here’s the R code used to generate the statistics, tables and plots from this post:
library(tidyverse) library(lubridate) library(scales) library(knitr) noaa <- src_postgres(host="localhost", dbname="noaa") snow <- tbl(noaa, build_sql( "WITH wdoy_data AS ( SELECT dte, dte - interval '120 days' as wdte, tmin_c, tmax_c, (tmin_c+tmax_c)/2.0 AS tavg_c, prcp_mm, snow_mm, snwd_mm FROM ghcnd_pivot WHERE station_name = 'FAIRBANKS INTL AP' AND dte > '1950-09-01') SELECT dte, date_part('year', wdte) AS wyear, date_part('doy', wdte) AS wdoy, to_char(dte, 'Mon DD') AS mmdd, tmin_c, tmax_c, tavg_c, prcp_mm, snow_mm, snwd_mm FROM wdoy_data")) %>% mutate(wyear=as.integer(wyear), wdoy=as.integer(wdoy), snwd_mm=as.integer(snwd_mm)) %>% select(dte, wyear, wdoy, mmdd, tmin_c, tmax_c, tavg_c, prcp_mm, snow_mm, snwd_mm) %>% collect() write_csv(snow, "pafa_data_with_wyear_post_1950.csv") save(snow, file="pafa_data_with_wyear_post_1950.rdata") cum_snow <- snow %>% mutate(snow_na=ifelse(is.na(snow_mm),1,0), snow_mm=ifelse(is.na(snow_mm),0,snow_mm)) %>% group_by(wyear) %>% mutate(snow_mm_cum=cumsum(snow_mm), snow_na=cumsum(snow_na)) %>% ungroup() %>% mutate(snow_in_cum=round(snow_mm_cum/25.4, 1), snwd_in=round(snwd_mm/25.4, 0)) nov_18_snow <- cum_snow %>% filter(mmdd=='Nov 18') %>% select(wyear, snow_in_cum, snwd_in) %>% arrange(snow_in_cum) decadal_avg <- nov_18_snow %>% mutate(decade=as.integer(wyear/10)*10) %>% group_by(decade) %>% summarize(`Snow depth`=mean(snwd_in), snwd_sd=sd(snwd_in), `Cumulative Snowfall`=mean(snow_in_cum), snow_cum_sd=sd(snow_in_cum)) decadal_averages <- ggplot(decadal_avg %>% gather(variable, value, -decade) %>% filter(variable %in% c("Cumulative Snowfall", "Snow depth")), aes(x=as.factor(decade), y=value, fill=variable)) + theme_bw() + geom_bar(stat="identity", position="dodge") + scale_x_discrete(name="Decade", breaks=c(1950, 1960, 1970, 1980, 1990, 2000, 2010)) + scale_y_continuous(name="Inches", breaks=pretty_breaks(n=10)) + scale_fill_discrete(name="Measurement") print(decadal_averages) date_x_scale <- cum_snow %>% filter(grepl(' (01|15)', mmdd), wyear=='1994') %>% select(wdoy, mmdd) cumulative_snowfall <- ggplot(cum_snow %>% filter(wyear %in% c(1953, 1954, 2014, 2006, 1990), wdoy>183, wdoy<320), aes(x=wdoy, y=snow_in_cum, colour=as.factor(wyear))) + theme_bw() + geom_smooth(data=cum_snow %>% filter(wdoy>183, wdoy<320), aes(x=wdoy, y=snow_in_cum), size=0.5, colour="darkcyan", inherit.aes=FALSE, se=FALSE) + geom_line(position="jitter") + scale_x_continuous(name="", breaks=date_x_scale$wdoy, labels=date_x_scale$mmdd) + scale_y_continuous(name="Cumulative snowfall (in)", breaks=pretty_breaks(n=10)) + scale_color_discrete(name="Winter year") print(cumulative_snowfall) snow_depth <- ggplot(cum_snow %>% filter(wyear %in% c(1953, 1954, 1962, 2014, 1990), wdoy>183, wdoy<320), aes(x=wdoy, y=snwd_in, colour=as.factor(wyear))) + theme_bw() + geom_smooth(data=cum_snow %>% filter(wdoy>183, wdoy<320), aes(x=wdoy, y=snwd_in), size=0.5, colour="darkcyan", inherit.aes=FALSE, se=FALSE) + geom_line(position="jitter") + scale_x_continuous(name="", breaks=date_x_scale$wdoy, labels=date_x_scale$mmdd) + scale_y_continuous(name="Snow Depth (in)", breaks=pretty_breaks(n=10)) + scale_color_discrete(name="Winter year") print(snow_depth)