Weather api
user_1013312
python
a year ago
10 kB
0
Indexable
Never
# 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.")