The number that actually decides the session

Fish are ectotherms. Their body temperature follows the water, and so does nearly everything an angler cares about: how much they eat, how far they move to eat it, and how long a window of activity lasts. Air temperature is what you feel standing on the bank. Water temperature is what the fish feel, and the two can sit ten degrees apart on the same afternoon.

That gap is the whole reason this page exists. A forecast that says 24 °C tells you to bring a shirt, not whether the bass are still shallow. Water temperature is slower, heavier and more conservative than the air above it — and slower is exactly what makes it possible to estimate.

Why today's air temperature is the wrong input

Walk into a lake on the first warm day of spring and the water is still cold. The air warmed up in an afternoon; the water has months of accumulated cold to undo. Water has a very high heat capacity and a large volume, so it responds to air temperature the way a heavy flywheel responds to a push — it moves, but it takes time and it keeps going after you stop pushing.

The practical consequence is that the useful input is not today's air temperature but a weighted history of the last week, with recent days counting for more than older ones. In our model the weights decay exponentially with a half-life of a bit over two days: yesterday counts roughly three quarters as much as today, the day before roughly three quarters of that, and after seven days the contribution has faded to a rounding error.

This is not a stylistic choice. An estimate driven by today's air temperature alone swings several degrees on a single warm afternoon and is wrong on exactly the days you would trust it most — the first warm day after a cold snap, when the water is still cold and the fish are still deep.

A cold front does not chill a lake in an afternoon. It chills the surface layer, and the catch rate drops long before the water temperature does.

The seasonal term, and why it lags the calendar

There is a second component the air-temperature history cannot supply on its own: the slow annual cycle. Even in a week of perfectly average weather, February water and July water differ by far more than the week's air temperature explains.

The model adds a sinusoidal season term with a fitted phase. That phase is the interesting part. Water peaks after the air does — the fitted lag for US streams is on the order of four months against the air-temperature year, which is what a large thermal mass does to a seasonal signal. Getting this phase wrong by a month is worth several degrees of error in spring and autumn, which is precisely when the fishing is changing fastest.

What the estimate is built from

Every estimate on a city page is produced from four things, in this order:

  1. Seven complete days of daily mean air temperature at the location, newest first. Today is excluded — a partial day biases the mean — and any day with under half its expected temperature readings is dropped rather than averaged over.
  2. Exponentially decaying weights across those seven days, normalised so they sum to one.
  3. A season term with a fitted phase, as described above.
  4. Fitted coefficients — an intercept, an air-temperature gain and the season amplitude — selected for the location.

Step four is where the model stops being a textbook formula and starts being calibrated. The coefficients are not constants in the code. They were fitted against USGS stream gauges: daily mean water temperature from the NWIS network, joined with reanalysis air temperature at each gauge, one least-squares fit per station, then blended at query time from the five nearest gauges weighted by distance.

The current fit uses 55 gauges and roughly 170,000 station-days. Validated by leaving one station out at a time and predicting it from the rest, the calibrated model has a mean absolute error of about 2 °C (3.5 °F). The same model with literature-default coefficients — essentially "water temperature equals recent air temperature" — errors by about 3.2 °C. Calibration buys roughly a third off the error, which matters most in exactly the situations the defaults get wrong.

Where the estimate fails, stated plainly

A 2 °C mean error is a mean. Some water is much harder than that, and the honest list is short:

  • Reservoir releases. Water drawn from the hypolimnion of a deep reservoir can be ten degrees colder than the surface water downstream of the dam, and it arrives without warning.
  • Spring-fed reaches. Groundwater enters at a nearly constant temperature year round; a spring creek in August is colder than any air-temperature model will predict.
  • Deep pools and stratified water. A single number cannot describe a lake that is 24 °C at the surface and 12 °C at eight metres. If you are fishing deep, the estimate describes the layer it was fitted for, not the one your lure is in.
  • Tidal water. Salt water moves heat differently and tidal exchange imports water from somewhere the model never looked at.
  • Locations far from any gauge. If the nearest reference gauge is hundreds of kilometres away, the coefficients are applied as a regional proxy, and the real error is larger than the validated figure. The card on each city page says so when this applies.

None of these are edge cases you can ignore. They are the reason the estimate carries an explicit interval instead of a single confident number, and the reason the interval is wider than the error figure rather than equal to it.

Why there is no number for some days

When the site cannot reach live weather data, the city pages fall back to a seasonal climate baseline so the index still renders something. The water-temperature card is not shown in that state. A climate placeholder is not measured weather, and feeding it to a model validated on real air temperatures would dress up an invented input as a calibrated estimate. No number is the honest output there.

The same rule applies at the model level: fewer than two complete days of air temperature and the estimate is refused outright rather than extrapolated. And a raw output below freezing is clamped at 0 °C, with the clamp stated on the card — open fresh water cannot sit below it, and a clamped value should not be read as a precise one.

How to use it

Water temperature is a timing input, not a location. It tells you which part of the season you are in, whether a warming trend has actually reached the water yet, and whether the fish should be in a pre-spawn, post-spawn or summer pattern. It tells you nothing about where in a given river or lake they are holding — that depends on current, structure, cover, bait and pressure, and no thermometer substitutes for reading the water in front of you.

Used that way it is genuinely useful: the difference between "the air has been warm for three days" and "the water has been warm for three weeks" is usually the difference between a tough session and a good one.

The LureScore app carries the same estimate alongside the daily index, so the number you read here and the number in the app agree.

Analyze your river with AI