klíčová slova: PM2,5, částice, data, open source, grafy, Silvestr, ohňostroje

požadavky: Internet, PC Windows, Python, administratorská práva

V České republice se používání pyrotechniky, zejména ohňostrojů, stává stále více regulovaným tématem. Mnoho měst zavedlo vlastní omezení s cílem zvýšit bezpečnost, chránit zvířata a minimalizovat hlukové znečištění. Pomocí komunitní sítě senzorů sensor.community si teď můžete zjistit průběh znečištění PM2,5 ve vašem městě na minulého Silvestra roku 2023.

Nalezení čísla senzoru na mapě

najdi si na mapě senzor ve svém okolí a zjisti jeho číslo, tak že klikneš na hexagon senzoru na mapě, číslo senzoru se ti zobrazí vlevo dole. Zde např. #65730

image.png

Map Sensor.Community

Editace Python scriptu číslem senzoru

číslem požadovaného senzoru edituj python script níže, změn pouze číslo v první položce:

Sensor IDs

sensor_id = [67739]

import requests
from datetime import datetime, timedelta
import time
import pandas as pd
import os

# Sensor IDs zde edituj pouze číslo
sensor_id = [67739]

# Date range
start_date = '2023-12-31'
end_date = '2024-01-01'

# Function to generate date range
def daterange(start_date, end_date):
    for n in range(int((end_date - start_date).days) + 1):
        yield start_date + timedelta(n)

start_date = datetime.strptime(start_date, "%Y-%m-%d")
end_date = datetime.strptime(end_date, "%Y-%m-%d")

# Base URL
url_deb = '<https://archive.sensor.community/>'

# Retry settings
max_retries = 2
retry_delay = 10  # seconds

output_file = f'sensor_{sensor_id[0]}_filtered.csv'
if os.path.exists(output_file):
    os.remove(output_file)

for sensor in sensor_id:
    for single_date in daterange(start_date, end_date):
        date_str = single_date.strftime("%Y-%m-%d")
        url_ok = url_deb + date_str
        attempts = 0

        while attempts < max_retries:
            try:
                r1 = requests.get(url_ok)
                r1.raise_for_status()
                source_code = r1.text

                file_name = f'sensor_{sensor}.csv'
                if file_name in source_code:
                    split1 = source_code.split(file_name)[0]
                    split2 = split1.split('<a href="')[-1]
                    url_fin = url_ok + '/' + split2 + file_name

                    r2 = requests.get(url_fin)
                    r2.raise_for_status()

                    # Save the downloaded content to a temporary file
                    temp_file = f'temp_sensor_{sensor}.csv'
                    with open(temp_file, 'wb') as temp:
                        temp.write(r2.content)

                    # Read the temp file and filter the relevant columns
                    df = pd.read_csv(temp_file, sep=';', usecols=['timestamp', 'P2'])

                    # Append the filtered data to the output file
                    df.to_csv(output_file, mode='a', index=False, header=not os.path.exists(output_file))

                    # Remove the temp file
                    os.remove(temp_file)

                    print(f'Appended data for {date_str} to {output_file}')
                    break
            except requests.exceptions.RequestException as e:
                attempts += 1
                print(f'Attempt {attempts} failed for {date_str}: {e}')
                time.sleep(retry_delay)

        if attempts == max_retries:
            print(f'Failed to download data for {date_str} after {max_retries} attempts.')

<aside> ⚠️ soubor ulož v textovém editoru Poznámkový blok např. jako “download.py

</aside>

Spuštění Python scriptu ve Windows PowerShell