Save up to 17% with yearly billing

See pricing

Flugpläne

Lauffähige Beispiele für Abflug- und Ankunftstafeln von Flughäfen über den Endpoint Flugpläne. Behandelt werden Tafeln für einzelne Flughäfen, Verspätungsanalysen und Verkehrsvergleiche nebeneinander.

#FrageVerwendete Daten
1Die nächsten heutigen Abflüge ab KJFK anzeigenFlugpläne (Abflüge)
2Wie viele Flüge sind heute in EGLL verspätet oder annulliert?Flugpläne (Abflüge)
3Anzahl der Ankünfte und Abflüge in KJFK nebeneinanderFlugpläne (Ankünfte + Abflüge)

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. Heutige Abflüge ab KJFK

Frage: Die nächsten heutigen Abflüge ab KJFK anzeigen.

Die Schlüssel der Flugzeilen verwenden Großschreibung am Wortanfang: Flight, Time, Status, Airline, Airport. Kleingeschriebene Schlüssel liefern None.

import os

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"

STATUS_STYLE: dict[str, str] = {
    "Departed": "green",
    "Delayed": "yellow",
    "Cancelled": "red",
    "Scheduled": "white",
    "Arrived": "green",
}


def fetch_departures(icao: str) -> list[dict]:
    r = requests.get(
        f"{BASE}/schedules/departures",
        headers=HEADERS,
        params={"icao": icao},
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return []
    r.raise_for_status()
    return r.json().get("flights", [])


def main() -> None:
    flights = fetch_departures("KJFK")
    if not flights:
        console.print("[yellow]No departure data returned for KJFK.[/]")
        return

    display = flights[:10]

    table = Table(title=f"KJFK Departures — showing {len(display)} of {len(flights)}")
    table.add_column("Flight", style="cyan")
    table.add_column("Airline")
    table.add_column("Destination")
    table.add_column("Time")
    table.add_column("Status")

    for f in display:
        status = f.get("Status", "—")
        style = STATUS_STYLE.get(status, "white")
        table.add_row(
            f.get("Flight", "—"),
            f.get("Airline", "—"),
            f.get("Airport", "—"),
            f.get("Time", "—"),
            f"[{style}]{status}[/]",
        )

    console.print(table)


if __name__ == "__main__":
    main()

Ausgabe: Eine Tabelle mit bis zu 10 Abflügen mit Flugnummer, Fluggesellschaft, Code des Zielflughafens, planmäßiger Zeit und farbcodiertem Status (grün = Departed, gelb = Delayed, rot = Cancelled).


2. Übersicht über Verspätungen und Annullierungen in EGLL

Frage: Wie viele Flüge sind heute in EGLL derzeit verspätet oder annulliert?

import os

import requests
from rich.console import Console
from rich.panel import Panel
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"


def fetch_departures(icao: str) -> list[dict]:
    r = requests.get(
        f"{BASE}/schedules/departures",
        headers=HEADERS,
        params={"icao": icao},
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return []
    r.raise_for_status()
    return r.json().get("flights", [])


def main() -> None:
    flights = fetch_departures("EGLL")
    if not flights:
        console.print("[yellow]No departure data returned for EGLL.[/]")
        return

    delayed = [f for f in flights if f.get("Status") == "Delayed"]
    cancelled = [f for f in flights if f.get("Status") == "Cancelled"]
    on_time = len(flights) - len(delayed) - len(cancelled)

    summary = (
        f"Total departures: [bold]{len(flights)}[/]\n"
        f"On time / departed: [green]{on_time}[/]\n"
        f"Delayed: [yellow]{len(delayed)}[/]\n"
        f"Cancelled: [red]{len(cancelled)}[/]"
    )
    console.print(Panel(summary, title="EGLL Departure Summary"))

    if delayed or cancelled:
        table = Table(title="Delayed and Cancelled Flights")
        table.add_column("Flight", style="cyan")
        table.add_column("Airline")
        table.add_column("Time")
        table.add_column("Status")

        for f in delayed:
            table.add_row(
                f.get("Flight", "—"),
                f.get("Airline", "—"),
                f.get("Time", "—"),
                "[yellow]Delayed[/]",
            )
        for f in cancelled:
            table.add_row(
                f.get("Flight", "—"),
                f.get("Airline", "—"),
                f.get("Time", "—"),
                "[red]Cancelled[/]",
            )

        console.print(table)


if __name__ == "__main__":
    main()

Ausgabe: Ein Übersichtspanel mit der Gesamtzahl sowie der Anzahl pünktlicher, verspäteter und annullierter Flüge, gefolgt von einer Tabelle aller betroffenen Flüge mit Fluggesellschaft, Zeit und Status.


3. Ankünfte und Abflüge in KJFK nebeneinander

Frage: Wie verhalten sich die heutigen Gesamtzahlen der Ankünfte und Abflüge in KJFK zueinander, einschließlich der Anzahl der Störungen?

Ruft beide Richtungen parallel ab, um die tatsächliche Laufzeit zu verkürzen.

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"


def fetch_schedule(icao: str, direction: str) -> list[dict]:
    r = requests.get(
        f"{BASE}/schedules/{direction}",
        headers=HEADERS,
        params={"icao": icao},
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return []
    r.raise_for_status()
    return r.json().get("flights", [])


def summarize(flights: list[dict]) -> dict[str, int]:
    delayed = sum(1 for f in flights if f.get("Status") == "Delayed")
    cancelled = sum(1 for f in flights if f.get("Status") == "Cancelled")
    return {
        "total": len(flights),
        "delayed": delayed,
        "cancelled": cancelled,
        "on_time": len(flights) - delayed - cancelled,
    }


def main() -> None:
    with concurrent.futures.ThreadPoolExecutor(max_workers=2) as ex:
        fut_arr = ex.submit(fetch_schedule, "KJFK", "arrivals")
        fut_dep = ex.submit(fetch_schedule, "KJFK", "departures")
        arrivals = fut_arr.result()
        departures = fut_dep.result()

    arr_stats = summarize(arrivals)
    dep_stats = summarize(departures)

    table = Table(title="KJFK Traffic Summary — Today")
    table.add_column("Direction", style="cyan")
    table.add_column("Total", justify="right")
    table.add_column("Delayed", justify="right")
    table.add_column("Cancelled", justify="right")
    table.add_column("On Time", justify="right")

    table.add_row(
        "Arrivals",
        str(arr_stats["total"]),
        f"[yellow]{arr_stats['delayed']}[/]",
        f"[red]{arr_stats['cancelled']}[/]",
        f"[green]{arr_stats['on_time']}[/]",
    )
    table.add_row(
        "Departures",
        str(dep_stats["total"]),
        f"[yellow]{dep_stats['delayed']}[/]",
        f"[red]{dep_stats['cancelled']}[/]",
        f"[green]{dep_stats['on_time']}[/]",
    )

    console.print(table)


if __name__ == "__main__":
    main()

Ausgabe: Eine zweizeilige Tabelle, die Ankünfte und Abflüge in KJFK vergleicht: Gesamtzahl der Flüge sowie die Anzahl verspäteter, annullierter und pünktlicher Flüge nebeneinander.