climatememory programiści

Dokumentacja API

API Stopniodni

Stopniodni grzania i chłodzenia z godzinowej reanalizy ERA5-Land, od 1950 roku, w dowolnym miejscu na lądzie — także tam, gdzie w promieniu 60 km nie ma stacji meteorologicznej. Jeden scope — dju — pokrywa całą tę stronę.

Stopniodni#

GEThttps://api.climatememory.com/v1/degree-daysscope: dju2 kredytów, +1 za każdy pełny okres 365,25 dni w zakresie

Stopniodni grzania i chłodzenia dla współrzędnej.

Parametry

ParametrTypDomyślnieOpis
latfloatWymagane.
lonfloatWymagane.
basenumber | preset | csv18Dowolna temperatura bazowa w °C albo gotowa nastawa: uk (15,5), ashrae (18,333), iso, france, eurostat. Do 60 po przecinku, bez dodatkowego kosztu — zobacz niżej.
methodstringhourlyhourly, costic, mean albo eurostat. Decyduje o tym twoja umowa, nie my.
startISO date1 stycznia roku końcowegoMaksymalnie 10 lat na żądanie.
endISO datedzisiaj
typestringbothHDD, CDD albo both.
breakdownstringmonthlydaily, weekly, monthly albo yearly.
elevationfloat (m)Rzeczywista wysokość twojej lokalizacji. Przesuwa szereg z wysokości komórki na twoją — zobacz niżej.
formatstringjsonjson albo csv. CSV to funkcja planów płatnych.
{
  "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 } ]
}

Blok quality nie jest ozdobą. coverage poniżej 1,0 znaczy, że w archiwum brakowało godzin. provisional_days liczy dni uzupełnione z prognozy zamiast z ostatecznej reanalizy, bo ERA5-Land publikuje z około pięciodniowym opóźnieniem.

Jeśli rozliczasz na tych liczbach umowę, sprawdź oba. Suma policzona przy pokryciu 0,98 nie jest błędna, ale nie jest tym samym twierdzeniem co suma przy 1,0 — a różnicy nie widać w totals.

Czym jest stopniodzień, w jednym akapicie

Stopniodzień grzania mierzy, jak głęboko poniżej temperatury bazowej znajdowało się powietrze na zewnątrz i jak długo. Przy bazie 18 °C godzina przy 16 °C wnosi (18 − 16) / 24 = 0.083 HDD. Zsumuj godziny, a masz liczbę proporcjonalną do energii, której potrzebował budynek. Stopniodni chłodzenia są lustrem: jak wysoko powyżej bazy. To standardowy sposób porównywania jednego sezonu grzewczego z drugim po wyjęciu pogody z porównania.

Wiele baz, jedno żądanie, jedna cena#

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

Do 60 temperatur bazowych w jednym wywołaniu, w cenie jednej.

Odczyt i zdekodowanie szeregu godzinowego to cały koszt odpowiedzi o stopniodniach. Gdy ta tablica jest już w pamięci, kolejna baza to odejmowanie na niej, więc poproszenie o sześćdziesiąt kosztuje tyle, co poproszenie o jedną.

Odpowiedź zyskuje tablicę by_base niosącą wszystkie bazy w kolejności, w jakiej je wymieniłeś. totals i breakdown nadal opisują pierwszą, więc kod napisany, zanim to powstało, działa bez zmian.

"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}
]

Przydatne, gdy nie wiesz jeszcze, która baza odtwarza liczby z umowy, albo gdy ten sam budynek jest rozliczany na różnych bazach przez różne strony — właściciel na 15,5 i dostawca energii na 18 mają obaj rację, a to zwraca obie w jednym wywołaniu.

Metody obliczeń#

GEThttps://api.climatememory.com/v1/degree-days/compare-methodsscope: dju2 kredytów, +1 za każdy pełny okres 365,25 dni w zakresie

Wszystkie cztery metody na tym samym okresie, obok siebie.

GEThttps://api.climatememory.com/v1/methodsklucz niepotrzebny0 kredytów

Definicje metod i ich nastawy. Klucz niepotrzebny.

Metoda jest parametrem, bo decyduje o niej twoja umowa, a nie my. Te same dane, ta sama baza, ten sam rok, w Algierze:

