Data Sources and Methods
Last updated August 21, 2026
Where the data comes from
VSWeather is built on historical reanalysis data from Open-Meteo, which combines decades of observations into a consistent gridded record of daily weather reaching back to 1940. From it we compute climate normals for the years 1991 through 2020, the standard 30 year reference period that meteorologists use.
We also use station normals published by the United States National Centers for Environmental Information (NCEI), part of NOAA, to check and calibrate our figures. NOAA data is not shown directly on the site. It is the reference we measure our numbers against.
Required credits
VSWeather displays and builds on the following sources, with the credits their licenses require:
- Weather data by Open-Meteo.com, used under the Creative Commons Attribution 4.0 license (CC BY 4.0).
- This product contains modified Copernicus Climate Change Service information. The underlying reanalysis, ERA5, is produced by the European Centre for Medium Range Weather Forecasts for the Copernicus Climate Change Service. Neither the Service nor the Centre is responsible for any use of this information.
- Station normals from NOAA NCEI, which are in the public domain.
How we compute the numbers
For every city we reduce 30 years of daily values into typical yearly and monthly figures:
- Temperatures are the average daily high and low for each month across the period.
- Precipitation and snowfall are annual and monthly totals, averaged across the period. Precipitation counts all water reaching the ground: rain plus the melted water content of snow and ice. Snowfall is accumulated depth, a separate measure, so the two figures are not added together; a foot of fresh snow melts down to roughly an inch of water in the precipitation total.
- A rainy day and a snowy day use day count thresholds chosen to match the conventions NOAA uses, adjusted so the gridded data lines up with what gauges on the ground record.
- Sunny days per year counts days whose average cloud cover falls below a threshold we tuned against NOAA's published sky cover values, since sunshine is not part of standard climate normals and has to be derived.
How we verify the numbers
A weather grid can be internally consistent and still fail to describe a real place. A cell that blends a town with the mountains beside it, or with the water next to it, produces numbers that look plausible and are wrong. So we treat station measurements as the truth to match: before a dataset reaches the site, every city's record is compared against normals measured at nearby NOAA stations.
Two checks gate every release:
- The precipitation check compares each city's published annual precipitation and wet day count with estimates built from nearby station normals. The larger cities our national ranking pages draw from are held to a tighter tolerance, because small errors matter most at the top and bottom of a ranked list.
- The temperature check confirms that published monthly temperatures sit on their station targets, and that our counts of days reaching 90 °F and nights falling below freezing agree with the counts stations record.
A city outside tolerance blocks the release. The fix is to anchor that city to measured records, with the stations cited as evidence, and rebuild. We never ship a flagged number. This process is what caught the grid claiming 74 inches of rain a year for Vancouver, Washington, when measured records put it near 40.
Three metrics are corrected to measured targets rather than published as raw model output. Snowfall is corrected for every city, because the model reads low in cold and lake effect climates. Precipitation is anchored for the roughly two hundred localities whose grid cell measurably misrepresents the place. Temperature is anchored for nearly every covered city: monthly station normals set the level while the model keeps the day to day shape, and the few places without a qualifying station nearby are tracked as unverified rather than assumed correct. Every correction records its measured targets, the stations behind them, and the reason for the change.
Two metrics cannot be verified this way, and we say so. No station normals product exists for sunshine or sky cover, so both stay model derived, and small sunshine differences between similar cities deserve more caution than temperature or precipitation differences.
The strictest rule is what we refuse to show. The pipeline computes modeled bright sunshine hours and uncorrected model snowfall, and neither appears anywhere on the site: modeled sunshine hours read far above published records, and raw model snowfall is superseded by the corrected figure. The ban is enforced in code. The data structure our pages read is defined without those fields, so a page cannot show them even by mistake.
Units
Climate values are stored internally in metric units and shown in Fahrenheit and inches for our launch audience in the United States. Other unit options are planned.
A note on accuracy
Reanalysis describes a grid cell of roughly ten kilometers, not one exact spot, so a value can differ from a specific backyard or official station, especially in mountains and along coastlines. VSWeather is a guide to how places compare over the long run, not a substitute for official records. See our Terms of Use for the full disclaimer.
Citing VSWeather
If you use these figures in a paper, report, or article, cite the page for the specific city rather than the site as a whole, and name the reference period. Every city page ends with a ready citation and a BibTeX entry you can copy. The general form, shown here for Fort Collins:
VSWeather. Fort Collins, CO weather and climate: 1991-2020 climate normals. https://vsweather.com/weather/fort-collins-co/. Computed from Open-Meteo historical reanalysis, station-calibrated against NOAA NCEI climate normals.
Add an access date in whatever citation style you follow. The reference period matters more than the access date: individual numbers can improve when a city is anchored to newer station evidence, but a citation naming the 1991 to 2020 normals identifies the dataset it drew from either way.