今の天気と気温をExcelに書き出す&ファイルが存在する場合、新しいデータを追加するPythonコード(OpenWeatherMap)
Contents
天気と気温とを取得
OpenWeatherMapとopenpyxl
をインストールする
OpenWeatherMapのAPIを登録する
APIを使用するためにはAPIキーが必要ですので、事前に登録してAPIキーを取得してください。
今回は無料枠で登録しています。
1分間に60コール/1ヶ月に1,000,000コールまで無料
などが無料で使用できます
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"])
ディスカッション
コメント一覧
まだ、コメントがありません