q08·beginner

How much rainfall has my region had this year compared to the 30-year normal?

hydrologyprecipitationclimate-anomaly Datasets: 4 5–15 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: 74, 18 → 78, 21 (Maharashtra agricultural belt)
On this page

How much rainfall has my region had this year vs the 30-year normal?

What you can answer

  • Year-to-date precipitation total for any AOI
  • Comparison to 20-year IMERG climatology (2000-2024 baseline)
  • Drought / wet anomaly index as % of normal
  • Spatial pattern of the anomaly (which sub-regions are driest/wettest)
  • Seasonal disaggregation (monsoon-vs-non-monsoon, wet-vs-dry season)

What you can NOT answer with these alone

  • 30+ year climate-normal trends — IMERG starts 2000; older satellite era is TRMM (1997-2015, tropics only) or model reanalysis (MERRA-2 1980+).
  • Snowfall water equivalent without ground stations or SnowEx data.
  • Hourly extreme events outside the IMERG half-hourly grid.

Code template

import earthaccess
import xarray as xr
import numpy as np

earthaccess.login(strategy="netrc")

# AOI: Maharashtra agricultural belt
aoi = (74, 18, 78, 21)
this_year = 2025
clim_window = ("2000-06-01", "2020-12-31")  # 20-yr climatology

# 1. Current year IMERG daily
current = earthaccess.search_data(short_name="GPM_3IMERGDF",
                                  bounding_box=aoi,
                                  temporal=(f"{this_year}-01-01",
                                            f"{this_year}-12-31"))
# Open as xarray, sum precipitation_cal over time → year total per pixel

# 2. Climatology (2000-2020 baseline, mean annual rainfall per pixel)
clim = earthaccess.search_data(short_name="GPM_3IMERGM",
                               bounding_box=aoi, temporal=clim_window)
# Group by month, average across years → 12-month climatology

# 3. Anomaly = (current_year_total - climatology_mean) / climatology_mean × 100
# 4. Plot: anomaly heatmap + spatial mean line + monthly bars

Expected output

  • Annual-total map: this year’s mm/yr per pixel
  • Anomaly map: % of normal per pixel (red < 80%, green 80-120%, blue > 120%)
  • Time-series: cumulative current-year rainfall vs climatology (with shading for normal range)
  • Monsoon-season-specific bars: this year’s June-Sept total vs 20-year mean Jun-Sept

Caveats

  • IMERG Final has 3.5-month latency — use Late (~12-hr) or Early (~4-hr) for NRT comparisons (with accuracy tradeoff)
  • V07 is current; V06 deprecated. Reprocess any cached pre-2023 data
  • Orographic underestimation: mountainous regions (Himalayas, Western Ghats) show systematic IMERG under-bias vs gauges
  • 30-year normal isn’t actually 30 years for IMERG — only ~25 years available (2000+). For the WMO 30-yr normal use MERRA-2 or CHIRPS or gauge-based products

Cross-DAAC composition

GES DISC only — single DAAC, single auth.

Sources

How a scientist answers this
Parameters
Total precipitation from GPM IMERG (2000–present, ~10 km, near-global) or CHIRPS (gauge-blended, strong over land). The 'normal' is the WMO 1991–2020 climatology for the same calendar period; the answer is this year's total as a percent of normal, plus a standardized anomaly (z-score / SPI) for drought framing.
Method
Area-weight and accumulate precipitation over your region for the period of interest, build the 1991–2020 climatology for that same period, then express the current total as percent-of-normal and as a standardized anomaly. A fixed baseline keeps different years comparable.
Validation
Cross-check IMERG against CHIRPS or rain gauges (satellite precipitation is biased, especially for extremes), and always state the baseline — percent-of-normal is meaningless without it.
In plain EnglishAdd up the rain your region got, compare it to what it normally gets over 30 years for the same months, and report it as a percentage: 60% of normal is a dry year, 140% a wet one.

Make it yours → Choose your region, the months, and the baseline; the notebook computes percent-of-normal and the drought index. Switch between IMERG and CHIRPS depending on whether you need global/recent or land-focused/long-record.

Run the core method · no login

The anomaly vs a baseline (percent-of-normal + z-score) 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