MetodaHDD 18 °CCDD 18 °CKiedy jej użyć
hourly781.91331.6Domyślna. Całkuje deficyt godzinowy — najwierniejsza fizycznie.
costic741.71349.5Francuskie DJU unifiés. Wymagana przez francuskie umowy o efektywności energetycznej.
mean659.91267.8Średnia dobowa względem bazy. Najczęstsza konwencja międzynarodowa.
eurostat587.7656.6Statystyka europejska. Progi są ustalone definicją i ignorują base.

Metoda godzinowa i średnia dobowa różnią się o 18 % na tych samych danych. To nie jest różnica zaokrągleń — to różnica między wygraniem a przegraniem sporu o rachunek za energię. Wybierz metodę odtwarzającą liczby z twojej umowy, zanim zwiążesz się planem; po to jest compare-methods, a kosztuje jedno żądanie.

eurostat całkowicie ignoruje base: definicja ustala własne progi, a uszanowanie twojego parametru dałoby liczbę, która nie jest stopniodniem Eurostatu, choć twierdziłaby, że jest.

/v1/methods nie wymaga klucza. Użyj go, żeby wypełnić listę wyboru metody w swoim interfejsie bez wydawania czegokolwiek i bez zaszywania w kodzie listy, która się zdezaktualizuje.

Stopniodni dla miasta#

GEThttps://api.climatememory.com/v1/degree-days/city/{country}/{slug}scope: dju2 kredytów, +1 za każdy pełny okres 365,25 dni w zakresie

To samo, ze strefą czasową miasta i jego poprawką na miejską wyspę ciepła.

Stosuje dwie korekty, których goła współrzędna nie potrafi: strefę czasową miasta, dzięki czemu dni są cięte lokalnie, oraz jego skalibrowaną poprawkę na miejską wyspę ciepła.

Reanaliza zaniża tereny zabudowane o 1–3 °C. To zaniża stopniodni chłodzenia — rzecz istotna, jeśli dobierasz klimatyzację, i niewidoczna, jeśli nie wiesz, że trzeba jej szukać.

Na tej ścieżce elevation nie jest stosowane, i to pominięcie jest celowe. Poprawka miejska jest już liczona względem stacji sprowadzonych do wysokości samego miasta, więc druga korekta gradientowa policzyłaby tę samą wysokość dwa razy — w tę samą stronę i na tyle wiarygodnie, że nikt by tego nie zauważył. Jeśli potrzebujesz wysokości konkretnego budynku, użyj endpointu współrzędnych z elevation i zrezygnuj z poprawki na wyspę ciepła.

Stopniodni dla twojego budynku, a nie dla komórki siatki#

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

Korekta gradientowa z wysokości terenu komórki na twoją.

Stacja meteorologiczna stoi na wysokości, na jakiej stoi, i nikt jej nie przeniesie 600 m wyżej po zboczu doliny. Naszym źródłem jest model, więc wysokość terenu komórki jest liczbą w archiwum, a różnica to arytmetyka: 0,65 °C na 100 m. W skali sezonu grzewczego nie jest to błąd zaokrąglenia.

Włączane na życzenie, a odpowiedź mówi dokładnie, co zrobiono:

"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."
}

Zastrzeżenie podróżuje w odpowiedzi, a nie tylko na tej stronie, bo osoba, która przeczyta ten JSON za pół roku, to nie ta sama osoba, która czytała dokumentację.

Przypięcie komórki, żeby punkt odniesienia pozostał porównywalny#

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

Która komórka odpowiedziałaby za punkt i jak daleko leży.

GEThttps://api.climatememory.com/v1/degree-days/cell/{cell_id}scope: dju2 kredytów, +1 za każdy pełny okres 365,25 dni w zakresie

Stopniodni dla nazwanej komórki — bez szukania najbliższej komórki, nigdy.

Każda inna forma lokalizacji przy każdym żądaniu na nowo szuka najbliższej komórki, więc odpowiedź zależy od tego, co archiwum zawiera dzisiaj. Dla jednorazowego sprawdzenia to właściwe zachowanie domyślne, a dla punktu odniesienia — błędne: porównanie wieloletnie jest porównaniem tylko wtedy, gdy każdy rok pochodzi z tego samego miejsca.

W miarę poszerzania archiwum najbliższa danej lokalizacji komórka się zmienia — poprawa pokrycia, która inaczej trafiłaby do twoich danych jako niewytłumaczony skok.

# raz, przy konfiguracji
GET /v1/cells/resolve?lat=45.19&lon=5.72
  → { "id": "era5l_45.20_5.70", "distance_km": 1.4, "resolution_km": 9 }

