TANGERANG SELATAN WEATHER

Selasa, 12 Mei 2026

Analisis Tekanan Permukaan dengan ERA5

Latar abstrak gradien biru-pirus untuk tekanan permukaan ERA5

Pentingnya Tekanan Permukaan untuk Meteorologi Tropis

Tekanan permukaan laut — lebih dikenal dengan singkatan MSL (mean sea level pressure) — adalah variabel paling mendasar dalam analisis cuaca sinoptik. Setiap peta cuaca global yang kita lihat, dari prakiraan BMKG hingga model GFS, dibangun di atas distribusi MSL. Nilai MSL menentukan di mana angin mengalir, di mana udara naik, dan pada akhirnya, di mana hujan turun.

Di daerah tropis seperti Indonesia, MSL berada di sekitar \(1{,}013\ \text{hPa}\) pada kondisi normal. Zona bertekanan rendah di sekitar ekuator dikenal sebagai ITCZ (Intertropical Convergence Zone) — sabuk tempat angin pasat dari Belahan Bumi Utara dan Selatan bertemu dan memicu konveksi intens. ITCZ bermigrasi musiman melintasi khatulistiwa dan secara langsung memengaruhi kapan musim hujan datang di tiap wilayah Indonesia.

Citra satelit GOES-11 menunjukkan zona ITCZ tropis (kredit: NOAA/NASA, domain publik) Sumber: NASA Earth Observatory — The Intertropical Convergence Zone (GOES-11 composite, domain publik)

Semakin rapat isobar pada peta sinoptik, semakin kencang angin di area tersebut. Sistem bertekanan tinggi (biasanya \(\geq 1{,}020\ \text{hPa}\)) identik dengan cuaca cerah dan angin lemah, sedangkan sistem tekanan rendah berasosiasi dengan awan tebal dan hujan. Memahami distribusi MSL adalah kunci untuk membaca peta cuaca dan menginterpretasikan dinamika monsun Asia-Australia yang sangat memengaruhi iklim Indonesia.

Mengenal Reanalisis ERA5 dan Variabel MSL

ERA5 adalah reanalisis generasi kelima dari ECMWF yang mencakup data global sejak Januari 1940 hingga kini. Data diperbarui harian dengan latensi sekitar lima hari. Yang membedakan ERA5 dari produk serupa adalah metode asimilasi datanya: 4D-Var dengan model IFS CY41R2, yang mengintegrasikan jutaan observasi — balon radiosonde, satelit, pelampung laut, dan pesawat — ke dalam model fisika atmosfer yang konsisten.

Secara teknis, ERA5 tersedia pada grid \(0{,}25°\ \times\ 0{,}25°\) (sekitar 31 km) dengan lebih dari 200 variabel atmosfer dan permukaan. Variabel yang kita gunakan dalam tutorial ini adalah msl — mean sea level pressure — dengan satuan Pascal (Pa). Untuk interpretasi meteorologi standar, nilainya perlu dikonversi ke hPa dengan membagi 100.

File yang kita gunakan sudah tersedia lokal di /data/era5/era5_msl_indonesia_2024_6h.nc, mencakup domain Indonesia [6N, 95E, -11S, 141E] sepanjang tahun 2024 dengan interval 6 jam. Tidak perlu registrasi CDS atau instalasi cdsapi — data siap pakai langsung dari cache.

Memuat dan Memeriksa Data ERA5 MSL

Kita mulai dengan membuka file NetCDF menggunakan xarray dan memeriksa struktur dataset: dimensi, koordinat, dan atribut variabel. Langkah ini penting sebelum analisis apa pun — kita perlu tahu nama dimensi waktu (kadang valid_time, kadang time), rentang koordinat lat/lon, dan satuan variabel.

import xarray as xr
import numpy as np

# Buka file cached — tidak perlu cdsapi
ds = xr.open_dataset("/data/era5/era5_msl_indonesia_2024_6h.nc")
print("=== Dataset ERA5 MSL ===")
print(ds)

# Cek nama dimensi waktu yang tersedia
time_dim = "valid_time" if "valid_time" in ds.dims else "time"
print(f"\nDimensi waktu: {time_dim}")
print(f"Jumlah timestep: {ds.dims[time_dim]}")

# Rentang waktu
t_coords = ds[time_dim].values
print(f"Awal: {t_coords[0]}")
print(f"Akhir: {t_coords[-1]}")

