climatememory dezvoltatori

Referința API

API Grade-zile

Grade-zile de încălzire și de răcire din reanaliza orară ERA5-Land, din 1950 încoace, oriunde pe uscat — inclusiv în locurile fără nicio stație meteo pe o rază de 60 km. Un singur scope — dju — acoperă toată pagina.

Grade-zile#

GEThttps://api.climatememory.com/v1/degree-daysscope: dju2 credite, +1 pentru fiecare perioadă completă de 365,25 zile din interval

Grade-zile de încălzire și de răcire pentru o coordonată.

Parametri

ParametruTipImplicitDescriere
latfloatObligatoriu.
lonfloatObligatoriu.
basenumber | preset | csv18Orice temperatură de bază în °C sau o presetare: uk (15,5), ashrae (18,333), iso, france, eurostat. Până la 60, separate prin virgulă, fără cost suplimentar — vedeți mai jos.
methodstringhourlyhourly, costic, mean sau eurostat. Contractul dumneavoastră decide asta, nu noi.
startISO date1 ianuarie al anului de sfârșitMaximum 10 ani per cerere.
endISO dateazi
typestringbothHDD, CDD sau both.
breakdownstringmonthlydaily, weekly, monthly sau yearly.
elevationfloat (m)Altitudinea reală a sitului dumneavoastră. Mută seria de la altitudinea celulei la a dumneavoastră — vedeți mai jos.
formatstringjsonjson sau csv. CSV-ul e o funcție a planurilor plătite.
{
  "location": {
    "latitude": 36.75, "longitude": 3.06,
    "grid_cell": { "latitude": 36.7, "longitude": 3.1,
                   "distance_km": 6.61, "resolution_km": 9 }
  },
  "parameters": {
    "base_temperature_c": 18.0, "method": "hourly",
    "start": "2025-07-01", "end": "2026-06-30"
  },
  "totals": { "hdd": 781.86, "cdd": 1331.61 },
  "quality": {
    "days": 365, "coverage": 1.0,
    "missing_hours": 0, "provisional_days": 0
  },
  "breakdown": [ { "year": 2025, "month": 7, "hdd": 0.0, "cdd": 289.4, "days": 31 } ]
}

Blocul quality nu e decor. Un coverage sub 1,0 înseamnă că lipseau ore din arhivă. provisional_days numără zilele completate din prognoză, nu din reanaliza finală, pentru că ERA5-Land se publică cu circa cinci zile de întârziere.

Dacă decontați un contract pe aceste cifre, verificați-le pe amândouă. Un total calculat pe o acoperire de 0,98 nu e greșit, dar nu e aceeași afirmație ca unul pe 1,0 — iar diferența e invizibilă în totals.

Ce este un grad-zi, într-un paragraf

Un grad-zi de încălzire măsoară cât de mult sub o temperatură de bază a stat aerul de afară și cât timp. La baza 18 °C, o oră la 16 °C contribuie cu (18 − 16) / 24 = 0.083 HDD. Însumați orele și aveți un număr proporțional cu energia de care a avut nevoie o clădire. Gradele-zile de răcire sunt oglinda: cât de mult peste bază. E modul standard de a compara un sezon de încălzire cu altul, după ce vremea a fost scoasă din comparație.

Mai multe baze, o cerere, un preț#

GEThttps://api.climatememory.com/v1/degree-days?base=15,15.5,18,18.5,20scope: djusame as one base

Până la 60 de temperaturi de bază într-un singur apel, la prețul uneia.

Citirea și decodarea seriei orare reprezintă tot costul unui răspuns de grade-zile. Odată ce vectorul acela e în memorie, încă o bază e o scădere peste el, deci a cere șaizeci costă cât a cere una.

Răspunsul câștigă un vector by_base care poartă toate bazele în ordinea în care le-ați enumerat. totals și breakdown descriu în continuare prima, deci codul scris înainte ca asta să existe funcționează neschimbat.

"by_base": [
  {"base": 15.0,  "hdd": 402.11, "cdd": 1731.4},
  {"base": 15.5,  "hdd": 431.02, "cdd": 1706.3},
  {"base": 18.0,  "hdd": 781.86, "cdd": 1331.6}
]

Util când nu știți încă ce bază reproduce cifrele unui contract sau când aceeași clădire e decontată la baze diferite de părți diferite — un proprietar pe 15,5 și un furnizor de energie pe 18 au amândoi dreptate, iar asta le întoarce pe amândouă într-un singur apel.

Metode de calcul#

GEThttps://api.climatememory.com/v1/degree-days/compare-methodsscope: dju2 credite, +1 pentru fiecare perioadă completă de 365,25 zile din interval

