<aside> 💡 Všechna data ze senzoru jsou uložena v archivu na stránce http://archive.sensor.community podle data. Číslo senzoru najdete podle ID z mapy. Jeden senzor se skládá většinou ze dvou senzorů - jeden pro PM částice a druhý pro teplotu a vlhkost. Pokud potřebujete průběh např. teploty místo výchozí PM, změňte vrstvu na teplotní a klikněte na senzor ukazující teplotu. ID jednoho senzoru jsou typicky hned vedle sebe, např. senzor PM: 73632 a senzor teploty a vlhkosti: 73633
</aside>
<aside> ❗ Prosím nezatěžujte archiv příliš častými opakujícími dotazy, vždy se ujistěte, že data která stahujete opravdu potřebujete pro vaši práci. Je to obrovská databáze obsahující miliardy měření spravovaná dobrovolníky ve svém volném čase, chovejte se k ní proto slušně.
</aside>
Data z archivu ze svého senzoru si můžete stáhnout přímo z archivu ve formátu .csv pro jednotlivé dny. Např.:
PM částice: archive.sensor.community/2024-04-01/2024-04-01_sds011_sensor_73632.csv
teplota: http://archive.sensor.community/2024-04-01/2024-04-01_bme280_sensor_73633.csv
Pro vypsání dat z jednoho, nebo vícero senzorů můžete využít jednoduchý python kód, který vám vypíše měření z jednoho, nebo více senzorů naměřené v jednom nebo více dní. Platí pouze pro aktuální rok, pro historická data z minulých let by se kód musel trochu upravit:
import requests
#vložte ID senzorů do tabulky oddělené čárkami, ID najdete např. na mapě
sensor_id = [73737,73632,73015]
#vložte požadovaná data do tabulky ve formátu 'RRRR-MM-DD' oddělené čárkami
dates = ['2024-03-30','2024-03-31','2024-04-01']
url_deb = '<https://archive.sensor.community/>'
for n1 in range(0,len(dates)):
date = dates[n1]
url_ok = url_deb + date
r1 = requests.get(url_ok)
source_code = r1.text
for n2 in range(0,len(sensor_id)):
test = 'sensor_'+str(sensor_id[n2])+'.csv'
if test in source_code:
split1 = source_code.split(test)[0]
split2 = split1.split('<a href="')[-1]
url_fin = url_ok + '/' + split2 + test
r2 = requests.get(url_fin)
data = r2.text
#data ze senzorů se zobrazí v terminálu
print(data)
credit: JPGueno
Zde je složitější kód, který vypíše požadovaný senzor (nebo senzory) do jednoho sloučeného .csv souboru. Tady už můžeme analyzovat i předešlé roky. Kód obsahuje 2* opakování stažení souboru pokud se vyskytne chyba.
import requests
from datetime import datetime, timedelta
import time
# Sensor IDs
sensor_id = [73632]
# Date range
start_date = '2024-03-30'
end_date = '2024-04-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
for sensor in sensor_id:
with open(f'sensor_{sensor}_combined.csv', 'wb') as combined_file:
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()
combined_file.write(r2.content)
print(f'Appended data for {date_str} to {file_name}')
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.')
Jak dále s daty pracovat? Koukněte na Vizualizace a analýza dat.