//AdSenseにリンク

今の天気と気温をExcelに書き出す&ファイルが存在する場合、新しいデータを追加するPythonコード(OpenWeatherMap)

天気と気温とを取得

OpenWeatherMapとopenpyxlをインストールする

OpenWeatherMapのAPIを登録する

APIを使用するためにはAPIキーが必要ですので、事前に登録してAPIキーを取得してください。

https://openweathermap.org

今回は無料枠で登録しています。

1分間に60コール/1ヶ月に1,000,000コールまで無料

現在の天気

3時間予報 5日間

基本的な天気図

などが無料で使用できます

openpyxlをインストール

Excelファイルに書き出すことができるライブラリーです

pip install openpyxl

 今回は、現在の東京の現在の気温と天気を取得します。

import requests
import datetime
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import Font

# OpenWeatherMap APIから天気データを取得する関数
def get_weather_data(api_key, city):
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
    response = requests.get(url)
    data = response.json()
    return {
        "temperature": data["main"]["temp"],
        "description": data["weather"][0]["description"],
        "date": data["dt"]
    }

# Excelファイルにデータを書き込む関数
def write_to_excel(data, file_name="weather_data.xlsx"):
    # 新しいワークブックを作成
    wb = Workbook()
    ws = wb.active
    ws.title = "Weather Data"
    
    # ヘッダーを追加
    headers = ["Date", "Temperature", "Description"]
    for col_num, header in enumerate(headers, 1):
        col_letter = get_column_letter(col_num)
        ws[f"{col_letter}1"] = header
        ws[f"{col_letter}1"].font = Font(bold=True)

    # データを追加
    values = [
        [data["date"], data["temperature"], data["description"]]
    ]
    for row in values:
        ws.append(row)
    
    # Excelファイルを保存
    wb.save(file_name)
    print(f"Data written to {file_name}")

if __name__ == "__main__":
    # APIキーを入れて場所を指示する
    api_key = "登録して取得したAPIキーを入れる"
    city = "Tokyo"
    
    weather_data = get_weather_data(api_key, city)
    
    # Unix timestampを日付文字列に変換
    weather_data["date"] = datetime.datetime.fromtimestamp(weather_data["date"]).strftime('%Y-%m-%d %H:%M:%S')
    
    write_to_excel(weather_data)

完成

※Temperatureは気温です、Descriptionは天気、broken cloud:曇りがち、くもりがち

カスタマイズ:ファイルが存在する場合、新しいデータを追記する

1.ファイルが存在する場合、そのファイルに新しい行にデータが追加されます。(load_workbook)

from openpyxl import Workbook, load_workbook

2.ファイルが存在しない場合、新しいファイルが作成され、ヘッダーが追加された後にデータが追加されます。
( else:部分)

    # ファイルが存在するか確認
    if os.path.exists(file_name):
        wb = load_workbook(file_name)
        ws = wb.active
    else:
        wb = Workbook()
        ws = wb.active
        ws.title = "Weather Data"

