Weather api
user_1013312
python
2 years ago
10 kB
7
Indexable
# Importera nödvändiga bibliotek
import os
from dotenv import load_dotenv
import requests
import openpyxl
from datetime import datetime
# Ladda in .env-filen
load_dotenv()
# Hämta API-nyckeln från .env-filen
api_key = os.getenv("API_KEY")
# Ange koordinater för platsen
latitude = 59.30996
longitude = 18.0215
# Ange URL för SMHI:s API för platsprognos
api_url_smhi = f"https://opendata-download-metfcst.smhi.se/api/category/pmp3g/version/2/geotype/point/lon/{longitude}/lat/{latitude}/data.json"
# Ange URL för OpenWeatherMap:s API för platsprognos
api_url_owm = f"http://api.openweathermap.org/data/3.0/onecall?lat={latitude}&lon={longitude}&exclude=current,minutely,daily,alerts&appid={api_key}&units=metric"
# Funktion för att extrahera relevant väderdata från SMHI
def extract_relevant_data_smhi(weather_data, start_index, end_index):
relevant_data = []
for entry in weather_data["timeSeries"][start_index:end_index]:
valid_time = entry["validTime"]
tid = datetime.fromisoformat(valid_time[:])
är_nederbörd = False
for parameter in entry["parameters"]:
if parameter["name"] == "t":
temperature = parameter["values"][0]
elif parameter["name"] == "pcat" and parameter["values"][0] > 0:
är_nederbörd = True
if är_nederbörd:
precipitation = "Nederbörd"
else:
precipitation = "Ingen nederbörd"
relevant_data.append({
"Tid": tid,
"Temperatur (°C)": temperature,
"Nederbörd": precipitation,
"Provider": "SMHI"
})
return relevant_data
# Funktion för att extrahera relevant väderdata från OpenWeatherMap
def extract_relevant_data_owm(weather_data, end_index_owm):
relevant_data = []
for entry in weather_data["hourly"]:
valid_time = entry["dt"]
tid = datetime.fromtimestamp(valid_time)
temperature = entry["temp"]
#Standardvärde för nederbörd
precipitation = "ingen nederbörd"
# Kontrollera om det finns någon nederbörd
if "rain" in entry and "1h" in entry["rain"]:
if int(entry["rain"]["1h"]) > 0:
precipitation = "Nederbörd"
else:
precipitation = "Ingen nederbörd"
relevant_data.append({
"Tid": tid,
"Temperatur (°C)": temperature,
"Nederbörd": precipitation,
"Provider": "OpenWeatherMap"
})
return relevant_data
# Funktion för att skriva ut väderdata
def print_weather_data(relevant_data):
print(f"Prognos från {relevant_data[0]['Provider']} {datetime.now().strftime('%Y-%m-%d')}:")
for entry in relevant_data:
tid = entry["Tid"]
temperatur = entry["Temperatur (°C)"]
precipitation = entry["Nederbörd"]
formaterad_tid = tid.strftime("%H:%M")
print(f"{formaterad_tid} {temperatur} grader {precipitation}")
# Funktion för att spara väderdata till Excel-fil
def save_to_excel(relevant_data, file_name):
try:
wb = openpyxl.load_workbook(file_name)
except FileNotFoundError:
wb = openpyxl.Workbook()
provider = relevant_data[0]["Provider"]
if provider in wb.sheetnames:
sheet = wb[provider]
sheet.append([])
else:
sheet = wb.create_sheet(title=provider)
sheet.append(["Timestamp", "Longitude", "Latitud", "Date", "Time", "Temperatur (°C)", "Precipitation", "Provider"]) #lägg till rubrikerna för kolumnerna
for entry in relevant_data:
tid = entry["Tid"]
temperatur = entry["Temperatur (°C)"]
if entry["Nederbörd"] == "Nederbörd" or entry["Nederbörd"] == "Ingen nederbörd":
nederbörd = entry["Nederbörd"]
else:
nederbörd = "Nederbörd" if entry["Nederbörd"] else "Ingen nederbörd"
sheet.append([datetime.now(), str(longitude), str(latitude), tid.date(), tid.strftime("%H:%M"), temperatur, nederbörd, provider])
if provider == "SMHI" or provider == "OpenWeatherMap":
columns_widths = {'A': 18, 'B': 12, 'C': 12, 'D': 12, 'E': 12, 'F': 18, 'G': 18, 'H': 20}
for col, width in columns_widths.items():
sheet.column_dimensions[col].width = width
for sheet in wb.worksheets:
for row in sheet.iter_rows():
for cell in row:
if cell.row == 1:
cell.alignment = openpyxl.styles.Alignment(horizontal='center')
else:
cell.alignment = openpyxl.styles.Alignment(wrap_text=False, horizontal='right') #formaterar cellerna för att rymma texten
wb.save(file_name)
print(f"Väderdata har sparats i Excel-filen '{file_name}' på arket '{provider}'.")
weather_data_owm = []
# Ge användaren möjlighet att interagera med datan
while True:
print("Välj en åtgärd:")
print("1. Hämta data")
print("2. Skriv ut prognos")
print("9. Avsluta")
val = input("Ange ditt val: ")
if val == "1":
print("Välj en datakälla:")
print("1. SMHI")
print("2. OpenWeatherMap")
print("3. Båda")
source_val = input("Ange ditt val: ")
if source_val == "1":
# Gör API-anropet till SMHI
response_smhi = requests.get(api_url_smhi)
# Kontrollera svarskoden från API-anropet till SMHI
if response_smhi.status_code == 200:
# Extrahera relevant data från API-svaret från SMHI
weather_data_smhi = response_smhi.json()
now = datetime.now()
start_index = 0 # Ändra här för att börja från den aktuella tiden
end_index = start_index + 25 # Ändra här för att få de kommande 24 timmarna
# Extrahera relevant väderdata från SMHI
relevant_data_smhi = extract_relevant_data_smhi(weather_data_smhi, start_index, end_index)
#relevant_data_owm = extract_relevant_data_owm(weather_data_owm, start_index, end_index)
# Spara väderdata till Excel-fil
save_to_excel(relevant_data_smhi, "väderdata_smhi_owm.xlsx")
#save_to_excel(relevant_data_owm, "väderdata_smhi_owm.xlsx")
else:
print("Fel vid hämtning av väderdata från SMHI.")
elif source_val == "2":
# Gör API-anropet till OpenWeatherMap
response_owm = requests.get(api_url_owm)
# Kontrollera svarskoden från API-anropet till OpenWeatherMap
if response_owm.status_code == 200:
# Extrahera relevant data från API-svaret från OpenWeatherMap
weather_data_owm = response_owm.json()
start_index = 0
end_index_owm = 24
# Extrahera relevant väderdata från OpenWeatherMap
relevant_data_owm = extract_relevant_data_owm(weather_data_owm, end_index_owm)
# Spara väderdata till Excel-fil
save_to_excel(relevant_data_owm, "väderdata_smhi_owm.xlsx")
else:
print("Fel vid hämtning av väderdata från OpenWeatherMap.")
elif source_val == "3":
# Gör API-anropet till SMHI
response_smhi = requests.get(api_url_smhi)
# Kontrollera svarskoden från API-anropet till SMHI
if response_smhi.status_code == 200:
# Extrahera relevant data från API-svaret från SMHI
weather_data_smhi = response_smhi.json()
now = datetime.now()
start_index = 0 # Ändra här för att börja från den aktuella tiden
end_index_smhi = start_index + 25 # Ändra här för att få de kommande 24 timmarna
end_index_owm = start_index + 24
# Extrahera relevant väderdata från SMHI
relevant_data_smhi = extract_relevant_data_smhi(weather_data_smhi, start_index, end_index_smhi)
relevant_data_owm = extract_relevant_data_owm(weather_data_owm, end_index_owm)
# Spara väderdata till Excel-fil
save_to_excel(relevant_data_smhi, "väderdata_smhi_owm.xlsx")
save_to_excel(relevant_data_owm, "väderdata_smhi_owm.xlsx")
else:
print("Fel vid hämtning av väderdata från SMHI.")
# Gör API-anropet till OpenWeatherMap
response_owm = requests.get(api_url_owm)
# Kontrollera svarskoden från API-anropet till OpenWeatherMap
if response_owm.status_code == 200:
# Extrahera relevant data från API-svaret från OpenWeatherMap
weather_data_owm = response_owm.json()
# Extrahera relevant väderdata från OpenWeatherMap
relevant_data_owm = extract_relevant_data_owm(weather_data_owm, end_index_owm)
# Spara väderdata till Excel-fil
save_to_excel(relevant_data_owm, "väderdata_smhi_owm.xlsx")
else:
print("Fel vid hämtning av väderdata från OpenWeatherMap.")
else:
print("Ogiltigt val. Försök igen.")
elif val == "2":
print("Välj en datakälla:")
print("1. SMHI")
print("2. OpenWeatherMap")
source_val = input("Ange ditt val: ")
if source_val == "1":
try:
print_weather_data(relevant_data_smhi)
except NameError:
print("Du måste hämta data först genom att välja alternativ 1.")
elif source_val == "2":
try:
print_weather_data(relevant_data_owm)
except NameError:
print("Du måste hämta data först genom att välja alternativ 1.")
else:
print("Ogiltigt val. Försök igen.")
elif val == "9":
print("Avslutar programmet.")
break
else:
print("Ogiltigt val. Försök igen.")Editor is loading...