# Variabel dan atributnya
msl = ds["msl"]
print(f"\nVariabel MSL — shape: {msl.shape}")
print(f"Satuan: {msl.attrs.get('units', 'tidak tercatat')}")
print(f"Long name: {msl.attrs.get('long_name', '-')}")

# Contoh slice: nilai MSL (Pa) untuk beberapa koordinat pertama
sample = msl.isel(**{time_dim: 0})
print(f"\nSlice t=0, lat range: [{float(ds.latitude.min()):.2f}, {float(ds.latitude.max()):.2f}]")
print(f"Slice t=0, lon range: [{float(ds.longitude.min()):.2f}, {float(ds.longitude.max()):.2f}]")
print(f"Nilai MSL t=0 (Pa): min={float(sample.min()):.1f}, max={float(sample.max()):.1f}, mean={float(sample.mean()):.1f}")
=== Dataset ERA5 MSL ===
<xarray.Dataset> Size: 75MB
Dimensions:     (valid_time: 1464, latitude: 69, longitude: 185)
Coordinates:
  * valid_time  (valid_time) datetime64[ns] 12kB 2024-01-01 ... 2024-12-31T18...
    expver      (valid_time) <U4 23kB ...
  * latitude    (latitude) float64 552B 6.0 5.75 5.5 5.25 ... -10.5 -10.75 -11.0
  * longitude   (longitude) float64 1kB 95.0 95.25 95.5 ... 140.5 140.8 141.0
    number      int64 8B ...
Data variables:
    msl         (valid_time, latitude, longitude) float32 75MB ...
Attributes:
    GRIB_centre:             ecmf
    GRIB_centreDescription:  European Centre for Medium-Range Weather Forecasts
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             European Centre for Medium-Range Weather Forecasts
    history:                 2026-05-10T03:54 GRIB to CDM+CF via cfgrib-0.9.1...

Dimensi waktu: valid_time
Jumlah timestep: 1464
Awal: 2024-01-01T00:00:00.000000000
Akhir: 2024-12-31T18:00:00.000000000

Variabel MSL — shape: (1464, 69, 185)
Satuan: Pa
Long name: Mean sea level pressure

Slice t=0, lat range: [-11.00, 6.00]
Slice t=0, lon range: [95.00, 141.00]
Nilai MSL t=0 (Pa): min=100936.0, max=102060.0, mean=101120.6

Output di atas memperlihatkan dimensi dataset dan rentang nilai MSL dalam Pa. Perhatikan bahwa nilai sekitar 100.000–102.000 Pa setara dengan 1.000–1.020 hPa — angka yang wajar untuk kawasan tropis. Di sini kita juga menyimpan variabel ds, msl, dan time_dim sebagai globals notebook yang akan digunakan oleh snippet berikutnya.

Statistik Tekanan Permukaan di Indonesia Tahun 2024

Setelah verifikasi struktur data, kita lanjutkan ke analisis statistik. Snippet ini mengonversi MSL dari Pa ke hPa, lalu menghitung rata-rata domain bulanan sepanjang 2024. Pola musiman akan muncul: tekanan cenderung lebih rendah saat ITCZ aktif di atas wilayah Indonesia (umumnya November–Maret), dan sedikit lebih tinggi saat puncak musim kemarau (Juli–Agustus).

Tekanan standar permukaan laut adalah \(1{,}013{,}25\ \text{hPa}\). Sistem bertekanan tinggi yang sering mempengaruhi Indonesia dari selatan (high Australia) dapat mendorong nilai domain mean mendekati \(1{,}015\ \text{hPa}\) atau lebih, sementara saat monsun barat aktif nilai domain mean bisa turun ke sekitar \(1{,}009\text{–}1{,}011\ \text{hPa}\).

import pandas as pd

# Konversi Pa → hPa
msl_hpa = msl / 100.0

# Statistik domain keseluruhan 2024
print("=== Statistik Domain Keseluruhan 2024 ===")
print(f"Mean MSL: {float(msl_hpa.mean()):.3f} hPa")
print(f"Min MSL : {float(msl_hpa.min()):.3f} hPa")
print(f"Max MSL : {float(msl_hpa.max()):.3f} hPa")

