Save up to 17% with yearly billing

See pricing

Blockzeit

Lauffähige Beispiele zur Schätzung der Gate-to-Gate-Blockzeit mit dem ML-Modell von SkyLink. Details zum Modell, Genauigkeitskennzahlen und unterstützte Flugzeugtypen finden Sie unter ML-Flugzeitschätzung.

#FrageVerwendete Daten
1Blockzeit für KJFK → KLAX mit einer B738 schätzenGET /ml/flight-time
2Flugzeiten auf 4 Routen ab EGLL vergleichenGET /ml/flight-time

Voraussetzungen

Auth
x-api-key bei jeder Anfrage (Direktabonnement). Mehr erfahren →

Installation

Die folgenden Skripte verwenden requests für API-Aufrufe und rich für die Terminalausgabe. Einmalig installieren:

pip install requests rich

1. Blockzeitschätzung: KJFK → KLAX mit B738

Frage: Wie hoch ist die geschätzte Gate-to-Gate-Blockzeit einer 737-800 auf der Route KJFK–KLAX?

Das Modell liefert eine geschätzte Zeit sowie einen aus historischen Daten abgeleiteten Min/Max-Bereich (GradientBoosting, R²≈0,98). Wind wird nicht modelliert — die tatsächlichen Zeiten variieren je nach Streckenführung und Bedingungen.

import os

import requests
from rich.console import Console
from rich.panel import Panel

console = Console()

HEADERS = {
    "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
    "X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"


def fetch_flight_time(
    origin: str, destination: str, aircraft: str | None = None
) -> dict | None:
    params: dict[str, str] = {"from": origin, "to": destination}
    if aircraft:
        params["aircraft"] = aircraft
    r = requests.get(
        f"{BASE}/ml/flight-time",
        headers=HEADERS,
        params=params,
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return None
    r.raise_for_status()
    return r.json()


def fmt_mins(minutes: int | None) -> str:
    if minutes is None:
        return "—"
    return f"{minutes // 60}h {minutes % 60:02d}m"


def main() -> None:
    data = fetch_flight_time("KJFK", "KLAX", aircraft="B738")
    if not data:
        console.print("[red]No estimate returned.[/red]")
        return

    origin = data.get("origin", "KJFK")
    dest = data.get("destination", "KLAX")
    aircraft = data.get("aircraft_type", "B738")
    est_display = data.get("estimated_hours_display") or fmt_mins(
        data.get("estimated_minutes")
    )
    min_m = data.get("min_minutes")
    max_m = data.get("max_minutes")
    distance = data.get("distance_nm")

    range_str = f"{fmt_mins(min_m)} – {fmt_mins(max_m)}"

    body = (
        f"Route:      [bold]{origin} → {dest}[/bold]\n"
        f"Aircraft:   {aircraft}\n"
        f"Estimated:  [bold green]{est_display}[/bold green]\n"
        f"Range:      {range_str}\n"
        f"Distance:   {distance:,.1f} nm" if distance else ""
    )

    console.print(Panel(body, title="Block Time Estimate", style="blue"))
    console.print(
        "[dim]Estimate is statistical average for this route/type — "
        "actual time varies with winds and routing.[/dim]"
    )


if __name__ == "__main__":
    main()

Ausgabe: Ein Panel mit Route, Flugzeugtyp, geschätzter Blockzeit (Anzeigeformat), Min–Max-Bereich und Großkreisentfernung in nautischen Meilen.


2. Routenvergleich ab EGLL

Frage: Wie unterscheiden sich die Flugzeiten ab London Heathrow zu vier Langstreckenzielen?

Rufen Sie alle vier Routen parallel ab und sortieren Sie sie aufsteigend nach geschätzter Zeit. Nützlich für Flugplaner, die knappe Umsteigezeitfenster erkennen möchten.

import os
import concurrent.futures

import requests
from rich.console import Console
from rich.table import Table

console = Console()

HEADERS = {
    "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
    "X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"

ROUTES = [
    ("EGLL", "KJFK"),
    ("EGLL", "OMDB"),
    ("EGLL", "YSSY"),
    ("EGLL", "RJTT"),
]


def fetch_flight_time(origin: str, destination: str) -> tuple[str, str, dict | None]:
    try:
        r = requests.get(
            f"{BASE}/ml/flight-time",
            headers=HEADERS,
            params={"from": origin, "to": destination},
            timeout=(10, 15),
        )
        if r.status_code == 404:
            return origin, destination, None
        r.raise_for_status()
        return origin, destination, r.json()
    except Exception as exc:  # noqa: BLE001
        console.print(f"[red]{origin}→{destination}: {exc}[/red]")
        return origin, destination, None


def fmt_mins(minutes: int | None) -> str:
    if minutes is None:
        return "—"
    return f"{minutes // 60}h {minutes % 60:02d}m"


def main() -> None:
    with concurrent.futures.ThreadPoolExecutor(max_workers=4) as pool:
        results = list(pool.map(lambda r: fetch_flight_time(*r), ROUTES))

    valid = [
        (orig, dest, d)
        for orig, dest, d in results
        if d and d.get("estimated_minutes") is not None
    ]
    valid.sort(key=lambda x: x[2].get("estimated_minutes", 0))

    table = Table(
        title="EGLL Long-haul Route Comparison (model default aircraft)",
        show_lines=True,
    )
    table.add_column("Route", style="cyan", no_wrap=True)
    table.add_column("Distance (nm)", justify="right")
    table.add_column("Est. Time", justify="center", style="bold")
    table.add_column("Min", justify="center")
    table.add_column("Max", justify="center")

    for orig, dest, d in valid:
        distance = d.get("distance_nm")
        dist_str = f"{distance:,.0f}" if distance else "—"
        table.add_row(
            f"{orig} → {dest}",
            dist_str,
            fmt_mins(d.get("estimated_minutes")),
            fmt_mins(d.get("min_minutes")),
            fmt_mins(d.get("max_minutes")),
        )

    console.print(table)
    console.print(
        "[dim]Statistical estimates — wind not modelled. "
        "Routes sorted by estimated time ascending.[/dim]"
    )


if __name__ == "__main__":
    main()

Ausgabe: Eine von der kürzesten zur längsten sortierte Tabelle mit Route, Entfernung in nautischen Meilen, geschätzter Zeit und dem historischen Min/Max-Bereich für jedes Städtepaar.