# za każdym kolejnym razem
GET /v1/degree-days/cell/era5l_45.20_5.70?base=18&start=2015-01-01&end=2025-12-31

distance_km w żądaniu przypiętym jest z założenia równe 0: nazwałeś komórkę, więc nic za nią nie podstawiono. Komórka, która już nie istnieje, zwraca 404 cell_not_found, zamiast po cichu cofnąć się do sąsiedniej — co przywróciłoby dokładnie to podstawienie, przed którym przypięcie chroni.

/v1/cells/resolve to również tani sposób, żeby dowiedzieć się zanim zapłacisz za dane, że najbliższa komórka leży 60 km dalej. Nic nie dekoduje i nie czyta żadnego szeregu czasowego, i odpowiednio kosztuje jeden kredyt.

Okresy podziału#

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

Zagreguj to samo żądanie do okresu, na którym rozlicza się twoja umowa.

Każda odpowiedź o stopniodniach niesie tablicę breakdown zagregowaną do okresu, o który poprosisz. Umowy rozliczają się na różnych, więc wszystkie cztery są dostępne w tym samym żądaniu i w tej samej cenie.

OkresKażdy wiersz niesie
dailydatę, HDD, CDD, temperaturę min./maks./średnią
weeklyrok i tydzień ISO, datę początku, sumy
monthlyrok, miesiąc, sumy — wartość domyślna
yearlyrok, sumy

Tygodnie to tygodnie ISO, więc tydzień należy do roku, w którym wypada jego czwartek. 1 stycznia 2023 przypada na 52. tydzień 2022 i tam go raportujemy — tak samo zrobi twój arkusz kalkulacyjny, a niezgodność z arkuszem to początek spotkania uzgodnieniowego.

Każdy kubełek niesie też days, żeby niepełny miesiąc na krańcu twojego zakresu był widoczny, a nie po cichu krótszy. Luty z "days": 12 to luty, którego nie powinieneś porównywać z pełnym.

Sumy miesięczne dla roku#

GEThttps://api.climatememory.com/v1/degree-days/monthlyscope: dju2 kredytów

Dwanaście sum miesięcznych dla jednego roku kalendarzowego, bez szeregu dobowego.

GEThttps://api.climatememory.com/v1/coverageklucz niepotrzebny0 kredytów

Co zawiera archiwum: pierwszy i ostatni dzień z danymi oraz oś, w którą będzie rosło. Klucz niepotrzebny.

Skrót dla częstego przypadku: ?lat=&lon=&year=2025 i wraca dwanaście wierszy. Te same dane co /v1/degree-days?breakdown=monthly na tym samym zakresie; mniej parametrów do pomylenia.

/v1/coverage raportuje pierwszy i ostatni dzień archiwum oraz jego rozdzielczość, nie wymaga klucza i jest tym, co warto sprawdzić przed poproszeniem o okres blisko krawędzi teraźniejszości — ERA5-Land jest opóźniony o jakieś pięć dni, a provisional_days w twojej odpowiedzi są tego konsekwencją.

{
  "start": "1950-01-01",
  "end": "2026-07-29",        // ostatni dzień, który MA dane
  "axis_end": "2026-12-31",   // gdzie ten przebieg przestanie rosnąć
  "hours": 671256, "axis_hours": 674976,
  "cells": 86274, "resolution_km": 9.0,
  "run": "world-1950-2026-p1000"
}

end i axis_end to różne pytania i tylko pierwsze dotyczy danych. Przebieg jest zapisywany względem całego kalendarza, który ostatecznie wypełni — archiwum 1950-2026 rezerwuje każdą godzinę aż po 31 grudnia 2026 — a uzupełnianie wypełnia go w miarę publikacji przez Copernicus.

Do 2026-08-03 ten endpoint raportował oś jako end, więc przypisywał archiwum jakieś pięć miesięcy godzin, które były puste. end to to, o co możesz poprosić dzisiaj; żądanie w całości za nim to 404 outside_archive, a nie poprawnie zbudowana odpowiedź z sumą zero.

Eksport CSV#

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

Wiersze podziału jako plik CSV. Tylko plany płatne.

Dodaj format=csv do dowolnego żądania o stopniodni. Dostajesz wiersze breakdown jako plik CSV, nazwany od lokalizacji i dat, żeby pół roku później w folderze pobranych nadal dało się go rozpoznać.

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