Toate cele patru metode pe aceeași perioadă, una lângă alta.

GEThttps://api.climatememory.com/v1/methodsfără cheie0 credite

Definițiile metodelor și presetările lor. Fără cheie.

Metoda e un parametru pentru că o decide contractul dumneavoastră, nu noi. Aceleași date, aceeași bază, același an, la Alger:

MetodăHDD 18 °CCDD 18 °CCând se folosește
hourly781.91331.6Implicită. Integrează deficitul orar — cea mai fidelă fizic.
costic741.71349.5DJU unifiés franceze. Cerută de contractele franceze de performanță energetică.
mean659.91267.8Media zilnică față de bază. Cea mai răspândită convenție internațională.
eurostat587.7656.6Statistici europene. Pragurile sunt fixate prin definiție și ignoră base.

Metoda orară și media zilnică diferă cu 18 % pe aceleași date. Nu e o diferență de rotunjire — e diferența dintre a câștiga și a pierde o dispută despre o factură de energie. Alegeți metoda care reproduce cifrele din contractul dumneavoastră înainte să vă angajați la un plan; pentru asta există compare-methods, și costă o cerere.

eurostat ignoră complet base: definiția își fixează propriile praguri, iar respectarea parametrului dumneavoastră ar produce un număr care nu e un grad-zi Eurostat, dar care ar pretinde că este.

/v1/methods nu cere cheie. Folosiți-l ca să populați un selector de metode în interfața dumneavoastră fără să cheltuiți nimic și fără să fixați în cod o listă care se va învechi.

Grade-zile pe oraș#

GEThttps://api.climatememory.com/v1/degree-days/city/{country}/{slug}scope: dju2 credite, +1 pentru fiecare perioadă completă de 365,25 zile din interval

Același lucru, cu fusul orar al orașului și cu corecția lui de insulă de căldură urbană.

Aplică două corecții pe care o coordonată simplă nu le poate face: fusul orar al orașului, ca zilele să fie tăiate local, și decalajul calibrat al insulei de căldură urbană.

Reanaliza subestimează zonele construite cu 1–3 °C. Asta trage în jos gradele-zile de răcire — important dacă dimensionați aer condiționat, și invizibil dacă nu știți că trebuie să căutați.

elevation nu se aplică pe această cale, iar omisiunea e deliberată. Decalajul orașului e deja calculat față de stații normalizate la altitudinea orașului, deci o a doua corecție de gradient ar socoti aceeași altitudine de două ori — în același sens și suficient de plauzibil încât nimeni să nu observe. Dacă vă trebuie altitudinea unei clădiri anume, folosiți endpointul pe coordonate cu elevation și renunțați la corecția de insulă de căldură.

Grade-zile pentru clădirea dumneavoastră, nu pentru celula de grilă#

GEThttps://api.climatememory.com/v1/degree-days?elevation={metres}scope: djusame

Corecție de gradient termic de la altitudinea terenului celulei la a dumneavoastră.

O stație meteo se află la altitudinea la care se află și nimeni nu o poate muta 600 m mai sus pe versantul văii pentru dumneavoastră. Sursa noastră e un model, deci altitudinea terenului din celulă e un număr în arhivă, iar diferența e aritmetică: 0,65 °C la fiecare 100 m. Pe un sezon de încălzire, asta nu e o eroare de rotunjire.

Se activează la cerere, iar răspunsul spune exact ce a făcut:

"elevation": {
  "applied": true,
  "model_elevation_m": 42.0,
  "location_elevation_m": 1200,
  "temperature_offset_c": -7.53,
  "caveat": "Lapse-rate correction. It assumes temperature falls smoothly with
             height, which a valley floor under a winter inversion does not."
}

Avertismentul călătorește în răspuns, nu doar pe pagina asta, pentru că cine va citi JSON-ul peste șase luni nu e cine a citit documentația.

Fixarea unei celule, ca o referință să rămână comparabilă#

GEThttps://api.climatememory.com/v1/cells/resolvescope: dju1 credit

Ce celulă ar răspunde pentru un punct și cât de departe este.

GEThttps://api.climatememory.com/v1/degree-days/cell/{cell_id}scope: dju2 credite, +1 pentru fiecare perioadă completă de 365,25 zile din interval

Grade-zile pentru o celulă numită — fără nicio căutare a celei mai apropiate celule.

Toate celelalte forme de localizare reiau căutarea celei mai apropiate celule la fiecare cerere, deci răspunsul depinde de ce conține arhiva azi. E valoarea implicită potrivită pentru o consultare izolată și cea nepotrivită pentru o referință: o comparație pe mai mulți ani e o comparație doar dacă fiecare an vine din același loc.

