Seasonal indices with a weather control: stop planning on last March

Paired bars for February to June: the March index falls from 118 to 106 once warm and cold weeks are accounted for; other months move little.
Illustrative data for a composite case.

UK garden-centre chain, 46 stores, 209 weeks of sales plus weekly temperature, asked how to plan the spring without planning on last spring's weather.

A composite case, built from the kind of file we see most weeks. A chain of 46 garden centres across the Midlands and the south of England. Spring is the year: March to June carries close to half of plant sales, and plants are bought from growers months ahead, with little room to send them back.

The draft plan for spring 2027 had been built the usual way, last year's month plus 3%. March 2026 had been very good. The buying director's question was blunt: "Was last March the business, or was it the weather? Because I am about to order on it."

That is the third step of the Planning Path: the calendar, separated from what merely happened on it.

What the file looked like

209 weekly rows, October 2022 to September 2026, total sales across all stores. Next to it, one column the chain's analyst had added: the weekly mean temperature, averaged across the weather stations nearest the stores, and its difference from the 30-year normal for that week.

Four springs, and they were not alike. March 2024 and March 2026 were both warm, more than 2 °C above normal for most of the month. March 2023 was cold and wet, March 2025 close to normal. Easter fell in March once, in 2024, and in April in the other three years.

What the analysis did

Seasonality & Event Impact fits a regression with a trend, a dummy for each month, and dummies for events, and reports each month as an index against January, the reference month, which sits at 100.

Run with the calendar alone, it gave March an index of 118. That number is an average of four Marches, and two of them were warm. Nothing in that model can tell sunshine from season, so the warm weeks were booked to March itself.

The weather went in as two recurring events, built from the temperature column: a "warm spring week", any week from March to May more than 2 °C above normal, and a "cold spring week", more than 2 °C below. Across four springs that gave 23 warm weeks and 19 cold ones. Because they recur, each has enough occurrences for its effect to be estimated with a usable interval, net of month, trend, Easter and each other:

  • a warm spring week: +17%, interval +12% to +22%;
  • a cold spring week: −13%, interval −18% to −8%;
  • Easter: +21%, interval +13% to +29%.

With those terms in, the March index fell from 118 to 106. April moved from 152 to 146, May barely, from 171 to 168. February and June did not move at all, which is a useful check: the weather terms were only defined for spring, and the months outside it stayed where they were.

Collinearity was low. Warm weeks happened in different months in different years, so the model could tell "March" from "warm" without guessing; the product's variance-inflation check stayed under 2 for every term.

Forest plot: Easter plus 21%, a warm spring week plus 17%, a cold spring week minus 13%, all with intervals clear of zero.
Forest plot: Easter plus 21%, a warm spring week plus 17%, a cold spring week minus 13%, all with intervals clear of zero. Illustrative data for a composite case.

The verdict: it helps, by 10% on the March order

Last March, at roughly a warm month's level, was about 10% above what a March with normal weather and the current trend would deliver. The draft plan had taken that 10% as the starting point and added 3% on top.

The plan was rebuilt on the weather-neutral index:

  • The firm March 2027 plant order was set about 10% below the draft. On the chain's spring buying, that is a little under £300k of stock that, in a normal March, would have ended up discounted or composted.
  • The warm-week uplift became a contract term instead of a guess. About 12% of March volume was agreed with the two main growers as a call-off tranche, released if the two-week forecast turns warm. If it does, the chain is not caught short; if it does not, it does not pay for it.
  • Staffing followed the same logic: a base rota on the neutral index, with weekend hours that flex on the forecast.

There is also a cleaner read on Easter, which in 2027 falls in late March. With the weather out of it, the Easter effect is +21% on top of a normal week, and the plan for that week now says so explicitly, instead of being hidden in a March index that mixed Easter, sunshine and season together.

Why this worked when the sponsorship did not

The previous post was a single event in a single week, and the model could not separate it from anything. Weather is the opposite: it happens every spring, in different weeks, in different months, in different strengths. Recurrence is what turns a cause into something measurable. The same regression, with the same mechanics, gives a useless number for one and a firm one for the other.

The lesson

A seasonal index is only as clean as the years it was averaged over. When a recurring outside force, weather above all, lands unevenly on those years, it gets booked to the calendar, and next year is planned on last year's luck. Put the outside force into the model as its own term, and the calendar left behind is the one you can actually plan on.

tea, the product

Your file, this question

Fifteen analyses on a CSV of weekly data, with the intervals and the diagnostics shown, and a plain sentence when the data cannot answer. Free while in beta, by invitation.

Request a place in the beta

tea, the product

Fifteen econometric analyses on your own CSV: Seasonality & Event Impact, saturation curves, elasticities, budget allocation. Intervals and diagnostics shown, and a plain sentence when the file cannot answer.

Free while in beta, by invitation.

Request a place in the beta →

Liked this? Run it on your own data.

tea runs Seasonality & Event Impact and fourteen other analyses on any weekly CSV, in minutes. Free while in beta, by invitation.

Join the beta