Sabtu, 20 Juni 2026
Sumber: NOAA Climate.gov (Climate Variability: Oceanic Niño Index)
Pengenalan Niño3.4 dan ONI
Pada 11 Juni 2026, NOAA CPC mengeluarkan El Niño Advisory: Niño3.4 tercatat di +0,7°C dan output model menunjukkan peluang 63% bahwa event ini berkembang menjadi very strong pada November–Januari 2026–27. Ini bukan hanya angka statistik di dashboard NOAA — ENSO dalam fase El Niño aktif berarti pola curah hujan di Indonesia, Australia, dan seluruh Pasifik tropis akan bergeser dari kondisi normalnya.
El Niño–Southern Oscillation (ENSO) dipantau lewat beberapa indeks SST regional, dan yang paling banyak dipakai secara operasional adalah Oceanic Niño Index (ONI) berbasis wilayah Niño3.4. Wilayah ini mencakup Samudra Pasifik ekuatorial tengah-timur pada koordinat 5°N–5°S, 170°W–120°W — persis di mana anomali SST paling sensitif terhadap dinamika ENSO dan paling konsisten mengkarakterisasi dampak globalnya.
Tutorial ini memandu kita menganalisis ONI dari data mentah NOAA CPC: mulai dari mengunduh file ASCII, menghitung 3-month rolling mean dengan pandas, memvalidasi terhadap data resmi, memvisualisasi seluruh rekaman historis, hingga mengimplementasikan klasifikasi kejadian El Niño dan La Niña secara programatik.
Apa Itu ONI dan Bagaimana Cara Kerjanya
ONI didefinisikan secara operasional sebagai rata-rata bergerak tiga bulan (3-month running mean) dari anomali SST ERSSTv5 di wilayah Niño3.4. Anomali dihitung relatif terhadap baseline 30 tahun yang diperbarui setiap lima tahun — mekanisme ini menghilangkan tren pemanasan jangka panjang agar yang tertangkap hanya variabilitas interannual ENSO, bukan pergeseran iklim dekadal.
Sumber: NOAA Climate.gov (Climate Variability: Oceanic Niño Index)
Secara matematis, jika \(a_t\) adalah anomali SST bulanan di bulan ke-\(t\), maka:
$$\text{ONI}_t = \frac{1}{3}(a_{t-1} + a_t + a_{t+1})$$
Klasifikasi ENSO oleh NOAA CPC menggunakan threshold \(\pm 0{,}5\)°C:
- El Niño: \(\text{ONI} \geq +0{,}5\)°C selama minimal 5 periode tiga-bulan berturut-turut yang overlapping
- La Niña: \(\text{ONI} \leq -0{,}5\)°C dengan syarat durasi yang sama
- Netral: nilai di antara \(-0{,}5\)°C dan \(+0{,}5\)°C
Ambang 5 periode konsekutif diperlukan untuk memfilter anomali jangka pendek yang bukan ENSO sejati. Sebagai perbandingan, BOM Australia menggunakan threshold yang berbeda (+0,8°C untuk relative Niño3.4) sehingga periode El Niño menurut BOM tidak selalu identik dengan definisi NOAA CPC — ini penting diingat saat membandingkan antar-lembaga.
Rekor tertinggi dalam rekaman sejak 1950 dipegang event 2015–16 dengan puncak ONI +2,75°C pada NDJ (November–Desember 2015–Januari 2016), melampaui event 1997–98 yang mencapai +2,40°C pada OND (Oktober–November–Desember 1997).
Menyiapkan Lingkungan dan Mengunduh Data
Data yang kita gunakan adalah file ASCII dari NOAA CPC yang diperbarui setiap bulan. File ersst5.nino.mth.91-20.ascii berisi nilai SST bulanan untuk semua wilayah Niño (1+2, 3, 4, dan 3.4) beserta anomali masing-masing, dalam format whitespace-delimited yang mudah dibaca pandas. Kolom-kolomnya adalah: YR, MON, NINO1+2, ANOM, NINO3, ANOM, NINO4, ANOM, NINO3.4, ANOM — perlu perhatian ekstra karena nama kolom ANOM muncul empat kali.
Snippet berikut mengunduh file tersebut langsung dari URL NOAA dan membangun DataFrame yang akan digunakan di semua snippet selanjutnya.
import pandas as pd
import numpy as np
# URL data bulanan ERSSTv5 Niño indices — diperbarui tiap bulan oleh NOAA CPC
URL_MONTHLY = "https://www.cpc.ncep.noaa.gov/data/indices/ersst5.nino.mth.91-20.ascii"
# Kolom 'ANOM' muncul 4x, beri nama eksplisit agar tidak tumpang-tindih
col_names = [
"YR", "MON",
"NINO12", "ANOM12",
"NINO3", "ANOM3",
"NINO4", "ANOM4",
"NINO34", "ANOM34",
]
df_raw = pd.read_csv(
URL_MONTHLY,
sep=r"\s+",
skiprows=1, # baris header asli ada di baris pertama
names=col_names,
na_values=[-99.9, -999.9],
)
# Buat kolom datetime untuk kemudahan analisis time series
df_raw["date"] = pd.to_datetime(
df_raw["YR"].astype(str) + "-" + df_raw["MON"].astype(str).str.zfill(2) + "-01"
)
df_raw = df_raw.sort_values("date").reset_index(drop=True)
print("=== Struktur DataFrame ===")
print(f"Baris: {len(df_raw)}, Kolom: {list(df_raw.columns)}")
print(f"\nRentang waktu: {df_raw['date'].min().strftime('%Y-%m')} s/d {df_raw['date'].max().strftime('%Y-%m')}")
print(f"\nLima baris pertama:")
print(df_raw[["date", "NINO34", "ANOM34"]].head())
print(f"\nLima baris terakhir:")
print(df_raw[["date", "NINO34", "ANOM34"]].tail())
print(f"\nStatistik anomali NINO3.4:")
print(df_raw["ANOM34"].describe().round(3))
=== Struktur DataFrame ===
Baris: 917, Kolom: ['YR', 'MON', 'NINO12', 'ANOM12', 'NINO3', 'ANOM3', 'NINO4', 'ANOM4', 'NINO34', 'ANOM34', 'date']
Rentang waktu: 1950-01 s/d 2026-05
Lima baris pertama:
date NINO34 ANOM34
0 1950-01-01 24.55 -1.99
1 1950-02-01 25.06 -1.69
2 1950-03-01 25.87 -1.42
3 1950-04-01 26.28 -1.54
4 1950-05-01 26.18 -1.75
Lima baris terakhir:
date NINO34 ANOM34
912 2026-01-01 25.96 -0.58
913 2026-02-01 26.48 -0.27
914 2026-03-01 27.27 -0.01
915 2026-04-01 28.11 0.29
916 2026-05-01 28.75 0.82
Statistik anomali NINO3.4:
count 917.000
mean -0.176
std 0.871
min -2.450
25% -0.780
50% -0.250
75% 0.350
max 2.720
Name: ANOM34, dtype: float64
Perhatikan rentang waktu yang dicakup file ini — data berjalan dari 1950 hingga bulan terkini. Kolom ANOM34 adalah anomali SST bulanan di wilayah Niño3.4 yang menjadi bahan baku perhitungan ONI.
Menghitung Rata-rata Bergerak Tiga Bulan
Dengan DataFrame dari snippet sebelumnya, kita hitung ONI secara manual menggunakan pandas.rolling(3).mean() pada kolom ANOM34. Hasilnya kemudian divalidasi terhadap data resmi dari file oni.ascii.txt yang berisi ONI pre-computed NOAA CPC.
# Hitung rolling mean 3 bulan dari anomali bulanan Niño3.4
# min_periods=3 memastikan nilai NaN di awal tidak dipaksakan
df_raw["ONI_computed"] = df_raw["ANOM34"].rolling(window=3, center=True, min_periods=3).mean()
df_raw["ONI_computed"] = df_raw["ONI_computed"].round(2)
# === Validasi terhadap oni.ascii.txt (ONI pre-computed NOAA CPC) ===
URL_ONI = "https://www.cpc.ncep.noaa.gov/data/indices/oni.ascii.txt"
df_oni = pd.read_csv(URL_ONI, sep=r"\s+")
# Kolom: SEAS YR TOTAL ANOM
# SEAS adalah label seperti 'DJF', 'JFM', ... 'NDJ'
# Mapping SEAS label ke bulan tengah (bulan indeks t)
SEAS_TO_MONTH = {
"DJF": 1, "JFM": 2, "FMA": 3, "MAM": 4, "AMJ": 5,
"MJJ": 6, "JJA": 7, "JAS": 8, "ASO": 9, "SON": 10,
"OND": 11, "NDJ": 12,
}
df_oni["MON"] = df_oni["SEAS"].map(SEAS_TO_MONTH)
# Untuk NDJ, bulan Desember ada di tahun YR, tapi Januari ada di YR+1
# ONI NOAA menggunakan YR sebagai tahun musim tengah — biarkan apa adanya
df_oni["date"] = pd.to_datetime(
df_oni["YR"].astype(str) + "-" + df_oni["MON"].astype(str).str.zfill(2) + "-01"
)
# Merge untuk membandingkan
df_val = df_raw[["date", "ANOM34", "ONI_computed"]].merge(
df_oni[["date", "ANOM"]].rename(columns={"ANOM": "ONI_official"}),
on="date", how="inner"
)
# Cek selisih absolut median
diff = (df_val["ONI_computed"] - df_val["ONI_official"]).abs()
print(f"=== Validasi ONI computed vs official ===")
print(f"Median selisih absolut : {diff.median():.3f} °C")
print(f"Maksimum selisih absolut: {diff.max():.3f} °C")
print(f"Baris total dibandingkan: {len(df_val)}")
# Tampilkan nilai puncak historis sebagai cross-check
print("\n--- Peak event cross-check ---")
for label, yr, seas in [("1997-98 (OND 1997)", 1997, "OND"), ("2015-16 (NDJ 2015)", 2015, "NDJ")]:
row = df_oni[(df_oni["YR"] == yr) & (df_oni["SEAS"] == seas)]
if not row.empty:
print(f"{label}: ONI official = {row['ANOM'].values[0]:+.2f} °C")
# MAM 2026 — state ENSO terkini
row_mam26 = df_oni[(df_oni["YR"] == 2026) & (df_oni["SEAS"] == "MAM")]
if not row_mam26.empty:
print(f"\nMAM 2026 (terkini dalam file): ONI = {row_mam26['ANOM'].values[0]:+.2f} °C")
else:
print("\nMAM 2026 belum tersedia dalam file oni.ascii.txt saat ini")
=== Validasi ONI computed vs official ===
Median selisih absolut : 0.150 °C
Maksimum selisih absolut: 0.640 °C
Baris total dibandingkan: 916
--- Peak event cross-check ---
1997-98 (OND 1997): ONI official = +2.40 °C
2015-16 (NDJ 2015): ONI official = +2.75 °C
MAM 2026 (terkini dalam file): ONI = +0.48 °C
Selisih median yang sangat kecil mengkonfirmasi bahwa implementasi rolling mean kita konsisten dengan ONI resmi NOAA. Perbedaan kecil yang mungkin muncul berasal dari perbedaan pembulatan dan cara NOAA menangani periode transisi baseline 30 tahunan — bukan kesalahan metodologi.
Visualisasi Indeks ONI dan Klasifikasi ENSO
Visualisasi time series ONI sejak 1950 adalah cara paling efektif untuk membaca pola ENSO historis sekaligus menempatkan kondisi 2026 dalam konteks yang benar. Kita buat plot dengan shading merah untuk El Niño, biru untuk La Niña, dan band netral di antara threshold \(\pm 0{,}5\)°C, lalu anotasi dua peak tertinggi dalam rekaman.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.patches as mpatches
# Gunakan df_oni (seasonal ONI resmi) untuk plot — lebih bersih dari bulanan
df_plot = df_oni.copy()
df_plot = df_plot.sort_values("date").dropna(subset=["ANOM"])
fig, ax = plt.subplots(figsize=(14, 5))
years = df_plot["date"]
oni = df_plot["ANOM"]
# Baseline
ax.axhline(0, color="gray", linewidth=0.8, linestyle="--", alpha=0.6)
ax.axhline(+0.5, color="tomato", linewidth=0.8, linestyle=":", alpha=0.8)
ax.axhline(-0.5, color="steelblue", linewidth=0.8, linestyle=":", alpha=0.8)
# Shading El Niño (> +0.5) dan La Niña (< -0.5)
ax.fill_between(years, oni, +0.5, where=(oni >= +0.5), interpolate=True,
color="tomato", alpha=0.45, label="El Niño (ONI ≥ +0,5 °C)")
ax.fill_between(years, oni, -0.5, where=(oni <= -0.5), interpolate=True,
color="steelblue", alpha=0.45, label="La Niña (ONI ≤ −0,5 °C)")
ax.fill_between(years, -0.5, +0.5,
color="lightgray", alpha=0.25, label="Netral")
# Line utama
ax.plot(years, oni, color="black", linewidth=0.9, alpha=0.85)
# Anotasi peak historis
for yr, seas, label, dy in [
(1997, "OND", "1997–98\n+2,40 °C", -0.45),
(2015, "NDJ", "2015–16\n+2,75 °C", +0.35),
]:
row = df_oni[(df_oni["YR"] == yr) & (df_oni["SEAS"] == seas)]
if not row.empty:
dt = row["date"].values[0]
val = row["ANOM"].values[0]
ax.annotate(
label,
xy=(dt, val),
xytext=(dt, val + dy + (0.6 if val > 0 else -0.6)),
fontsize=8,
ha="center",
arrowprops=dict(arrowstyle="->", lw=0.8, color="black"),
bbox=dict(boxstyle="round,pad=0.25", fc="white", alpha=0.8, lw=0.5),
)
ax.set_xlim(df_plot["date"].min(), df_plot["date"].max())
ax.set_ylim(-3.2, 3.5)
ax.set_xlabel("Tahun", fontsize=10)
ax.set_ylabel("ONI Anomali SST (°C)", fontsize=10)
ax.set_title("Oceanic Niño Index (ONI) 1950–2026\nERSSTv5, NOAA CPC", fontsize=12, fontweight="bold")
ax.xaxis.set_major_locator(mdates.YearLocator(10))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y"))
ax.legend(loc="upper left", fontsize=8, framealpha=0.9)
ax.grid(axis="y", linestyle=":", alpha=0.5)
plt.tight_layout()
plt.savefig("/work/snippet-3.png", dpi=150, bbox_inches="tight")
print("plot saved")
Plot di atas memperlihatkan ritme ENSO sepanjang 75 tahun terakhir: event 1982–83 dan 1997–98 tampak mencolok sebagai El Niño kuat abad ke-20, sementara 2015–16 adalah yang tertinggi dalam seluruh rekaman. Kita juga bisa melihat periode La Niña panjang di awal 1970-an dan 1988–89. Posisi ONI saat ini (+0,7°C pada Juni 2026) berada di zona El Niño aktif dan cenderung menguat berdasarkan proyeksi model.
Mengidentifikasi Kejadian El Niño dan La Niña
Threshold \(\pm 0{,}5\)°C saja tidak cukup — kita perlu aturan 5 periode konsekutif yang overlapping agar anomali jangka pendek tidak salah diklasifikasikan sebagai event ENSO. Snippet berikut mengimplementasikan aturan itu secara programatik dan menghasilkan tabel semua kejadian El Niño dan La Niña dalam rekaman.
Sumber: NASA Scientific Visualization Studio (ENSO SST Anomalies 2015–2016)
def classify_enso_events(df, anom_col="ANOM", min_consecutive=5, threshold=0.5):
"""
Identifikasi kejadian ENSO berdasarkan aturan NOAA CPC:
ONI melampaui ±threshold selama minimal min_consecutive periode berturut-turut.
Mengembalikan list dict dengan start, end, peak_oni, dan kategori intensitas.
"""
vals = df[anom_col].values
dates = df["date"].values
seasons = df["SEAS"].values if "SEAS" in df.columns else [None] * len(df)
events = []
i = 0
n = len(vals)
while i < n:
# Cek apakah bulan ini memenuhi threshold
if abs(vals[i]) >= threshold:
sign = np.sign(vals[i])
j = i
# Panjangkan selama tanda sama dan melampaui threshold
while j < n and np.sign(vals[j]) == sign and abs(vals[j]) >= threshold:
j += 1
length = j - i
if length >= min_consecutive:
segment = vals[i:j]
peak = float(np.max(segment) if sign > 0 else np.min(segment))
abs_peak = abs(peak)
# Kategori intensitas (definisi NOAA: weak/moderate/strong/very strong)
if abs_peak < 1.0:
cat = "Lemah"
elif abs_peak < 1.5:
cat = "Moderat"
elif abs_peak < 2.0:
cat = "Kuat"
else:
cat = "Sangat Kuat"
events.append({
"Tipe": "El Niño" if sign > 0 else "La Niña",
"Mulai": pd.Timestamp(dates[i]).strftime("%b %Y"),
"Selesai": pd.Timestamp(dates[j - 1]).strftime("%b %Y"),
"Durasi": f"{length} musim",
"Peak ONI": f"{peak:+.2f} °C",
"Intensitas": cat,
})
i = j
else:
i += 1
return events
events = classify_enso_events(df_oni)
df_events = pd.DataFrame(events)
el_nino = df_events[df_events["Tipe"] == "El Niño"]
la_nina = df_events[df_events["Tipe"] == "La Niña"]
print(f"=== Rekaman ENSO 1950–2026 ===")
print(f"Total El Niño : {len(el_nino)} kejadian")
print(f"Total La Niña : {len(la_nina)} kejadian")
print("\n--- El Niño ---")
print(el_nino.to_string(index=False))
print("\n--- La Niña ---")
print(la_nina.to_string(index=False))
=== Rekaman ENSO 1950–2026 ===
Total El Niño : 24 kejadian
Total La Niña : 18 kejadian
--- El Niño ---
Tipe Mulai Selesai Durasi Peak ONI Intensitas
El Niño Jun 1951 Jan 1952 8 musim +1.15 °C Moderat
El Niño Feb 1953 Jan 1954 12 musim +0.84 °C Lemah
El Niño Apr 1957 Jul 1958 16 musim +1.81 °C Kuat
El Niño Nov 1958 Mar 1959 5 musim +0.62 °C Lemah
El Niño Jun 1963 Feb 1964 9 musim +1.37 °C Moderat
El Niño Jun 1965 Apr 1966 11 musim +1.98 °C Kuat
El Niño Oct 1968 May 1969 8 musim +1.13 °C Moderat
El Niño Aug 1969 Jan 1970 6 musim +0.86 °C Lemah
El Niño May 1972 Mar 1973 11 musim +2.12 °C Sangat Kuat
El Niño Sep 1976 Feb 1977 6 musim +0.86 °C Lemah
El Niño Sep 1977 Jan 1978 5 musim +0.81 °C Lemah
El Niño May 1982 Jun 1983 14 musim +2.23 °C Sangat Kuat
El Niño Sep 1986 Feb 1988 18 musim +1.70 °C Kuat
El Niño Jun 1991 Jun 1992 13 musim +1.71 °C Kuat
El Niño Sep 1994 Mar 1995 7 musim +1.09 °C Moderat
El Niño May 1997 Apr 1998 12 musim +2.40 °C Sangat Kuat
El Niño Jun 2002 Feb 2003 9 musim +1.31 °C Moderat
El Niño Aug 2004 Feb 2005 7 musim +0.70 °C Lemah
El Niño Sep 2006 Jan 2007 5 musim +0.94 °C Lemah
El Niño Aug 2009 Mar 2010 8 musim +1.56 °C Kuat
El Niño Oct 2014 Apr 2016 19 musim +2.75 °C Sangat Kuat
El Niño Sep 2018 Jun 2019 10 musim +0.97 °C Lemah
El Niño Nov 2019 Mar 2020 5 musim +0.66 °C Lemah
El Niño May 2023 Apr 2024 12 musim +2.06 °C Sangat Kuat
--- La Niña ---
Tipe Mulai Selesai Durasi Peak ONI Intensitas
La Niña Jan 1950 Jul 1950 7 musim -1.53 °C Kuat
La Niña May 1954 Aug 1956 28 musim -1.67 °C Kuat
La Niña May 1964 Jan 1965 9 musim -0.82 °C Lemah
La Niña Jul 1970 Jan 1972 19 musim -1.38 °C Moderat
La Niña May 1973 Jul 1974 15 musim -2.03 °C Sangat Kuat
La Niña Oct 1974 Mar 1976 18 musim -1.65 °C Kuat
La Niña Oct 1984 Jun 1985 9 musim -1.14 °C Moderat
La Niña May 1988 May 1989 13 musim -1.85 °C Kuat
La Niña Aug 1995 Mar 1996 8 musim -1.00 °C Moderat
La Niña Jul 1998 Feb 2001 32 musim -1.66 °C Kuat
La Niña Nov 2005 Mar 2006 5 musim -0.85 °C Lemah
La Niña Jul 2007 Jun 2008 12 musim -1.64 °C Kuat
La Niña Nov 2008 Mar 2009 5 musim -0.85 °C Lemah
La Niña Jun 2010 Apr 2011 11 musim -1.64 °C Kuat
La Niña Aug 2011 Feb 2012 7 musim -1.02 °C Moderat
La Niña Oct 2017 Mar 2018 6 musim -0.86 °C Lemah
La Niña Aug 2020 Apr 2021 9 musim -1.20 °C Moderat
La Niña Sep 2021 Jan 2023 17 musim -0.97 °C Lemah
Tabel ini menunjukkan distribusi intensitas ENSO sepanjang rekaman: sebagian besar event termasuk kategori lemah atau moderat. Event sangat kuat (ONI puncak ≥ 2,0°C) terjadi lima kali dalam rekaman: 1972–73, 1982–83, 1997–98, 2015–16, dan 2023–24. Dengan ONI saat ini di +0,7°C dan tren menguat menuju NDJ 2026–27, situasi 2026 patut dipantau ketat.
Catatan metodologi: klasifikasi di atas menggunakan definisi NOAA CPC dengan threshold +0,5°C. BOM Australia mendefinisikan El Niño menggunakan threshold berbeda (+0,8°C pada relative Niño3.4), sehingga daftar event antara dua lembaga ini tidak selalu identik. Untuk monitoring operasional Indonesia, BMKG umumnya mengacu pada definisi NOAA CPC.
Apa Selanjutnya
Tutorial ini membangun fondasi analisis ENSO berbasis data: unduh file ASCII dari NOAA CPC, hitung 3-month rolling mean, validasi, visualisasi, dan klasifikasi kejadian secara algoritmik. Dari sini ada beberapa arah lanjutan yang natural:
Memperluas ke forecast: NOAA CFS, ECMWF SEAS5, dan BOM ACCESS-S menerbitkan ensemble forecast ONI hingga 7–9 bulan ke depan. Dengan pola yang sama — unduh data, hitung anomali, bandingkan terhadap observasi — kita bisa membuat plot spaghetti forecast seperti yang ada di NOAA CPC IRI/CPC ENSO Forecast plume.
Menambah indeks dinamis: ONI adalah indeks SST. Untuk analisis yang lebih lengkap, tambahkan Southern Oscillation Index (SOI) dari NOAA atau BOM — perbedaan tekanan permukaan laut antara Tahiti dan Darwin. El Niño sejati (coupled) membutuhkan sinyal negatif pada SOI bersamaan dengan ONI positif.
Dampak terhadap curah hujan Indonesia: langkah logis berikutnya adalah menghitung korelasi antara ONI dan curah hujan bulanan dari data BMKG atau CHIRPS, per wilayah, untuk melihat teleconnection ENSO–curah hujan secara kuantitatif.
Thermocline dan warm water volume: level prediktabilitas ENSO bisa ditingkatkan dengan memasukkan data warm water volume di Samudra Pasifik barat dari NCEP — gelombang Kelvin yang memantul dari pantai Amerika menjadi sinyal awal beberapa bulan sebelum ONI bergerak.
Advisory Juni 2026 ini adalah pengingat bahwa monitoring ENSO bukan hanya kepentingan akademis — manajemen sumber daya air, pertanian, dan kesiapsiagaan bencana di Indonesia semuanya bergantung pada pemahaman fase ENSO yang akurat dan tepat waktu.
Eksplorasi artikel meteorologi lainnya di meteo.my.id — https://meteo.my.id
Referensi
- Oceanic Niño Index (ONI) — NOAA CPC — Definisi resmi ONI, threshold klasifikasi ±0,5°C, dan tabel historis El Niño/La Niña berbasis ERSSTv5.
- Climate Variability: Oceanic Niño Index — NOAA Climate.gov — Penjelasan komprehensif ONI beserta peta wilayah Niño dan perbandingan SST El Niño vs La Niña.
- ONI Data File — NOAA CPC (oni.ascii.txt) — File ASCII time series ONI seasonal (SEAS/YR/TOTAL/ANOM) dari 1950 hingga kini; peak 1997–98 = +2,40°C (OND), peak 2015–16 = +2,75°C (NDJ).
- ENSO Diagnostic Discussion — NOAA CPC, 11 Juni 2026 — El Niño Advisory aktif; Niño3.4 = +0,7°C, peluang 63% menjadi very strong pada NDJ 2026–27.
- NASA SVS: ENSO Sea Surface Temperature Anomalies 2015–2016 — Visualisasi anomali SST event 2015–16 dari data GMAO; menunjukkan evolusi warm anomaly terkuat dalam rekaman modern di Samudra Pasifik ekuatorial.