# Rata-rata domain bulanan
# Buat series bulanan dengan groupby pada dimensi waktu
t_coords = ds[time_dim].values
# Konversi ke pandas Timestamp agar groupby bulan mudah
t_index = pd.DatetimeIndex(t_coords)
months = t_index.month

monthly_means = {}
monthly_mins = {}
monthly_maxs = {}

for m in range(1, 13):
    mask = months == m
    if mask.sum() == 0:
        continue
    subset = msl_hpa.isel(**{time_dim: mask})
    monthly_means[m] = float(subset.mean())
    monthly_mins[m] = float(subset.min())
    monthly_maxs[m] = float(subset.max())

month_names = ["Jan","Feb","Mar","Apr","Mei","Jun",
               "Jul","Agt","Sep","Okt","Nov","Des"]

df = pd.DataFrame({
    "Bulan": [month_names[m-1] for m in monthly_means.keys()],
    "Mean (hPa)": [f"{v:.3f}" for v in monthly_means.values()],
    "Min (hPa)":  [f"{v:.3f}" for v in monthly_mins.values()],
    "Max (hPa)":  [f"{v:.3f}" for v in monthly_maxs.values()],
})
df.index = list(monthly_means.keys())
df.index.name = "Bln"

print("\n=== Statistik Bulanan MSL (hPa) ===")
print(df.to_string())
=== Statistik Domain Keseluruhan 2024 ===
Mean MSL: 1010.145 hPa
Min MSL : 998.804 hPa
Max MSL : 1024.464 hPa

=== Statistik Bulanan MSL (hPa) ===
    Bulan Mean (hPa) Min (hPa) Max (hPa)
Bln                                     
1     Jan   1010.281  1000.414  1022.977
2     Feb   1011.335  1003.281  1023.496
3     Mar   1010.472   999.992  1024.464
4     Apr   1009.301  1003.250  1022.324
5     Mei   1009.536  1002.482  1022.443
6     Jun   1010.955  1005.416  1023.788
7     Jul   1010.802  1003.964  1022.919
8     Agt   1011.186  1004.751  1022.778
9     Sep   1010.217  1002.064  1023.141
10    Okt   1010.285  1003.549  1022.864
11    Nov   1009.024   998.804  1022.285
12    Des   1008.392   999.931  1022.694

Tabel bulanan ini menunjukkan pola musiman MSL di domain Indonesia. Bulan-bulan dengan nilai mean rendah berasosiasi dengan aktivitas ITCZ dan monsun barat yang kuat — periode di mana curah hujan di sebagian besar Jawa, Kalimantan, dan Sulawesi cenderung tinggi. Nilai max per bulan mencerminkan pengaruh sistem tekanan tinggi Australia yang sesekali menembus ke utara ekuator, terutama di musim kemarau.

Pola Spasial dan Identifikasi Sistem Tekanan

Statistik domain memberikan gambaran rata-rata, tetapi distribusi spasial MSL jauh lebih informatif untuk analisis sinoptik. Pada satu snapshot waktu, kita bisa melihat di mana posisi trough (palung tekanan rendah) dan ridge (punggungan tekanan tinggi), yang berhubungan langsung dengan pola angin dan curah hujan.

Kita pilih satu timestamp di bulan Agustus 2024 — puncak musim kemarau sekaligus periode aktif Southeast Monsoon. Pada periode ini, tekanan tinggi Australia biasanya cukup kuat dan mendorong aliran angin tenggara ke wilayah Indonesia bagian selatan. Di saat bersamaan, ITCZ masih aktif di utara ekuator, menciptakan gradien tekanan yang menarik.

Diagram diagram-2

Profil tekanan meridional Agustus: ITCZ bertekanan rendah di utara, ridge ekuatorial Papua di tengah domain, dan Australian High di selatan bbox.

# Pilih snapshot: 2024-08-15 12:00 UTC menggunakan sel(method="nearest")
snapshot = msl_hpa.sel(**{time_dim: "2024-08-15T12:00"}, method="nearest")
snap_time = snapshot[time_dim].values

print(f"Snapshot: {snap_time}")
print(f"\n=== Statistik Spasial (hPa) ===")
print(f"Mean  : {float(snapshot.mean()):.3f}")
print(f"Min   : {float(snapshot.min()):.3f}")
print(f"Max   : {float(snapshot.max()):.3f}")
print(f"Std   : {float(snapshot.std()):.3f}")