Pe măsură ce arhiva se lărgește, celula cea mai apropiată de un sit dat se schimbă — o îmbunătățire de acoperire care altfel ar ajunge în datele dumneavoastră ca un salt inexplicabil.

# o dată, la configurare
GET /v1/cells/resolve?lat=45.19&lon=5.72
  → { "id": "era5l_45.20_5.70", "distance_km": 1.4, "resolution_km": 9 }

# de fiecare dată după aceea
GET /v1/degree-days/cell/era5l_45.20_5.70?base=18&start=2015-01-01&end=2025-12-31

distance_km este 0 într-o cerere fixată prin construcție: ați numit celula, deci nimic nu a fost înlocuit. O celulă care nu mai există întoarce 404 cell_not_found în loc să cadă tăcut pe una vecină — ceea ce ar reintroduce exact substituția pe care ați fixat-o ca s-o evitați.

/v1/cells/resolve e și modul ieftin de a afla înainte să plătiți pentru date că cea mai apropiată celulă e la 60 km. Nu decodează nimic și nu citește nicio serie de timp, iar prețul e pe măsură: un credit.

Perioade de detaliere#

GEThttps://api.climatememory.com/v1/degree-days?breakdown={daily|weekly|monthly|yearly}scope: djusame

Agregați aceeași cerere la perioada pe care se decontează contractul dumneavoastră.

Fiecare răspuns de grade-zile poartă un vector breakdown agregat la perioada pe care o cereți. Contractele se decontează pe perioade diferite, deci toate patru sunt disponibile în aceeași cerere, la același preț.

PerioadăFiecare rând poartă
dailydata, HDD, CDD, temperatura min./max./medie
weeklyanul și săptămâna ISO, data de început, totalurile
monthlyanul, luna, totalurile — implicit
yearlyanul, totalurile

Săptămânile sunt săptămâni ISO, deci o săptămână aparține anului care conține joia ei. 1 ianuarie 2023 cade în săptămâna 52 din 2022 și acolo o raportăm — la fel va face și foaia dumneavoastră de calcul, iar a nu fi de acord cu foaia de calcul e felul în care începe o ședință de reconciliere.

Fiecare interval poartă și days, ca o lună parțială la marginea intervalului dumneavoastră să fie vizibilă, nu tăcut mai scurtă. Un februarie cu "days": 12 e un februarie pe care n-ar trebui să-l comparați cu unul întreg.

Totaluri lunare pentru un an#

GEThttps://api.climatememory.com/v1/degree-days/monthlyscope: dju2 credite

Douăsprezece totaluri lunare pentru un an calendaristic, fără serie zilnică.

GEThttps://api.climatememory.com/v1/coveragefără cheie0 credite

Ce conține arhiva: prima și ultima zi cu date și axa în care va crește. Fără cheie.

O scurtătură pentru cazul obișnuit: ?lat=&lon=&year=2025 și se întorc douăsprezece rânduri. Aceleași date ca /v1/degree-days?breakdown=monthly pe același interval; mai puțini parametri de greșit.

/v1/coverage raportează prima și ultima zi a arhivei și rezoluția ei, nu cere cheie și e lucrul potrivit de verificat înainte să cereți o perioadă aproape de marginea prezentului — ERA5-Land e în urmă cu vreo cinci zile, iar provisional_days din răspunsul dumneavoastră e consecința.

{
  "start": "1950-01-01",
  "end": "2026-07-29",        // ultima zi care CONȚINE date
  "axis_end": "2026-12-31",   // unde se va opri din creștere această rulare
  "hours": 671256, "axis_hours": 674976,
  "cells": 86274, "resolution_km": 9.0,
  "run": "world-1950-2026-p1000"
}

end și axis_end sunt întrebări diferite, iar doar prima e despre date. O rulare e scrisă față de tot calendarul pe care îl va umple în cele din urmă — arhiva 1950-2026 alocă fiecare oră până la 31 decembrie 2026 — iar completarea o umple pe măsură ce publică Copernicus.

Până la 2026-08-03 acest endpoint raporta axa drept end, deci credita arhiva cu vreo cinci luni de ore care erau goale. end e ce puteți cere azi; o cerere aflată în întregime dincolo de el e un 404 outside_archive, nu un răspuns bine format cu totalul zero.

Export CSV#

GEThttps://api.climatememory.com/v1/degree-days?format=csvscope: dju4× the JSON call

Rândurile de detaliere ca fișier CSV. Doar planuri plătite.

