Heat Exposure Explained
On this page
Problem statement
Heat maps are easy to make and easy to misread as risk maps. A hot surface is a hazard; whether it harms anyone depends on who is there, when, for how long, and how well they can cope. The standard risk framing — hazard × exposure × vulnerability — separates these, and most of the errors in urban heat analysis come from letting one stand in for another: a late-morning surface temperature for the hazard, a residential population count for the exposure, and nothing at all for vulnerability.
Health evidence adds a twist the heat map does not show. Deaths during heatwaves track air temperature, and especially the lack of relief at night, more closely than daytime peaks. A city whose nights stay warm is more dangerous than one with a slightly hotter afternoon.
Quick answer
- Hazard: how hot, measured as air temperature (and humidity) over time, day and night; surface temperature is a spatial proxy.
- Exposure: who is in the hazard — residents by night, workers and commuters by day.
- Vulnerability: who suffers more at the same exposure — older people, the chronically ill, those isolated or in poor housing.
import numpy as np, pandas as pd
def isd(station, year):
df = pd.read_csv(f"https://noaa-global-hourly-pds.s3.amazonaws.com/{year}/{station}.csv",
usecols=["DATE", "TMP"], low_memory=False)
v = pd.to_numeric(df.TMP.str.split(",").str[0], errors="coerce") / 10
s = pd.Series(np.where(v.abs() < 90, v, np.nan), index=pd.to_datetime(df.DATE)).dropna()
return s.tz_localize("UTC").tz_convert("Europe/Madrid")
air = isd("08221099999", 2023) # Madrid-Barajas
summer = air["2023-06-01":"2023-08-31"]
hourly = summer.resample("1h").mean()
day = hourly.resample("1D")
d = pd.DataFrame({"tmax": day.max(), "tmin": day.min(), "n": day.count()}).query("n >= 18")
print(f"{len(d)} summer days with enough hourly readings at Barajas")
print(f"days with maximum ≥ 35 °C: {(d.tmax >= 35).sum()}; ≥ 40 °C: {(d.tmax >= 40).sum()}")
print(f"nights with minimum ≥ 20 °C ('tropical'): {(d.tmin >= 20).sum()}; ≥ 25 °C: {(d.tmin >= 25).sum()}")
print(f"hours at or above 30 °C: {(hourly >= 30).sum()} of {hourly.notna().sum()}")
92 summer days with enough hourly readings at Barajas
days with maximum ≥ 35 °C: 43; ≥ 40 °C: 6
nights with minimum ≥ 20 °C ('tropical'): 28; ≥ 25 °C: 2
hours at or above 30 °C: 738 of 2198
An airport on the edge of the city counts 43 days at or above 35 °C in summer 2023 — almost half the summer — and 28 tropical nights, with the air at or above 30 °C for a third of all hours. The count of warm nights — the ones that deny the body recovery — is the number heat–health plans watch as closely.
Hazard over time and space, exposure, vulnerability
1. Characterise the hazard over time
Daily maxima, daily minima, their persistence over consecutive days, and humidity where it matters. Heatwave definitions combine threshold and duration.
2. Map the hazard in space with care
Satellite LST shows where surfaces are hot; street-level air temperature varies much less. Use LST as an indicator of where the hazard is concentrated, not as its magnitude.
3. Match exposure to time
Residential population for night-time exposure; daytime population (workplaces, schools) for afternoon heat. Most gridded population is residential.
4. Add vulnerability
Age, health, living alone, income and housing quality change the harm from the same heat. Census data by small area supplies proxies.
5. Combine transparently
Index approaches multiply or add normalised layers; keep the components visible so users can see why a place ranks high.
Hot hours, warm nights and persistence
Example 1 — how much of the day is hot
by_hour = hourly.groupby(hourly.index.hour).mean()
print("mean summer temperature by local hour at Barajas, 2023")
for h in (0, 3, 6, 9, 12, 15, 18, 21):
print(f" {h:02d}:00 {by_hour[h]:5.1f} °C")
print(f"coolest hour {by_hour.idxmin():02d}:00, warmest {by_hour.idxmax():02d}:00; "
f"Landsat passes at about 12:50 local time (10:50 UTC)")
mean summer temperature by local hour at Barajas, 2023
00:00 25.9 °C
03:00 22.1 °C
06:00 19.6 °C
09:00 21.9 °C
12:00 28.2 °C
15:00 32.1 °C
18:00 33.3 °C
21:00 30.6 °C
coolest hour 07:00, warmest 18:00; Landsat passes at about 12:50 local time (10:50 UTC)
The air is warmest in the late afternoon and coolest just after dawn. A Landsat surface map is taken near midday, before the air peaks; neither the hottest hour for people nor the night-time minimum is in it.
Example 2 — warm nights across the metropolitan area
for sid, name in (("08221099999", "Barajas"), ("08223099999", "Cuatro Vientos")): # Getafe reports too few hours
s = isd(sid, 2023)["2023-06-01":"2023-08-31"].resample("1h").mean()
dd = pd.DataFrame({"tmin": s.resample("1D").min(), "n": s.resample("1D").count()}).query("n >= 18")
print(f"{name:<15} {len(dd):>3} days: median minimum {dd.tmin.median():4.1f} °C, "
f"tropical nights {(dd.tmin >= 20).sum():>3}")
Barajas 92 days: median minimum 18.9 °C, tropical nights 28
Cuatro Vientos 91 days: median minimum 20.0 °C, tropical nights 49
Two airfields on opposite edges of the city count 28 and 49 tropical nights in the same summer — Cuatro Vientos, on the south-western edge of the built-up area, nearly twice as many as Barajas out by the north-eastern fields. A third, Getafe, reports too few hours to count. Street-level stations in the dense centre would likely count more still; that gap is the canopy-layer heat island, which satellite surface maps approximate only loosely.
Example 3 — persistence
hot_night = (d.tmin >= 20).astype(int)
runs = hot_night.groupby((hot_night != hot_night.shift()).cumsum()).sum()
print(f"longest run of consecutive tropical nights at Barajas: {runs.max()}")
longest run of consecutive tropical nights at Barajas: 7
At Barajas the longest run was seven tropical nights in a row. Consecutive warm nights accumulate stress. Heat–health warning systems weight persistence because mortality rises with each additional day of a heatwave.
Nights, daytime population and vulnerability
Why nights matter
The body recovers from daytime heat by shedding heat at night. When nights stay warm, especially indoors in poorly ventilated homes, recovery fails and strain accumulates over successive days. Epidemiological studies consistently find night-time and minimum temperatures strongly associated with heat mortality.
Why residential population misleads by day
In the afternoon, many residents are elsewhere — at work, in air-conditioned offices, on transport. Residential grids fit night exposure well and day exposure poorly. Daytime population estimates, where they exist, change which districts rank highest.
Why vulnerability often dominates
The same heat affects a healthy young adult and an isolated person in their eighties very differently. Maps of hazard alone point to industrial estates and car parks — the hottest surfaces — where few vulnerable people live. Adding exposure and vulnerability moves attention to dense, older, poorer residential areas.
Indoor heat, humidity and acclimatisation
- Indoor heat: top-floor flats under uninsulated roofs can be far hotter than the street; satellites see only the roof.
- Humidity: in humid climates, heat indices (wet-bulb, apparent temperature) matter more than dry-bulb temperature.
- Acclimatisation: thresholds for harm differ between cities; Madrid's population tolerates heat that would be extreme in Oslo.
- Station siting: airports are not city centres; treat their counts as a lower bound for urban warm nights.
- ISD times are UTC; convert to local time before computing daily minima and maxima.
Internal links
- How to estimate population exposure to heat — the exposure calculation
- How to count heatwave days — the hazard over time
- Surface urban heat island explained — day and night surface patterns
- How to compare air temperature with LST — surface and air
- Land surface temperature explained — what heat maps show
- Urban cooling and green space explained — reducing the hazard
FAQ
What is heat exposure?
The presence of people in hazardous heat, measured by where they are and when.
Is a surface temperature map a heat risk map?
No. It maps a spatial proxy for the hazard; risk also needs exposure and vulnerability.
Why do warm nights matter so much?
They prevent the body recovering from daytime heat, and they are strongly linked to heat mortality.
What is a tropical night?
A night on which the temperature does not fall below 20 °C.
Which population data should I use?
Residential population for night exposure; daytime population estimates for daytime exposure if available.
Which groups are most vulnerable?
Older people, people with chronic illness, those living alone, outdoor workers and people in poor-quality housing.