Weather api

 avatar
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.")