Pick variables measured by NASA missions or produced by NASA models, chart how they change over time and place, and decide whether those trends are statistically significant.
Monthly global and regional surface temperature anomalies since 1880, downloadable as small CSV tables. A clean starting series for trend and significance testing.
Monthly changes in total water storage (groundwater, ice, soil water) from the GRACE and GRACE-FO gravity missions since 2002, in a single NetCDF file. Shows long-term drying, ice loss and aquifer depletion.
CMR short name TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06.3_V4, concept ID C3195527175-POCLOUD, GIBS layer GRACE_Tellus_Liquid_Water_Equivalent_Thickness_Mascon_CRI
Monthly gridded reanalysis of near-surface temperature, humidity, wind and pressure since 1980. Gives a complete, gap-free record for trend analysis where observations are sparse.
CMR short name M2TMNXSLV, concept ID C1276812859-GES_DISC
Browser tool that makes time series, maps, Hovmoller plots and correlations from thousands of NASA Earth variables without downloading files. Good for a first look at trends before writing code. Uses Earthdata Login.
Daily global precipitation at about 10 km merged from the GPM satellite constellation and gauges, back to 2000. The Final run lags real time by a few months.
CMR short name GPM_3IMERGDF, concept ID C2723754864-GES_DISC
Starter code
Locate the GRACE mascon filePython
import earthaccess
# The JPL mascon record is one NetCDF file covering 2002 to present
results = earthaccess.search_data(
short_name="TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06.3_V4",
count=5,
)
print(len(results), "file(s)")
for g in results:
print(g["umm"]["GranuleUR"])
# earthaccess.login()
# path = earthaccess.download(results, "./grace")[0]
# import xarray as xr; print(xr.open_dataset(path))
Global temperature trend per decadePython
import io
import numpy as np
import pandas as pd
import requests
url = "https://data.giss.nasa.gov/gistemp/tabledata_v4/GLB.Ts+dSST.csv"
text = requests.get(url, timeout=60).text
df = pd.read_csv(io.StringIO(text), skiprows=1, na_values="***")
df = df[["Year", "J-D"]].dropna() # annual global anomaly, deg C
# Least-squares trend since 1980
recent = df[df["Year"] >= 1980]
slope, intercept = np.polyfit(recent["Year"], recent["J-D"], 1)
print("years:", len(df), "| latest full year:", int(df["Year"].iloc[-1]))
print(f"trend since 1980: {slope * 10:.3f} C per decade")
# For significance, use scipy.stats.linregress (p-value) or pymannkendall.
Try a live search
Ask NASA's Common Metadata Repository for the five newest files in MERRA-2 Monthly Single-Level Diagnostics (M2TMNXSLV) V5.12.4. This runs in your browser and needs no login.
Related 2025 winners
Matched by theme. Study how they scoped the problem.
Twisters (Mexico), Best Use of Technology, for "Will It Rain on My Parade?"