Is midweek football different?
Tired legs, rotated squads, cold Tuesday nights. Midweek matches are supposed to be a different game. Over 10,000 Scottish league matches, they have the same results, the same upsets and, like for like, the same goals.
Beginner
Contents
The claim
"Midweek games are a different animal." Tired legs from Saturday, squads rotated, a cold Tuesday night and a smaller crowd: all of it, the argument goes, makes midweek football cagier, lower scoring and more likely to throw up a shock.
Why people believe it
Midweek matches stand out in the memory. They're often rearranged fixtures, crammed into a busy spell, played under lights in the middle of winter. A shock result on a Wednesday night feels like proof that midweek is different, and a dull 0–0 in January rain feels typical of it.
The data
Every Scottish Premiership and Championship match from 2000/01 to 2025/26: 10,471 matches, with the day each was played and the final score, from football-data.co.uk. Where the files have them, Bet365's pre-match odds: about nine matches in ten.
The method
Split the matches by the day they were played:
- Weekend: Saturday and Sunday, 8,549 matches.
- Midweek: Tuesday, Wednesday and Thursday, 1,478 matches.
- Monday and Friday: 444 matches, mostly moved for television; kept separate.
Then compare three things: the results, the goals, and the upsets. Upsets need care: if midweek fixtures happened to involve more mismatches, favourites would win more often midweek for reasons that have nothing to do with the day. So instead of counting favourites' wins, compare them with what the bookmakers expected before kick-off, as in Bayes' theorem.
The evidence
The results are the same. Home sides won 42.8% of weekend matches and 42.8% of midweek ones. Draws and away wins differ by half a point. Monday and Friday matches, with far fewer games behind them, are within luck of the rest too.
Upsets
| Favourites | Expected | Won | Gap |
|---|---|---|---|
| Weekend | 50.8% | 51.1% | +0.4 (±1.1) |
| Midweek | 52.3% | 51.6% | −0.7 (±2.6) |
| Mon or Fri | 49.1% | 49.5% | +0.4 (±4.7) |
Favourites won almost exactly as often as the bookmakers expected, on every day of the week. Midweek favourites fell short by less than a point, well inside the range luck alone produces. There's no extra supply of midweek shocks.
Goals
Raw, midweek matches have slightly fewer goals: 2.61 a game against 2.69 at weekends. But midweek matches aren't a random sample. 47% of them are played in December, January or February, against 29% of weekend matches, and they're more often in the Premiership. Winter and division both affect scoring.
So compare like with like: each midweek match against weekend matches in the same division, season and month. Midweek then scores 2.61 against 2.66, a gap of 0.06 goals a game, inside the ±0.08 range for luck. Most of the raw gap was the calendar, not the day.
Verdict
Not supported. Midweek football in Scotland looks just like weekend football. Home sides win exactly as often, favourites win as often as the bookmakers expect, and once you allow for when midweek matches fall, the goals are the same to within a few hundredths. Whatever tired legs and cold nights do, they don't show up in the results.
Caveats
- League matches only. Cup ties and European nights, where the midweek effect is most often claimed, aren't in these files.
- No squad information. The data can't show whether teams rotated players midweek; only that, if they did, the results didn't change.
- Days, not rest. A Saturday match after a midweek game might show the tiredness instead; this compares the midweek matches themselves.
- Odds are missing for some matches, mostly early Championship seasons, so the upset comparison uses about nine in ten matches.
Reproduce the analysis
The results and odds files are published by football-data.co.uk. Download the Premiership (SC0) and Championship (SC1) files for each season from 2000/01 to 2025/26 and save each under its own name, such as SC0_2425.csv and SC1_2425.csv; they aren't rehosted on this site. Then:
import csv
from collections import Counter, defaultdict
from datetime import datetime
from math import sqrt
def when(d):
return datetime.strptime(d, "%d/%m/%Y" if len(d) == 10 else "%d/%m/%y")
def slot(day): # Saturday and Sunday; Tuesday to Thursday; Monday and Friday, mostly TV games
return "weekend" if day in ("Sat", "Sun") else "midweek" if day in ("Tue", "Wed", "Thu") else "Mon/Fri"
games = defaultdict(list) # slot -> (goals, result, favourite's chance and whether it won, cell for like-for-like goals)
for y in range(2000, 2026):
s = f"{y % 100:02d}{(y + 1) % 100:02d}"
for div in ("SC0", "SC1"): # Premiership and Championship
with open(f"{div}_{s}.csv", encoding="latin-1") as f:
for r in csv.DictReader(f):
if r.get("FTR") not in ("H", "D", "A"):
continue
d = when(r["Date"])
favourite = None
try:
odds = {k: float(r["B365" + k]) for k in "HDA"}
except (KeyError, ValueError):
odds = None
if odds and min(odds.values()) > 1: # Bet365 odds turned into probabilities that add up to 1
p = {k: 1 / v for k, v in odds.items()}
fav = "H" if p["H"] >= p["A"] else "A"
favourite = (p[fav] / sum(p.values()), r["FTR"] == fav)
games[slot(d.strftime("%a"))].append((int(r["FTHG"]) + int(r["FTAG"]), r["FTR"], favourite, (div, s, d.month)))
for name, rows in games.items():
n = len(rows)
goals = [g for g, *_ in rows]
mean = sum(goals) / n
margin = 1.96 * sqrt(sum((g - mean) ** 2 for g in goals) / n / n)
results = Counter(r for _, r, _, _ in rows)
favs = [f for _, _, f, _ in rows if f]
said, won = sum(p for p, _ in favs) / len(favs), sum(w for _, w in favs) / len(favs)
print(f"{name:8} {n:5} matches: {mean:.2f} goals (±{margin:.2f}); home {results['H'] / n:.1%}, draw {results['D'] / n:.1%}, away {results['A'] / n:.1%}; "
f"favourites expected {said:.1%}, won {won:.1%} ({won - said:+.1%}, ±{1.96 * sqrt(won * (1 - won) / len(favs)):.1%})")
# like for like: each midweek match against weekend matches in the same division, season and month
weekend = defaultdict(list)
for g, _, _, cell in games["weekend"]:
weekend[cell].append(g)
pairs = [(g, sum(weekend[cell]) / len(weekend[cell])) for g, _, _, cell in games["midweek"] if weekend[cell]]
actual, expected = sum(g for g, _ in pairs) / len(pairs), sum(e for _, e in pairs) / len(pairs)
print(f"midweek, like for like ({len(pairs)} matches): {actual:.2f} goals against {expected:.2f} at weekends, {actual - expected:+.2f}")
months = Counter(cell[2] for *_, cell in games["midweek"])
print("midweek matches in December to February:", f"{sum(months[m] for m in (12, 1, 2)) / len(games['midweek']):.0%}")
Spotted a flaw in the method, or have a football claim you'd like tested? Suggest it on LinkedIn, where discussion of these articles happens.