Tylko plany płatne, i z ograniczeniami: ten sam maksymalny zakres co przy żądaniu JSON, wyłącznie wiersze zagregowane — nigdy szereg godzinowy — a kosztuje cztery kredyty za każdy jeden, który kosztuje równoważne wywołanie JSON. Darmowy klucz dostaje 402 export_not_in_plan.

To jest celowe, a nie niechętne. Archiwum jest tym, za co płacisz, a eksport bez ograniczeń to sposób, w jaki konkurencja przejmuje je w jedno popołudnie. To właśnie ograniczenia pozwalają temu formatowi w ogóle istnieć.

Historia godzinowa#

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

Archiwum reanalizy serwowane surowo: pogoda godzinowa od 1950 roku.

Parametry

ParametrTypDomyślnieOpis
latfloatWymagane.
lonfloatWymagane.
startISO dateZakres jednego żądania ma pułap — zobacz Plany.
endISO date
variablescsvrozsądny podzbiórZapytaj /v1/historical/variables, co to archiwum zawiera.
hourlybooltrueDołącz szereg godzina po godzinie.
dailyboolfalsetrue dla miastDołącz agregaty dobowe, cięte na lokalnych dniach kalendarzowych.

To samo archiwum, z którego budowane są stopniodni, serwowane wprost: godzinowo, od 1950 roku, na siatce 9 km, wszędzie na lądzie. Ten sam host i ten sam scope dju — jeśli możesz wywołać stopniodni, możesz wywołać i to.

Dziś to archiwum zawiera temperaturę i nic więcej. Zostało wciągnięte na potrzeby stopniodni, a stopniodni potrzebują jednej zmiennej. Ta strona obiecywała „wilgotność, wiatr, opad i promieniowanie słoneczne” aż do 2026-08-03, a archiwum nigdy niczego z tego nie zawierało.

/v1/historical/variables to odpowiedź, która jest zawsze aktualna — czyta promowany przebieg zamiast tego zdania, nie wymaga klucza i nic nie kosztuje. Wywołaj go, zanim zbudujesz coś na danym polu.

Tym, co czyni to wartym zapłaty, jest spójność. Zapis stacji meteorologicznej niesie każdą przeprowadzkę, każdą zmianę przyrządu i każdą lukę w swojej historii, więc trzydziestoletni trend policzony z niego jest po części trendem oprzyrządowania. Reanaliza nie ma nic z tego: model jest tym samym modelem dla każdego roku zapisu.

Po wartości dobowe w długim okresie albo po normy i trendy sięgnij raczej po API Klimat — ma pola dobowe wyprowadzone z góry, nie ma granicy 9 km/1950 i odpowiada całą klimatologią w jednym wywołaniu.

Historia dla miasta#

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

Identycznie, ze strefą czasową miasta i poprawką na wyspę ciepła.

Dwie rzeczy, których współrzędna nie niesie: strefa czasowa miasta, dzięki której dni są cięte tam, gdzie miasto naprawdę je przeżywa, oraz jego skalibrowana poprawka na miejską wyspę ciepła. daily jest tutaj domyślnie prawdą, bo żądanie o miasto to prawie zawsze żądanie o dni.

Dostępne zmienne#

GEThttps://api.climatememory.com/v1/historical/variablesklucz niepotrzebny0 kredytów

Co archiwum zawiera w tej chwili, z jednostkami, i które pola są wyprowadzane. Klucz niepotrzebny.

Wypisuje, co archiwum zawiera w tej chwili, z jednostkami, oraz które pola są wyprowadzane, a nie przechowywane. Archiwum wciągnięte wyłącznie na potrzeby stopniodni zawiera samą temperaturę i ten endpoint mówi to wprost, zamiast zwracać kolumny null.

Część pól jest liczona, a nie przechowywana: wilgotność z punktu rosy, prędkość i kierunek wiatru ze składowych u i v. Przechowywanie tego, co liczy się w mikrosekundy, powiększyłoby archiwum o jedną trzecią za nic — ale pole wyprowadzane pojawia się dopiero wtedy, gdy jego źródła są w przebiegu, i dlatego prawdą o tym, o co możesz poprosić, jest ten endpoint, a nie lista spisana na stronie. W promowanym dziś archiwum źródeł brak, więc odpowiedzią jest samo temperature_2m.