Learn/Szeregi czasowe

Historyczne kursy walut i szeregi czasowe

Użyj /v1/range, aby pobrać historię wielu walut i wczytać ją do pandas lub innego narzędzia.

ERexchangerate.dev·19 czerwca 2026·6 min czytania

Zakres zwraca zapisane obserwacje ze stronicowaniem, źródłem i oznaczeniem uzupełnienia.

Najważniejsze punkty
Strona JSON zawiera do 366 obserwacji. Korzystaj z next_cursor, dopóki has_more ma wartość true.
1 830 dni to limit zapytania, nie gwarancja historii każdej pary. Sprawdź source, wiersze i data: [].
Nie ma soboty 13 czerwca 2026, ponieważ zakres zwraca obserwacje, a nie wiersz dla każdego dnia.
Nie. To kursy orientacyjne; sprawdź notice i source.

Użyj endpointu zakresu

start_date i end_date obejmują oba końce. base domyślnie oznacza USD, a symbols rozdziela się przecinkami. Dostępne jest angielskie narzędzie historyczne.

data zawiera zapisane wiersze. Używaj has_more i next_cursor; CSV i Parquet obejmują obsługiwane okno.

GET /v1/rangecopy
$ curl -G "https://api.exchangerate.dev/v1/range" \
    -H "Authorization: Bearer exr_live_..." \
    --data-urlencode "base=USD" \
    --data-urlencode "symbols=EUR,GBP" \
    --data-urlencode "start_date=2026-06-10" \
    --data-urlencode "end_date=2026-06-13"

Odczytaj odpowiedź JSON

data zawiera zapisane wiersze. Używaj has_more i next_cursor; CSV i Parquet obejmują obsługiwane okno.

JSONcopy
{
  "result": "success",
  "base": "USD",
  "start_date": "2026-06-10",
  "end_date": "2026-06-13",
  "data": [
    { "date": "2026-06-10", "rates": { "EUR": 0.86663, "GBP": 0.74727 },
      "source": "ecb_daily", "is_forward_filled": false },
    { "date": "2026-06-11", "rates": { "EUR": 0.86678, "GBP": 0.74829 },
      "source": "ecb_daily", "is_forward_filled": false },
    { "date": "2026-06-12", "rates": { "EUR": 0.86453, "GBP": 0.74613 },
      "source": "ecb_daily", "is_forward_filled": false }
  ],
  "has_more": false,
  "next_cursor": null
}

Brakujące dni kalendarzowe

Nie ma soboty 13 czerwca 2026, ponieważ zakres zwraca obserwacje, a nie wiersz dla każdego dnia.

Stronicowanie w Pythonie

Ta pętla przechodzi przez każdy kursor.

Python · requestscopy
import requests

API = "https://api.exchangerate.dev/v1"
KEY = "exr_live_..."   # free key at https://exchangerate.dev/signup

params = {
    "base": "USD",
    "symbols": "EUR,GBP",
    "start_date": "2026-06-10",
    "end_date": "2026-06-13",
}

rows = []
while True:
    resp = requests.get(
        f"{API}/range",
        headers={"Authorization": f"Bearer {KEY}"},
        params=params,
        timeout=10,
    )
    resp.raise_for_status()
    data = resp.json()
    rows.extend(data["data"])
    if not data["has_more"]:
        break
    cursor = data.get("next_cursor")
    if not cursor or cursor <= params.get("cursor", ""):
        raise RuntimeError("Incomplete historical response")
    params["cursor"] = cursor

for row in rows:
    filled = row["is_forward_filled"]
    print(row["date"], row["rates"]["EUR"], row["rates"]["GBP"], "filled" if filled else "")

Obserwacje i wartości przeniesione

Obserwacje zakresu mają is_forward_filled false; zapytanie o datę może zwrócić wcześniejszą wartość z true.

Weekend nie jest obserwacją
Zakres pomija sobotę 13 czerwca 2026. Zapytanie bezpośrednie może zwrócić wcześniejszą wartość z is_forward_filled true.

Data czy zakres

Pojedyncza data służy do kontroli, a zakres do wykresów, backfillu i analizy zbiorczej.

WymiarDataZakres
ŻądanieJedna dataJedno żądanie i strony
OdpowiedźJeden dzieńTablica data

Sprawdź zakres danych

1 830 dni to limit zapytania, nie gwarancja historii każdej pary. Sprawdź source, wiersze i data: [].

pandas

Wczytaj dane do pandas, posortuj po dacie i odfiltruj wartości przeniesione przed obliczeniami.

Python · pandascopy
import pandas as pd

# rows contains every page from the loop above
df = pd.json_normalize(rows)
df["date"] = pd.to_datetime(df["date"])
df = df.set_index("date").sort_index()

# keep only rows that were actually published that day
df = df[~df["is_forward_filled"]]

print(df[["rates.EUR", "rates.GBP"]].tail())

pandas jest opcjonalny; te same wiersze można obsłużyć inaczej.

Sprawdź datę w narzędziu kursów historycznych (po angielsku)

ER
exchangerate.dev
Praktyczny przewodnik integracji danych FX

Czytaj dalej

TutorialPobieranie kursów w PythonieCzytaj
PorównanieFixer vs exchangerate.devPorównanieOpen Exchange Rates vs exchangerate.devPorównanieCurrencylayer vs exchangerate.devPoradnikKonwersja walut w JavaScript i Node.jsPoradnikJak pobierać kursy walut w PythoniePoradnikKursy walut w Next.js i TypeScriptKurs na żywoEUR/USDKurs na żywoGBP/USDKurs na żywoUSD/JPY