Is terminal heat stressing the wheat during grain-fill this season?
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.
75, 28 → 82, 30.5 (Indo-Gangetic wheat belt)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
- MODIS MOD11 LST: https://lpdaac.usgs.gov/products/mod11a2v061/
- MODIS MOD13 VI: https://lpdaac.usgs.gov/products/mod13q1v061/
- ECOSTRESS LST: https://lpdaac.usgs.gov/products/eco2lstev001/
- HLS: https://lpdaac.usgs.gov/products/hlsl30v002/
- ERA5: https://cds.climate.copernicus.eu/datasets/reanalysis-era5-single-levels
- IMD Agromet advisories (crop-stage thresholds): https://mausam.imd.gov.in/
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.
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).