Download Measurements v0.0.2 Datasets

Below you will find links to download measurements v0.0.2 data files from January 01, 2022 to November 30, 2024. Each file is in Parquet format, providing a highly efficient way to store and manage large datasets. The datasets are separated into 10-day intervals. Please note that each dataset covers data up to, but not including, the last day listed in its name.

Automated Download

If you want to automate your downloads, you can generate the link for downloading using the following format where YYYYMMDD is the start date of the 10-day period. Note: The first date to start generating intervals for is January 01, 2022:

https://www.eurocontrol.int/performance/data/download/OPDI/v002/measurements/measurements_{YYYYMMDD}_{YYYYMMDD_next10}.parquet

import os
import requests
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta

def generate_urls(data_type: str, start_date: str, end_date: str) -> list:
    """
    Generate a list of URLs for flight lists, flight events, or measurements.

    Args:
        data_type (str): Type of data ("flight_list", "flight_events", "measurements").
        start_date (str): The start date in the format YYYYMM or YYYYMMDD.
        end_date (str): The end date in the format YYYYMM or YYYYMMDD.

    Returns:
        list: List of generated URLs.
    """
    base_url = f"https://www.eurocontrol.int/performance/data/download/OPDI/v002/{data_type}/{data_type}_"

    urls = []
    
    if data_type == "flight_list":  # Monthly intervals
        start_dt = datetime.strptime(start_date, "%Y%m")
        end_dt = datetime.strptime(end_date, "%Y%m")
        delta = relativedelta(months=1)
    else:  # Flight events & Measurements: 10-day intervals
        start_dt = datetime.strptime(start_date, "%Y%m%d")
        end_dt = datetime.strptime(end_date, "%Y%m%d")
        delta = timedelta(days=10)

    current_dt = start_dt
    while current_dt <= end_dt:
        if data_type == "flight_list":
            url = f"{base_url}{current_dt.strftime('%Y%m')}.parquet"
        else:
            next_dt = current_dt + delta
            url = f"{base_url}{current_dt.strftime('%Y%m%d')}_{next_dt.strftime('%Y%m%d')}.parquet"
        
        urls.append(url)
        current_dt += delta

    return urls

def download_files(urls: list, save_folder: str):
    """
    Download files from the generated URLs and save them in the specified folder.

    Args:
        urls (list): List of URLs to download.
        save_folder (str): Folder to save downloaded files.
    """
    os.makedirs(save_folder, exist_ok=True)

    for url in urls:
        file_name = url.split("/")[-1]
        save_path = os.path.join(save_folder, file_name)

        if os.path.exists(save_path):
            print(f"Skipping {file_name}, already exists.")
            continue

        print(f"Downloading {url}...")

        try:
            response = requests.get(url, stream=True)
            response.raise_for_status()

            with open(save_path, "wb") as file:
                for chunk in response.iter_content(chunk_size=1024):
                    file.write(chunk)

            print(f"Saved to {save_path}")

        except requests.exceptions.RequestException as e:
            print(f"Failed to download {url}: {e}")

if __name__ == "__main__":
    datasets = {
        #"flight_list": ("202201", "202412"),
        #"flight_events": ("20220101", "20241231")#,
        "measurements": ("20220101", "20241231")
    }

    for data_type, (start_date, end_date) in datasets.items():
        urls = generate_urls(data_type, start_date, end_date)
        download_files(urls, f"./data/{data_type}")
library(httr)
library(lubridate)
library(fs)

generate_urls <- function(data_type, start_date, end_date) {
  # Generates a list of URLs for flight lists, flight events, or measurements.
  #
  # Args:
  #   data_type (character): Type of data ("flight_list", "flight_events", "measurements").
  #   start_date (character): The start date in format YYYYMM or YYYYMMDD.
  #   end_date (character): The end date in format YYYYMM or YYYYMMDD.
  #
  # Returns:
  #   A vector of URLs.
  
  base_url <- paste0("https://www.eurocontrol.int/performance/data/download/OPDI/v002/", data_type, "/", data_type, "_")
  urls <- c()
  
  if (data_type == "flight_list") {
    start_dt <- ymd(paste0(start_date, "01"))
    end_dt <- ymd(paste0(end_date, "01"))
    delta <- months(1)
  } else {
    start_dt <- ymd(start_date)
    end_dt <- ymd(end_date)
    delta <- days(10)
  }
  
  current_dt <- start_dt
  while (current_dt <= end_dt) {
    if (data_type == "flight_list") {
      url <- paste0(base_url, format(current_dt, "%Y%m"), ".parquet")
    } else {
      next_dt <- current_dt + delta
      url <- paste0(base_url, format(current_dt, "%Y%m%d"), "_", format(next_dt, "%Y%m%d"), ".parquet")
    }
    
    urls <- c(urls, url)
    current_dt <- current_dt + delta
  }
  
  return(urls)
}

download_files <- function(urls, save_folder) {
  # Downloads files from the generated URLs and saves them in the specified folder.
  # Skips files that already exist.
  #
  # Args:
  #   urls (character vector): List of URLs to download.
  #   save_folder (character): Folder to save downloaded files.
  
  if (!dir_exists(save_folder)) {
    dir_create(save_folder)
  }
  
  for (url in urls) {
    file_name <- basename(url)
    save_path <- file.path(save_folder, file_name)
    
    if (file_exists(save_path)) {
      message("Skipping ", file_name, ", already exists.")
      next
    }
    
    message("Downloading ", url, "...")
    
    tryCatch({
      response <- GET(url, write_disk(save_path, overwrite = TRUE))
      
      if (http_error(response)) {
        warning("Failed to download ", url, ": HTTP error ", status_code(response))
      } else {
        message("Saved to ", save_path)
      }
      
    }, error = function(e) {
      warning("Failed to download ", url, ": ", e$message)
    })
  }
}

# Example usage
datasets <- list(
  #"flight_list" = c("202201", "202412"),
  #"flight_events" = c("20220101", "20241231")#,
  "measurements" = c("20220101", "20241231")
)

for (data_type in names(datasets)) {
  dates <- datasets[[data_type]]
  urls <- generate_urls(data_type, dates[1], dates[2])
  download_files(urls, paste0("./data/", data_type))
}

Download Available Datasets

Each dataset corresponds to a specific 10-day period and is listed below for easy access.


We hope you find these datasets useful for your analysis and research. If you have any questions or require further assistance, please contact us at [email protected].

List of Acronyms