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.
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
číslem požadovaného senzoru edituj python script níže, změn pouze číslo v první položce:
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>