# Lokasi minimum (low pressure system)
flat_min = int(np.argmin(snapshot.values))
min_idx = np.unravel_index(flat_min, snapshot.shape)
lat_min = float(snapshot.latitude.values[min_idx[0]])
lon_min = float(snapshot.longitude.values[min_idx[1]])
val_min = float(snapshot.values[min_idx])

# Lokasi maksimum (high pressure system)
flat_max = int(np.argmax(snapshot.values))
max_idx = np.unravel_index(flat_max, snapshot.shape)
lat_max = float(snapshot.latitude.values[max_idx[0]])
lon_max = float(snapshot.longitude.values[max_idx[1]])
val_max = float(snapshot.values[max_idx])

print(f"\n=== Sistem Tekanan Rendah ===")
print(f"Nilai  : {val_min:.2f} hPa")
print(f"Lokasi : {lat_min:.2f}°, {lon_min:.2f}°")

print(f"\n=== Sistem Tekanan Tinggi ===")
print(f"Nilai  : {val_max:.2f} hPa")
print(f"Lokasi : {lat_max:.2f}°, {lon_max:.2f}°")

grad = val_max - val_min
print(f"\nGradien tekanan domain: {grad:.2f} hPa")
Snapshot: 2024-08-15T12:00:00.000000000

=== Statistik Spasial (hPa) ===
Mean  : 1009.932
Min   : 1006.731
Max   : 1020.403
Std   : 1.619

=== Sistem Tekanan Rendah ===
Nilai  : 1006.73 hPa
Lokasi : 6.00°, 95.00°

=== Sistem Tekanan Tinggi ===
Nilai  : 1020.40 hPa
Lokasi : -4.00°, 137.25°

Gradien tekanan domain: 13.67 hPa

Hasil di atas memperlihatkan bahwa nilai maksimum domain (~1020,4 hPa) berada di sekitar -4°S, 137°E — ini bukan Australian High itu sendiri, melainkan sebuah ridge dalam domain di atas Papua ekuatorial; Australian High yang sebenarnya berpusat di sekitar 30–35°S, di luar batas selatan bbox (-11°S) yang kita gunakan. Pengaruh High Australia terhadap Indonesia terlihat secara tidak langsung melalui aliran angin tenggara yang memasuki domain dari batas selatan. Sebaliknya, minimum domain (~1006,7 hPa) di 6°N, 95°E konsisten dengan posisi ITCZ boreal summer yang saat Agustus bergeser ke utara ekuator.

Perlu dicatat bahwa di daerah tropis, interpretasi MSL berbeda dari lintang tengah. Efek Coriolis yang lemah berarti angin tidak berputar rapi mengikuti isobar seperti di ekstratropis. Karena itu, meteorolog tropis lebih sering menggunakan streamline (garis aliran) daripada isobar untuk analisis angin, meski MSL tetap dipakai untuk identifikasi sistem.

Langkah Selanjutnya dan Kombinasi dengan Variabel Lain

Dari tutorial ini kita telah menguasai tiga langkah dasar analisis MSL dengan ERA5: membuka dan memverifikasi file NetCDF, menghitung statistik bulanan untuk melihat siklus musiman, dan mengekstrak pola spasial pada satu snapshot untuk identifikasi sistem tekanan.

Langkah natural berikutnya adalah menggabungkan MSL dengan variabel lain dari cache ERA5 yang sama:

  • Angin permukaan (u10, v10): hitung kecepatan dan arah angin, plot streamline untuk melihat pola konvergensi di sekitar trough.
  • Curah hujan (tp): overlay MSL dan total precipitation — area tekanan rendah biasanya berkorespondensi dengan akumulasi hujan tinggi.
  • Animasi time series: loop over timestep dan render peta MSL bergerak untuk melihat migrasi ITCZ dan pergeseran palung monsun sepanjang tahun.

Seluruh variabel tersebut tersedia di direktori /data/era5/ dengan format dan konvensi koordinat yang sama — bisa langsung dibuka dengan pola yang sama di snippet-1.

Diagram diagram-1

Alur analisis dari loading data ERA5 MSL hingga interpretasi sinoptik.

Eksplorasi artikel meteorologi lainnya di meteo.my.id (https://meteo.my.id) — termasuk tutorial analisis angin permukaan, geopotential 500 hPa, dan komputasi indeks stabilitas dari data pressure-level ERA5.

Referensi

Tidak ada komentar:

Posting Komentar