It's January. You open the monitoring app, pull up last January, and the new number is lower. Eight percent lower, say. The thought arrives before you've finished reading the chart: are the panels wearing out already?
Probably not. But "probably" isn't much of an answer, so I went looking for how big the weather's share of that gap really is. I pulled 19 years of hourly PVGIS output for two cities, ran the statistics myself, and cross-checked the degradation side against NREL's published studies. What follows is that arithmetic, plus a way to test your own system.
Our guide on panels in cold weather covers why winter yield falls and what the latitude does. This piece asks a narrower question: when the number drops, how do you know whose fault it is?
Why Is One Winter a Terrible Test of Panel Health?
Because winter is the noisiest season of the year, and a single sunny or gloomy month swamps anything the modules are doing.
Here is what I ran. The PVGIS hourly service (version 5.3, SARAH3 radiation database) returns modeled output for every year from 2005 to 2023 at a chosen location. I requested 1 kWp, south-facing, 35 degree tilt, 14% system losses for Berlin (52.52 N, 13.405 E) and Madrid (40.4168 N, 3.7038 W), then summed the hours. These are model outputs from satellite data, not metered roofs. The ground truth for your own house will differ, and my 19-year averages sit a few percent away from the typical-year monthly figures in our winter guide; I haven't reconciled the two beyond noting that they come from different averaging.
| Modeled 1 kWp, 2005-2023 | Berlin | Madrid |
|---|---|---|
| Annual mean | 1,031 kWh | 1,611 kWh |
| Annual standard deviation | 60.6 kWh (5.9%) | 50.7 kWh (3.1%) |
| Worst-to-best annual range | 929 to 1,168 kWh | 1,536 to 1,697 kWh |
| December mean | 26.2 kWh | 100.0 kWh |
| December standard deviation | 5.6 kWh (21%) | 13.3 kWh (13%) |
| December range | 17.7 to 39.2 kWh | 63.7 to 114.7 kWh |
| Dec-Feb season standard deviation | 12.4% | 10.5% |
Read the Berlin December line twice. The darkest December in the series gave 17.7 kWh per kWp. The brightest gave 39.2. Same roof, same panels, a factor of 2.2. And December-to-December changes between neighbouring years ran from minus 28% to plus 92%, with 9 of 18 pairs moving by more than 20%.
So an 8% dip in January is comfortably inside the range a healthy system produces by chance. It isn't evidence of anything.
A panel that loses half a percent a year is invisible inside a winter that swings by a fifth, so the January-versus-January comparison in your app measures the sky, not the modules.
How Big Is Degradation Next to the Weather?
Small. That's the uncomfortable part.
NREL's analytical review of the degradation literature (Jordan and Kurtz, 2013) assembled nearly 2,000 reported rates and found a median of 0.5% per year. NREL's later fleet work, using inverter data from many real systems and the RdTools toolkit, reported a fleet median around 0.72% per year in its March 2020 methodology report. Take either number. Over ten years you've lost something between 5% and 7%.
Now set that against the chart below. The shaded band is one standard deviation of annual output for the Berlin roof, 5.9%. Ten years of median degradation is about the same size as that band. In other words, a decade of slow wear is no larger than the difference weather makes between two neighbouring calendar years.
Solargis, a vendor of solar resource data, makes the same point about Central Europe: its variability map puts Germany above 5% relative standard deviation in annual irradiation, with swings as large as plus or minus 12% in places. It's a commercial source, so I'd treat the exact numbers as indicative. My Berlin run, 5.9%, lands in the same neighbourhood.
How Long Until the Trend Shows?
You can estimate it. Fit a straight line to annual totals; the standard error of the slope is the yearly noise divided by the square root of n(n^2 - 1)/12, where n is the number of years. To tell a 0.5% per year slope from zero at two standard errors, Berlin's 5.9% noise needs n of about 19 years. Madrid's 3.1% needs about 13. That assumes each year is independent of the last, which real weather isn't quite, so treat it as an order of magnitude.
I also tried it the practical way. I took the real Berlin weather series, multiplied it by a synthetic panel losing exactly 0.5% a year, and asked what a raw-kWh trend line would conclude over rolling windows. Synthetic, so labeled as such: the weather is real, the panel is invented.
| Window | Berlin: estimated loss per year | Madrid: estimated loss per year |
|---|---|---|
| 5 years | minus 2.6% to plus 3.0% | minus 0.9% to plus 1.9% |
| 10 years | minus 0.5% to plus 0.7% | plus 0.0% to plus 0.8% |
| 15 years | minus 0.2% to plus 0.1% | plus 0.5% |
Over five years the Berlin roof could "improve" by 2.6% a year or "collapse" by 3.0%, for a panel that did neither. Even at ten years the answer straddled zero. (The windows overlap heavily inside a 19-year record, so don't read them as independent trials, and the 15-year row has only five windows.) The real series also carries a slow brightening trend over those years, which masks wear in the raw figures. I didn't try to separate that out.
What Does Winter Add on Top of the Weather?
Several things that look like decay and aren't.
- Low sun angle. A tree, chimney or neighbouring ridge that never touches the array in June can shade it for hours in December. Anything that shows only in winter and clears by April is a shading story. Our piece on checking panels are working shows how to read the production curve for this.
- Snow and frost. A covered string reports almost nothing, then recovers fully when it slides off.
- Batteries. Lithium cells charge badly below freezing, so battery management systems cut charge current, and an owner sees a pack that fills slower than the spreadsheet predicted. That reverses by afternoon. The published temperature bands for Powerwall 3, the Enphase IQ Battery 5P and others are tabulated in the battery sizing guide, and none of it is aging.
- Counters that mix sources. On a DC-coupled hybrid inverter, the "total yield" counter can rise when the battery discharges. The Huawei Solar integration for Home Assistant documents exactly this for SUN2000 inverters such as the SUN2000-15K-MB0: daily and total yield reflect inverter output, not solar input. A winter of heavy battery cycling then inflates a number you might be using as a panel health check.
What actually wears out slowly, the encapsulant and cell physics, is in the aging and end-of-life guide.
Which Methods Separate Weather From a Real Problem?
Three, in rising order of effort.
1. Compare against a model for the same year. PVGIS lets you request hourly modeled output for any past year at your coordinates, tilt and azimuth. Sum it by month and put your meter data beside it. A healthy system follows the model month by month, cloudy Decembers included. The catch: the SARAH3 database I used ends at 2023, so recent months need another route. Check the tool's current end year before planning around it.
2. Track a performance ratio. Divide your measured energy by what the measured irradiance on the array plane should have produced (the definition lives in IEC 61724-1). It needs an irradiance sensor or a trusted nearby reference, and it cancels most of the sky. A ratio that slips from season to season is your system.
3. Let a library do the statistics. NREL's RdTools describes year-on-year as its preferred degradation method: compare each day with the same day a year later, take the median of all those slopes, and report a confidence interval. Its function returns a degradation rate in percent per year along with an interval at a default 68.2% confidence level. It expects normalized input, so it solves the weather problem only if you've already done method 2.
The thresholds I'd pay attention to: a stable gap of 10 to 15% against the model across several months suggests soiling, shading or a lost string; a drop to half of modeled output suggests an offline string or inverter fault. Those echo the same-month tolerances in that monitoring guide, only measured against a model instead of last year.
What Would I Do With My Own Numbers?
Here's my opinion, and monitoring-app designers will dislike it: the "vs last year" arrow in most apps should be hidden for any period shorter than a full year, and it shouldn't be trusted for winter at all. It teaches owners to worry about the wrong thing.
If I owned a system, I wouldn't try to measure degradation before year five. I'd look for faults instead, because those are large, fast and fixable: a string at half its neighbour's current (the inverter data guide shows where to look), a winter-only shadow, a battery living on an exposed north wall. Warranty claims deserve normalized data and a few years of it. A one-winter dip won't get anyone a replacement panel, and it shouldn't.
One number surprised me while I was building the table: Berlin's best December in 19 years, 39.2 kWh per kWp, still fell short of Madrid's worst, 63.7. Latitude sets the baseline. Weather decides which side of it you land on.
Summary
Degradation at the NREL median of 0.5% a year (0.72% for the NREL fleet study) is smaller than the weather noise in any single year, and much smaller than winter noise. In a 19-year PVGIS run for Berlin, annual output varied by 5.9% (one standard deviation) and December by 21%, so ten years of median degradation hides inside the spread between neighbouring years. Resolving a 0.5% trend from raw kWh takes about 19 years in Berlin and 13 in Madrid. Compare your system with a modeled figure for the same year, track a performance ratio, or use a year-on-year method such as RdTools on normalized data. Treat a winter-only dip as shading, snow, cold-limited battery charging or a mixed yield counter until normalized data says otherwise.