3.スクリプトを保存して実行します。(import os

    # Excelファイルを保存
    wb.save(file_name)
    print(f"Data written to {file_name}")

if __name__ == "__main__":
    import os

新しいデータを追加するコード

import requests
import datetime
from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import Font

# OpenWeatherMap APIから天気データを取得する関数
def get_weather_data(api_key, city):
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
    response = requests.get(url)
    data = response.json()
    return {
        "temperature": data["main"]["temp"],
        "description": data["weather"][0]["description"],
        "date": data["dt"]
    }

# Excelファイルにデータを書き込む関数
def write_to_excel(data, file_name="weather_data.xlsx"):
    # ファイルが存在するか確認
    if os.path.exists(file_name):
        wb = load_workbook(file_name)
        ws = wb.active
    else:
        wb = Workbook()
        ws = wb.active
        ws.title = "Weather Data"
        # ヘッダーを追加
        headers = ["Date", "Temperature", "Description"]
        for col_num, header in enumerate(headers, 1):
            col_letter = get_column_letter(col_num)
            ws[f"{col_letter}1"] = header
            ws[f"{col_letter}1"].font = Font(bold=True)
    
    # データを追加
    values = [
        [data["date"], data["temperature"], data["description"]]
    ]
    for row in values:
        ws.append(row)
    
    # Excelファイルを保存
    wb.save(file_name)
    print(f"Data written to {file_name}")

if __name__ == "__main__":
    import os
    # 登録して取得したAPIキーを入れる
    api_key = "登録して取得したAPIキーを入れる"
    city = "Tokyo"
    
    weather_data = get_weather_data(api_key, city)
    
    # Unix timestampを日付文字列に変換
    weather_data["date"] = datetime.datetime.fromtimestamp(weather_data["date"]).strftime('%Y-%m-%d %H:%M:%S')
    
    write_to_excel(weather_data)

完成

表示される天気の種類と日本語訳

https://openweathermap.org/weather-conditions

Description日本語訳
Thunderstorm雷雨
Drizzle霧雨
Rain
Snow
Clear晴れ
Clouds曇り
Mist
Smoke
Haze
Dust
Fog
Sand
Dust
Ash
Squallスコール
Tornadoトルネード

カスタマイズ:天気以外の気候の他項目、表示できる項目を全て追加する

日付, 都市, 気温, 体感気温, 最低気温, 最高気温,気圧, 湿度, 天気, 天気詳細,風速, 風向, 雲量,日の出,日の入りを追記します。

import requests
import datetime
from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import Font
import os

# OpenWeatherMap APIから天気データを取得する関数
def get_weather_data(api_key, city):
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
    response = requests.get(url)
    data = response.json()
    return {
        "date": data["dt"],
        "city": data["name"],
        "temperature": data["main"]["temp"],
        "feels_like": data["main"]["feels_like"],
        "temp_min": data["main"]["temp_min"],
        "temp_max": data["main"]["temp_max"],
        "pressure": data["main"]["pressure"],
        "humidity": data["main"]["humidity"],
        "weather_main": data["weather"][0]["main"],
        "weather_description": data["weather"][0]["description"],
        "wind_speed": data["wind"]["speed"],
        "wind_deg": data["wind"]["deg"],
        "clouds_all": data["clouds"]["all"],
        "sunrise": data["sys"]["sunrise"],
        "sunset": data["sys"]["sunset"]
    }

# Excelファイルにデータを書き込む関数
def write_to_excel(data, file_name="weather_data.xlsx"):
    # ファイルが存在するか確認
    if os.path.exists(file_name):
        wb = load_workbook(file_name)
        ws = wb.active
    else:
        wb = Workbook()
        ws = wb.active
        ws.title = "Weather Data"
        # ヘッダーを追加
        headers = ["Date", "City", "Temperature", "Feels Like", "Temp Min", "Temp Max",
                   "Pressure", "Humidity", "Weather Main", "Weather Description",
                   "Wind Speed", "Wind Degree", "Clouds All", "Sunrise", "Sunset"]
        for col_num, header in enumerate(headers, 1):
            col_letter = get_column_letter(col_num)
            ws[f"{col_letter}1"] = header
            ws[f"{col_letter}1"].font = Font(bold=True)
    
    # データを追加
    values = [
        [data["date"], data["city"], data["temperature"], data["feels_like"], data["temp_min"],
         data["temp_max"], data["pressure"], data["humidity"], data["weather_main"],
         data["weather_description"], data["wind_speed"], data["wind_deg"],
         data["clouds_all"], data["sunrise"], data["sunset"]]
    ]
    for row in values:
        ws.append(row)
    
    # Excelファイルを保存
    wb.save(file_name)
    print(f"Data written to {file_name}")

if __name__ == "__main__":
    # "登録して取得したAPIキーを入れる"
    api_key = "登録して取得したAPIキーを入れる"
    city = "Tokyo"
    
    weather_data = get_weather_data(api_key, city)
    
    # Unix timestampを日付文字列に変換
    weather_data["date"] = datetime.datetime.fromtimestamp(weather_data["date"]).strftime('%Y-%m-%d %H:%M:%S')
    weather_data["sunrise"] = datetime.datetime.fromtimestamp(weather_data["sunrise"]).strftime('%Y-%m-%d %H:%M:%S')
    weather_data["sunset"] = datetime.datetime.fromtimestamp(weather_data["sunset"]).strftime('%Y-%m-%d %H:%M:%S')
    
    write_to_excel(weather_data)

完成

カスタマイズ:書き出しの時に日本語にして、エクセルの列を文字が全部表示されるように広く調整

コード

import requests
import datetime
from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import Font
import os

# OpenWeatherMap APIから天気データを取得する関数
def get_weather_data(api_key, city):
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
    response = requests.get(url)
    data = response.json()
    return {
        "date": data["dt"],
        "city": data["name"],
        "temperature": data["main"]["temp"],
        "feels_like": data["main"]["feels_like"],
        "temp_min": data["main"]["temp_min"],
        "temp_max": data["main"]["temp_max"],
        "pressure": data["main"]["pressure"],
        "humidity": data["main"]["humidity"],
        "weather_main": data["weather"][0]["main"],
        "weather_description": data["weather"][0]["description"],
        "wind_speed": data["wind"]["speed"],
        "wind_deg": data["wind"]["deg"],
        "clouds_all": data["clouds"]["all"],
        "sunrise": data["sys"]["sunrise"],
        "sunset": data["sys"]["sunset"]
    }

# 列の幅を調整する関数
def adjust_column_width(ws):
    for col in ws.columns:
        max_length = 0
        column = col[0].column_letter  # 列の名前 (例: 'A', 'B', 'C')
        for cell in col:
            try:
                if len(str(cell.value)) > max_length:
                    max_length = len(cell.value)
            except:
                pass
        adjusted_width = (max_length + 2)
        ws.column_dimensions[column].width = adjusted_width

# Excelファイルにデータを書き込む関数
def write_to_excel(data, file_name="weather_data.xlsx"):
    # ファイルが存在するか確認
    if os.path.exists(file_name):
        wb = load_workbook(file_name)
        ws = wb.active
    else:
        wb = Workbook()
        ws = wb.active
        ws.title = "Weather Data"
        # ヘッダーを追加
        headers = ["日付", "都市", "気温", "体感気温", "最低気温", "最高気温",
                   "気圧", "湿度", "天気", "天気詳細",
                   "風速", "風向", "雲量", "日の出", "日の入り"]
        for col_num, header in enumerate(headers, 1):
            col_letter = get_column_letter(col_num)
            ws[f"{col_letter}1"] = header
            ws[f"{col_letter}1"].font = Font(bold=True)
    
    # データを追加
    values = [
        [data["date"], data["city"], data["temperature"], data["feels_like"], data["temp_min"],
         data["temp_max"], data["pressure"], data["humidity"], data["weather_main"],
         data["weather_description"], data["wind_speed"], data["wind_deg"],
         data["clouds_all"], data["sunrise"], data["sunset"]]
    ]
    for row in values:
        ws.append(row)
    
    # 列の幅を調整
    adjust_column_width(ws)
    
    # Excelファイルを保存
    wb.save(file_name)
    print(f"Data written to {file_name}")

if __name__ == "__main__":
    # "登録して取得したAPIキーを入れる"
    api_key = "登録して取得したAPIキーを入れる"
    city = "Tokyo"
    
    weather_data = get_weather_data(api_key, city)
    
    # Unix timestampを日付文字列に変換
    weather_data["date"] = datetime.datetime.fromtimestamp(weather_data["date"]).strftime('%Y-%m-%d %H:%M:%S')
    weather_data["sunrise"] = datetime.datetime.fromtimestamp(weather_data["sunrise"]).strftime('%Y-%m-%d %H:%M:%S')
    weather_data["sunset"] = datetime.datetime.fromtimestamp(weather_data["sunset"]).strftime('%Y-%m-%d %H:%M:%S')
    
    write_to_excel(weather_data)

完成

※上書きではなく追加される仕様にしています

関連画像も指示サイズでjpgで保存

天気に合わせたアイコン画像を1080×1920pxのjpg画像で取得し、関連画像を保存するコードを追記しました。新しい関数save_weather_iconを追加し、メイン処理部分で呼び出すようにしています。

from PIL import Image
def save_weather_icon(icon_code, file_name="weather_icon.jpg"):
    url = f"http://openweathermap.org/img/wn/{icon_code}@2x.png"
    response = requests.get(url, stream=True)
    if response.status_code == 200:
        with open("temp_icon.png", 'wb') as f:
            f.write(response.content)
        # Resize the image to 1080x1920px
        img = Image.open("temp_icon.png")
        img = img.resize((1080, 1920))
        img = img.convert("RGB")
        img.save(file_name)
        os.remove("temp_icon.png")
        print(f"Weather icon saved as {file_name}")
    else:
        print("Failed to retrieve the weather icon")
    # Save the weather icon
    save_weather_icon(weather_data["icon"])

python