Adăugați format=csv la orice cerere de grade-zile. Primiți rândurile din breakdown ca fișier CSV, denumit după loc și date, astfel încât să fie încă recognoscibil peste șase luni într-un folder de descărcări.

year,month,hdd,cdd,days,t_mean,coverage,provisional
2024,1,205.03,2.88,31,11.48,1.0,false
2024,2,168.44,4.10,29,12.31,1.0,false

Doar planuri plătite, și limitat: același interval maxim ca la o cerere JSON, doar rânduri agregate — niciodată seria orară — și costă patru credite pentru fiecare unul pe care îl costă apelul JSON echivalent. O cheie gratuită primește 402 export_not_in_plan.

Asta e o alegere deliberată, nu o cârcoteală. Arhiva e ceea ce plătiți, iar un export nelimitat e felul în care un concurent și-o însușește într-o după-amiază. Limitele sunt cele care fac posibilă existența formatului.

Istoric orar#

GEThttps://api.climatememory.com/v1/historicalscope: dju(years + 1) × (variables ÷ 2), rounded down, min 1

Arhiva de reanaliză servită brut: vreme orară din 1950 încoace.

Parametri

ParametruTipImplicitDescriere
latfloatObligatoriu.
lonfloatObligatoriu.
startISO dateIntervalul unei cereri e plafonat — vedeți Planuri.
endISO date
variablescsvun subset rezonabilÎntrebați /v1/historical/variables ce conține arhiva aceasta.
hourlybooltrueInclude seria oră de oră.
dailyboolfalsetrue pentru orașeInclude agregate zilnice, tăiate pe zile calendaristice locale.

Aceeași arhivă din care sunt construite gradele-zile, servită direct: orar, din 1950, pe o grilă de 9 km, peste tot pe uscat. Aceeași gazdă și același scope dju — dacă puteți apela gradele-zile, puteți apela și asta.

Astăzi această arhivă conține temperatură și nimic altceva. A fost ingerată pentru grade-zile, iar gradelor-zile le trebuie o singură variabilă. Pagina asta a promis „umiditate, vânt, precipitații și radiație solară” până la 2026-08-03, iar arhiva nu a conținut niciodată nimic din toate astea.

/v1/historical/variables e răspunsul mereu actual — citește rularea promovată, nu propoziția asta, nu cere cheie și nu costă nimic. Apelați-l înainte să construiți ceva pe un câmp.

Ce o face să merite plătită e consistența. Înregistrarea unei stații meteo poartă fiecare mutare, fiecare schimbare de instrument și fiecare gol din istoria ei, deci o tendință pe treizeci de ani calculată din ea e în parte o tendință a instrumentației. O reanaliză nu are nimic din toate astea: modelul e același model pentru fiecare an al înregistrării.

Pentru valori zilnice pe o perioadă lungă, sau pentru normale și tendințe, folosiți în schimb API-ul Climă — conține câmpurile zilnice deja derivate, nu are limita de 9 km/1950 și răspunde cu o climatologie întreagă într-un singur apel.

Istoric pe oraș#

GEThttps://api.climatememory.com/v1/historical/city/{country}/{slug}scope: dju(years + 1) × (variables ÷ 2), rounded down, min 1

Identic, cu fusul orar al orașului și cu corecția de insulă de căldură.

Două lucruri pe care o coordonată nu le poate purta: fusul orar al orașului, ca zilele să fie tăiate acolo unde orașul le trăiește cu adevărat, și corecția lui calibrată de insulă de căldură urbană. Aici daily e implicit true, pentru că o cerere pe oraș e aproape mereu o cerere despre zile.

Variabile disponibile#

GEThttps://api.climatememory.com/v1/historical/variablesfără cheie0 credite

Ce conține arhiva chiar acum, cu unități, și care câmpuri sunt derivate. Fără cheie.

Enumeră ce conține arhiva chiar acum, cu unități, și care câmpuri sunt derivate în loc să fie stocate. O arhivă ingerată doar pentru grade-zile conține numai temperatură, iar endpointul acesta o spune limpede în loc să întoarcă coloane de null.

Unele câmpuri sunt calculate, nu stocate: umiditatea din punctul de rouă, viteza și direcția vântului din componentele u și v. A stoca ce se calculează în microsecunde ar mări arhiva cu o treime degeaba — dar un câmp derivat apare doar când sursele lui sunt în rulare, și de aceea adevărul despre ce puteți cere este acest endpoint, nu o listă scrisă pe o pagină. În arhiva promovată azi sursele lipsesc, deci răspunsul este doar temperature_2m.