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.
"""
= f"https://www.eurocontrol.int/performance/data/download/OPDI/v002/{data_type}/{data_type}_"
base_url
= []
urls
if data_type == "flight_list": # Monthly intervals
= datetime.strptime(start_date, "%Y%m")
start_dt = datetime.strptime(end_date, "%Y%m")
end_dt = relativedelta(months=1)
delta else: # Flight events & Measurements: 10-day intervals
= datetime.strptime(start_date, "%Y%m%d")
start_dt = datetime.strptime(end_date, "%Y%m%d")
end_dt = timedelta(days=10)
delta
= start_dt
current_dt while current_dt <= end_dt:
if data_type == "flight_list":
= f"{base_url}{current_dt.strftime('%Y%m')}.parquet"
url else:
= current_dt + delta
next_dt = f"{base_url}{current_dt.strftime('%Y%m%d')}_{next_dt.strftime('%Y%m%d')}.parquet"
url
urls.append(url)+= delta
current_dt
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.
"""
=True)
os.makedirs(save_folder, exist_ok
for url in urls:
= url.split("/")[-1]
file_name = os.path.join(save_folder, file_name)
save_path
if os.path.exists(save_path):
print(f"Skipping {file_name}, already exists.")
continue
print(f"Downloading {url}...")
try:
= requests.get(url, stream=True)
response
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():
= generate_urls(data_type, start_date, end_date)
urls f"./data/{data_type}") download_files(urls,
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
library(httr)
library(lubridate)
library(fs)
<- function(data_type, start_date, end_date) {
generate_urls # 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.
<- paste0("https://www.eurocontrol.int/performance/data/download/OPDI/v002/", data_type, "/", data_type, "_")
base_url <- c()
urls
if (data_type == "flight_list") {
<- ymd(paste0(start_date, "01"))
start_dt <- ymd(paste0(end_date, "01"))
end_dt <- months(1)
delta else {
} <- ymd(start_date)
start_dt <- ymd(end_date)
end_dt <- days(10)
delta
}
<- start_dt
current_dt while (current_dt <= end_dt) {
if (data_type == "flight_list") {
<- paste0(base_url, format(current_dt, "%Y%m"), ".parquet")
url else {
} <- current_dt + delta
next_dt <- paste0(base_url, format(current_dt, "%Y%m%d"), "_", format(next_dt, "%Y%m%d"), ".parquet")
url
}
<- c(urls, url)
urls <- current_dt + delta
current_dt
}
return(urls)
}
<- function(urls, save_folder) {
download_files # 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) {
<- basename(url)
file_name <- file.path(save_folder, file_name)
save_path
if (file_exists(save_path)) {
message("Skipping ", file_name, ", already exists.")
next
}
message("Downloading ", url, "...")
tryCatch({
<- GET(url, write_disk(save_path, overwrite = TRUE))
response
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
<- list(
datasets #"flight_list" = c("202201", "202412"),
#"flight_events" = c("20220101", "20241231")#,
"measurements" = c("20220101", "20241231")
)
for (data_type in names(datasets)) {
<- datasets[[data_type]]
dates <- generate_urls(data_type, dates[1], dates[2])
urls 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.
- January 01, 2022 - January 11, 2022
Download measurements_20220101_20220111.parquet - January 11, 2022 - January 21, 2022
Download measurements_20220111_20220121.parquet - January 21, 2022 - January 31, 2022
Download measurements_20220121_20220131.parquet - January 31, 2022 - February 10, 2022
Download measurements_20220131_20220210.parquet - February 10, 2022 - February 20, 2022
Download measurements_20220210_20220220.parquet - February 20, 2022 - March 02, 2022
Download measurements_20220220_20220302.parquet - March 02, 2022 - March 12, 2022
Download measurements_20220302_20220312.parquet - March 12, 2022 - March 22, 2022
Download measurements_20220312_20220322.parquet - March 22, 2022 - April 01, 2022
Download measurements_20220322_20220401.parquet - April 01, 2022 - April 11, 2022
Download measurements_20220401_20220411.parquet - April 11, 2022 - April 21, 2022
Download measurements_20220411_20220421.parquet - April 21, 2022 - May 01, 2022
Download measurements_20220421_20220501.parquet - May 01, 2022 - May 11, 2022
Download measurements_20220501_20220511.parquet - May 11, 2022 - May 21, 2022
Download measurements_20220511_20220521.parquet - May 21, 2022 - May 31, 2022
Download measurements_20220521_20220531.parquet - May 31, 2022 - June 10, 2022
Download measurements_20220531_20220610.parquet - June 10, 2022 - June 20, 2022
Download measurements_20220610_20220620.parquet - June 20, 2022 - June 30, 2022
Download measurements_20220620_20220630.parquet - June 30, 2022 - July 10, 2022
Download measurements_20220630_20220710.parquet - July 10, 2022 - July 20, 2022
Download measurements_20220710_20220720.parquet - July 20, 2022 - July 30, 2022
Download measurements_20220720_20220730.parquet - July 30, 2022 - August 09, 2022
Download measurements_20220730_20220809.parquet - August 09, 2022 - August 19, 2022
Download measurements_20220809_20220819.parquet - August 19, 2022 - August 29, 2022
Download measurements_20220819_20220829.parquet - August 29, 2022 - September 08, 2022
Download measurements_20220829_20220908.parquet - September 08, 2022 - September 18, 2022
Download measurements_20220908_20220918.parquet - September 18, 2022 - September 28, 2022
Download measurements_20220918_20220928.parquet - September 28, 2022 - October 08, 2022
Download measurements_20220928_20221008.parquet - October 08, 2022 - October 18, 2022
Download measurements_20221008_20221018.parquet - October 18, 2022 - October 28, 2022
Download measurements_20221018_20221028.parquet - October 28, 2022 - November 07, 2022
Download measurements_20221028_20221107.parquet - November 07, 2022 - November 17, 2022
Download measurements_20221107_20221117.parquet - November 17, 2022 - November 27, 2022
Download measurements_20221117_20221127.parquet - November 27, 2022 - December 07, 2022
Download measurements_20221127_20221207.parquet - December 07, 2022 - December 17, 2022
Download measurements_20221207_20221217.parquet - December 17, 2022 - December 27, 2022
Download measurements_20221217_20221227.parquet - December 27, 2022 - January 06, 2023
Download measurements_20221227_20230106.parquet - January 06, 2023 - January 16, 2023
Download measurements_20230106_20230116.parquet - January 16, 2023 - January 26, 2023
Download measurements_20230116_20230126.parquet - January 26, 2023 - February 05, 2023
Download measurements_20230126_20230205.parquet - February 05, 2023 - February 15, 2023
Download measurements_20230205_20230215.parquet - February 15, 2023 - February 25, 2023
Download measurements_20230215_20230225.parquet - February 25, 2023 - March 07, 2023
Download measurements_20230225_20230307.parquet - March 07, 2023 - March 17, 2023
Download measurements_20230307_20230317.parquet - March 17, 2023 - March 27, 2023
Download measurements_20230317_20230327.parquet - March 27, 2023 - April 06, 2023
Download measurements_20230327_20230406.parquet - April 06, 2023 - April 16, 2023
Download measurements_20230406_20230416.parquet - April 16, 2023 - April 26, 2023
Download measurements_20230416_20230426.parquet - April 26, 2023 - May 06, 2023
Download measurements_20230426_20230506.parquet - May 06, 2023 - May 16, 2023
Download measurements_20230506_20230516.parquet - May 16, 2023 - May 26, 2023
Download measurements_20230516_20230526.parquet - May 26, 2023 - June 05, 2023
Download measurements_20230526_20230605.parquet - June 05, 2023 - June 15, 2023
Download measurements_20230605_20230615.parquet - June 15, 2023 - June 25, 2023
Download measurements_20230615_20230625.parquet - June 25, 2023 - July 05, 2023
Download measurements_20230625_20230705.parquet - July 05, 2023 - July 15, 2023
Download measurements_20230705_20230715.parquet - July 15, 2023 - July 25, 2023
Download measurements_20230715_20230725.parquet - July 25, 2023 - August 04, 2023
Download measurements_20230725_20230804.parquet - August 04, 2023 - August 14, 2023
Download measurements_20230804_20230814.parquet - August 14, 2023 - August 24, 2023
Download measurements_20230814_20230824.parquet - August 24, 2023 - September 03, 2023
Download measurements_20230824_20230903.parquet - September 03, 2023 - September 13, 2023
Download measurements_20230903_20230913.parquet - September 13, 2023 - September 23, 2023
Download measurements_20230913_20230923.parquet - September 23, 2023 - October 03, 2023
Download measurements_20230923_20231003.parquet - October 03, 2023 - October 13, 2023
Download measurements_20231003_20231013.parquet - October 13, 2023 - October 23, 2023
Download measurements_20231013_20231023.parquet - October 23, 2023 - November 02, 2023
Download measurements_20231023_20231102.parquet - November 02, 2023 - November 12, 2023
Download measurements_20231102_20231112.parquet - November 12, 2023 - November 22, 2023
Download measurements_20231112_20231122.parquet - November 22, 2023 - December 02, 2023
Download measurements_20231122_20231202.parquet - December 02, 2023 - December 12, 2023
Download measurements_20231202_20231212.parquet - December 12, 2023 - December 22, 2023
Download measurements_20231212_20231222.parquet - December 22, 2023 - January 01, 2024
Download measurements_20231222_20240101.parquet - January 01, 2024 - January 11, 2024
Download measurements_20240101_20240111.parquet - January 11, 2024 - January 21, 2024
Download measurements_20240111_20240121.parquet - January 21, 2024 - January 31, 2024
Download measurements_20240121_20240131.parquet - January 31, 2024 - February 10, 2024
Download measurements_20240131_20240210.parquet - February 10, 2024 - February 20, 2024
Download measurements_20240210_20240220.parquet - February 20, 2024 - March 01, 2024
Download measurements_20240220_20240301.parquet - March 01, 2024 - March 11, 2024
Download measurements_20240301_20240311.parquet - March 11, 2024 - March 21, 2024
Download measurements_20240311_20240321.parquet - March 21, 2024 - March 31, 2024
Download measurements_20240321_20240331.parquet - March 31, 2024 - April 10, 2024
Download measurements_20240331_20240410.parquet - April 10, 2024 - April 20, 2024
Download measurements_20240410_20240420.parquet - April 20, 2024 - April 30, 2024
Download measurements_20240420_20240430.parquet - April 30, 2024 - May 10, 2024
Download measurements_20240430_20240510.parquet - May 10, 2024 - May 20, 2024
Download measurements_20240510_20240520.parquet - May 20, 2024 - May 30, 2024
Download measurements_20240520_20240530.parquet - May 30, 2024 - June 09, 2024
Download measurements_20240530_20240609.parquet - June 09, 2024 - June 19, 2024
Download measurements_20240609_20240619.parquet - June 19, 2024 - June 29, 2024
Download measurements_20240619_20240629.parquet - June 29, 2024 - July 09, 2024
Download measurements_20240629_20240709.parquet - July 09, 2024 - July 19, 2024
Download measurements_20240709_20240719.parquet - July 19, 2024 - July 29, 2024
Download measurements_20240719_20240729.parquet - July 29, 2024 - August 08, 2024
Download measurements_20240729_20240808.parquet - August 08, 2024 - August 18, 2024
Download measurements_20240808_20240818.parquet - August 18, 2024 - August 28, 2024
Download measurements_20240818_20240828.parquet - August 28, 2024 - September 07, 2024
Download measurements_20240828_20240907.parquet - September 07, 2024 - September 17, 2024
Download measurements_20240907_20240917.parquet - September 17, 2024 - September 27, 2024
Download measurements_20240917_20240927.parquet - September 27, 2024 - October 07, 2024
Download measurements_20240927_20241007.parquet - October 07, 2024 - October 17, 2024
Download measurements_20241007_20241017.parquet - October 17, 2024 - October 27, 2024
Download measurements_20241017_20241027.parquet - October 27, 2024 - November 06, 2024
Download measurements_20241027_20241106.parquet - November 06, 2024 - November 16, 2024
Download measurements_20241106_20241116.parquet - November 16, 2024 - November 26, 2024
Download measurements_20241116_20241126.parquet - November 26, 2024 - December 06, 2024
Download measurements_20241126_20241206.parquet`
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].