qin5·intermediate

Is terminal heat stressing the wheat during grain-fill this season?

landagriculturefood-securityclimate Datasets: 6 15–30 min
Find the data for your area

Draw a rectangle to pick your area of interest, then see what NASA data covers it (live, here in your browser) or download a ready-to-run notebook with your AOI pre-filled. The notebook runs in any Python environment — it needs a free Earthdata Login to fetch the data.

Current AOI: 75, 28 → 82, 30.5 (Indo-Gangetic wheat belt)
On this page

Is terminal heat stressing the wheat during grain-fill this season?

What you can answer

  • Count of hot days during the grain-fill window over your AOI (using ERA5 air temperature against a local threshold)
  • Canopy/surface heating pattern from MODIS LST (1 km) or ECOSTRESS (~70 m) — which fields run hottest
  • Early-senescence flag — whether NDVI turns down earlier than a normal/reference year
  • Comparison to the climatological grain-fill window (this season vs typical)
  • Day-vs-night LST split — nighttime warmth also stresses grain-fill respiration

What you can NOT answer with these alone

  • A precise yield loss in kg/ha — these are stress indicators, not a yield model; pair with agronomic models and ground data.
  • A single universal heat threshold — the cutoff is cultivar- and stage-specific; take it from local agromet guidance, don’t assert one number.
  • Air temperature directly from satellite — MODIS/ECOSTRESS give surface/canopy LST; for true 2 m air-temp thresholds use ERA5 or station data.
  • Hourly heat spikes from MODIS alone — MODIS gives ~1–2 overpasses/day; for sub-daily use ERA5 hourly or geostationary.

Code template

import earthaccess
import xarray as xr
import numpy as np

earthaccess.login(strategy="netrc")

# AOI: Indo-Gangetic wheat belt
aoi = (75, 28, 82, 30.5)
this_year = 2026

# Grain-fill window — SET FROM YOUR LOCAL SOWING CALENDAR (typ. Feb–Mar)
grainfill = (f"{this_year}-02-10", f"{this_year}-03-31")

# Heat threshold — SET FROM LOCAL AGROMET GUIDANCE, do not hard-code blindly.
# (Terminal-heat cutoffs are cultivar/stage specific; verify before use.)
tmax_threshold_c = 33.0  # placeholder — replace with locally-validated value

# 1. MODIS LST (8-day, 1 km) over the grain-fill window — canopy/surface heating
lst = earthaccess.search_data(short_name="MOD11A2",
                              bounding_box=aoi,
                              temporal=grainfill)
# Open LST_Day_1km / LST_Night_1km; scale (×0.02) and convert K → °C.
# Map the spatial pattern of peak surface temperature across fields.

# 2. NDVI senescence timing (MOD13Q1, 250 m) — compare to a normal year
ndvi_now = earthaccess.search_data(short_name="MOD13Q1",
                                   bounding_box=aoi,
                                   temporal=(f"{this_year}-01-01",
                                             f"{this_year}-04-30"))
ndvi_ref = earthaccess.search_data(short_name="MOD13Q1",
                                   bounding_box=aoi,
                                   temporal=("2024-01-01", "2024-04-30"))
# Build the NDVI curve for each season; flag an earlier down-turn this year
# (earlier green-peak → senescence than the reference = possible heat stress).

# 3. Terminal-heat days from ERA5 2 m air temperature (true threshold)
#    ERA5 Tmax per day over the window; count days Tmax > tmax_threshold_c.
#    heat_days = (era5_tmax_c > tmax_threshold_c).sum("time")

# 4. (Optional) ECOSTRESS ~70 m LST for field-scale canopy temperature
#    short_name="ECO2LSTE" — sparse revisit; use for hot-spot zoom-ins.

Expected output

  • LST map (°C) over the grain-fill window — day and night, highlighting the hottest fields
  • Terminal-heat-day count per pixel/region (days Tmax above the local threshold)
  • NDVI-vs-time curves: this season vs a reference/normal year, with the senescence down-turn marked
  • A stress summary: heat-day count and senescence-timing shift relative to the climatological window

Caveats

  • LST ≠ air temperature — MODIS/ECOSTRESS report skin/canopy LST, which on clear dry days runs several °C above 2 m air temperature; use ERA5/station data for threshold comparisons.
  • Cloud gaps — optical LST and NDVI drop out under cloud; gap-fill or composite, and beware Feb–Mar haze/fog over the IGP.
  • Stage window must match sowing — late-sown wheat fills grain later; a fixed Feb–Mar window can miss the true vulnerable period. Align to the local sowing calendar.
  • Threshold is not universal — terminal-heat cutoffs depend on cultivar and stage; verify against IMD/agromet advisories rather than asserting one number.
  • Mixed pixels at 1 km — MODIS pixels blend wheat with other land cover; use HLS (30 m) or ECOSTRESS (~70 m) for smallholder fields.

Cross-DAAC composition

LP DAAC (MODIS MOD11/MOD13, ECOSTRESS, HLS) for LST/NDVI; ERA5 air temperature from ECMWF/Copernicus (CDS) — note this is a non-NASA source for the true air-temperature threshold.

Sources

How a scientist answers this
Parameters
Land-surface temperature (MODIS MOD11 LST, 1 km, day/night) and canopy temperature (ECOSTRESS, ~70 m) during the Feb–Mar wheat grain-filling window, alongside 2 m air temperature from ERA5 reanalysis for true threshold work, and crop greenness/senescence from NDVI (MODIS MOD13, HLS). Terminal heat stress is heat occurring late in the season during grain-fill, which shortens the fill period and cuts yield.
Method
Define the grain-fill window from the local sowing calendar (commonly Feb–Mar in the Indo-Gangetic plain), then count terminal-heat days — days where Tmax exceeds a crop-specific threshold during that window — using ERA5 for air temperature, with MODIS/ECOSTRESS LST showing canopy heating and spatial pattern. Separately, detect early senescence as an NDVI down-turn that arrives earlier than in a reference/normal year. Compare both against the climatological window. The exact heat cutoff varies by cultivar and study (often discussed near the low-to-mid 30s °C for sustained grain-fill stress) — pick the threshold from a local agromet source rather than hard-coding one.
Validation
LST is the skin/canopy temperature of the surface, not the 2 m air temperature an agromet station reports — on sunny dry days canopy LST can run several degrees above air temperature, so do not treat them as interchangeable. Account for cloud gaps in optical LST/NDVI, make sure the grain-fill window matches the actual local sowing date, and cross-check counts against IMD agromet advisories and ground stations.
In plain EnglishLate-season heat during the few weeks when wheat is filling its grain can shrivel the harvest. This counts the hot days in that window and watches whether the crop browns off early compared with a normal year — a warning sign, not a yield number.

Make it yours → Set your field/region, the grain-fill window from your sowing date, and your local heat threshold; the notebook counts hot days and flags early senescence. Swap MODIS 1 km for ECOSTRESS ~70 m or HLS 30 m when you need field-scale detail.

Run the core method · no login

The robust trend (Theil–Sen + Mann–Kendall) at the heart of this question — runnable on synthetic data, right here. The full earthaccess code template further down does it on real NASA data (needs an Earthdata login).

editable · runs in your browser

Datasets used