"""Fetch monthly MERRA-2 weather over Ukraine from NASA POWER (regional grid endpoint). Usage: python3 -I fetch_power.py Writes one CSV per parameter: lat, lon, yyyymm, value. Month 13 (annual) is dropped. """ import csv import json import os import sys import time import urllib.request PARAMS = ["T2M_MAX", "PRECTOTCORR", "RH2M", "GWETTOP"] BOXES = [(44.0, 52.5, 22.0, 31.0), (44.0, 52.5, 31.0, 40.5)] URL = ("https://power.larc.nasa.gov/api/temporal/monthly/regional?" "latitude-min={a}&latitude-max={b}&longitude-min={c}&longitude-max={d}" "¶meters={p}&community=AG&start=2001&end=2025&format=JSON") def get(url, tries=5): for i in range(tries): try: with urllib.request.urlopen(url, timeout=180) as r: return json.load(r) except Exception as e: # noqa: BLE001 print("retry", i, e, flush=True) time.sleep(3 + 3 * i) raise RuntimeError("failed " + url) def main(out_dir): os.makedirs(out_dir, exist_ok=True) for p in PARAMS: out = os.path.join(out_dir, f"power_{p}.csv") if os.path.exists(out): print(p, "cached") continue rows = [] for a, b, c, d in BOXES: js = get(URL.format(a=a, b=b, c=c, d=d, p=p)) for f in js["features"]: lon, lat = f["geometry"]["coordinates"][:2] for k, v in f["properties"]["parameter"][p].items(): if k.endswith("13"): continue rows.append((lat, lon, k, v)) with open(out, "w", newline="") as fh: w = csv.writer(fh) w.writerow(["lat", "lon", "yyyymm", "value"]) w.writerows(rows) print(p, len(rows), "rows", flush=True) if __name__ == "__main__": main(sys.argv[1])