오늘 날씨 자동으로 수집해서 기록하기! 파이썬 날씨 데이터 자동화
오늘 날씨 자동으로 수집해서 기록하기! 파이썬 날씨 데이터 자동화 (완성 코드 공개)
"현장 작업 일지에 매일 아침 날씨를 입력해야 한다", "비가 올 것 같은 날 외근 일정을 바꾸려면 미리 알림이 필요하다", "월별 날씨 데이터를 모아 두고 싶다"…
날씨 정보는 매일 포털 사이트에서 확인할 수 있지만, 이력을 자동으로 기록하거나 조건에 따라 알림을 받으려면 별도 설정이 필요합니다. 파이썬과 무료 날씨 API를 활용하면 현재 날씨, 기온, 습도, 풍속 데이터를 자동으로 수집하고 엑셀에 누적 저장할 수 있습니다. 회원가입 없이 무료로 사용할 수 있는 OpenWeatherMap API를 사용합니다.
1단계: 무료 API 키 발급 (최초 1회만)
OpenWeatherMap은 하루 1,000회까지 무료로 날씨 데이터를 제공합니다. 아래 순서로 API 키를 발급받으세요.
- openweathermap.org에 접속해 "Sign Up"으로 무료 회원가입합니다.
- 로그인 후 상단 메뉴 "API keys" 탭을 클릭합니다.
- 기본으로 생성된 API 키를 복사해 둡니다. 키 활성화까지 최대 2시간이 소요됩니다.
⚠️ 주의: API 키는 개인 식별 정보입니다. 코드를 외부에 공유할 때는 API 키 부분을 반드시 삭제하거나 환경 변수로 분리하세요.
2단계: 준비물 설치
터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install requests pandas openpyxl
requests는 OpenWeatherMap API 서버에 날씨 데이터를 요청하는 라이브러리입니다. pandas와 openpyxl은 수집한 데이터를 엑셀에 누적 저장하는 데 사용합니다.
3단계: 완성 코드
아래 코드를 그대로 복사해서 메모장에 붙여넣고, weather.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
import requests
import pandas as pd
from pathlib import Path
from datetime import datetime
# ① 설정
API_KEY = "여기에_API_키_입력" # ← 1단계에서 발급받은 키
CITY = "Seoul" # ← 수집할 도시 (영문)
OUTPUT_PATH = r"C:\Users\내이름\Desktop\날씨_이력.xlsx" # ← 저장 경로
# 비·눈 등 특정 날씨 조건 시 경고 (아래 목록에 포함되면 경고 출력)
ALERT_CONDITIONS = ["Rain", "Snow", "Thunderstorm", "Drizzle"]
ALERT_TEMP_LOW = 0 # ← 기온이 이 값(°C) 이하면 경고
ALERT_TEMP_HIGH = 35 # ← 기온이 이 값(°C) 이상이면 경고
# ② API 호출
url = f"https://api.openweathermap.org/data/2.5/weather"
params = {
"q": CITY,
"appid": API_KEY,
"units": "metric", # 섭씨 온도 사용
"lang": "kr", # 날씨 설명 한국어
}
res = requests.get(url, params=params, timeout=10)
res.raise_for_status()
data = res.json()
# ③ 데이터 파싱
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
temp = data["main"]["temp"]
feels_like = data["main"]["feels_like"]
temp_min = data["main"]["temp_min"]
temp_max = data["main"]["temp_max"]
humidity = data["main"]["humidity"]
wind_speed = data["wind"]["speed"]
weather_main = data["weather"][0]["main"]
weather_desc = data["weather"][0]["description"]
visibility = round(data.get("visibility", 0) / 1000, 1) # m → km
print(f" ✔ 도시: {CITY}")
print(f" ✔ 날씨: {weather_desc} ({weather_main})")
print(f" ✔ 기온: {temp}°C (체감 {feels_like}°C)")
print(f" ✔ 최저/최고: {temp_min}°C / {temp_max}°C")
print(f" ✔ 습도: {humidity}%")
print(f" ✔ 풍속: {wind_speed} m/s")
print(f" ✔ 가시거리: {visibility} km")
# ④ 경고 판단
warnings = []
if weather_main in ALERT_CONDITIONS:
warnings.append(f"날씨 주의 ({weather_desc})")
if temp <= ALERT_TEMP_LOW:
warnings.append(f"저온 경보 ({temp}°C)")
if temp >= ALERT_TEMP_HIGH:
warnings.append(f"고온 경보 ({temp}°C)")
status = " / ".join(warnings) if warnings else "정상"
# ⑤ 결과 정리
result = {
"수집일시": now,
"도시": CITY,
"날씨": weather_desc,
"날씨코드": weather_main,
"기온(°C)": temp,
"체감온도(°C)": feels_like,
"최저기온(°C)": temp_min,
"최고기온(°C)": temp_max,
"습도(%)": humidity,
"풍속(m/s)": wind_speed,
"가시거리(km)": visibility,
"상태": status,
}
# ⑥ 엑셀에 누적 저장
output = Path(OUTPUT_PATH)
df_new = pd.DataFrame([result])
if output.exists():
df_old = pd.read_excel(output, engine="openpyxl")
df_all = pd.concat([df_old, df_new], ignore_index=True)
else:
df_all = df_new
df_all.to_excel(output, index=False)
if warnings:
print(f"\n ⚠ 경고: {status}")
else:
print(f"\n ✅ 날씨 정상")
print(f"\n✅ 완료! 누적 {len(df_all)}회 기록 → {OUTPUT_PATH}")
4단계: 실행 방법
- 코드 ① 설정의
API_KEY에 발급받은 키를 입력합니다. CITY에 수집할 도시 이름을 영문으로 입력합니다. 서울은Seoul, 부산은Busan, 제주는Jeju입니다.OUTPUT_PATH에 저장할 엑셀 경로를 입력합니다.- 터미널에서 아래 명령어로 실행합니다:
python weather.py
정상 실행 시 터미널에 이렇게 출력됩니다:
✔ 도시: Seoul ✔ 날씨: 맑음 (Clear) ✔ 기온: 28.3°C (체감 30.1°C) ✔ 최저/최고: 24.1°C / 31.5°C ✔ 습도: 65% ✔ 풍속: 2.3 m/s ✔ 가시거리: 10.0 km ✅ 날씨 정상 ✅ 완료! 누적 1회 기록 → C:\Users\내이름\Desktop\날씨_이력.xlsx
5단계: 자주 발생하는 오류와 해결법
오류 1: 401 Unauthorized
API 키가 잘못 입력되었거나 아직 활성화되지 않은 경우입니다. 키 발급 후 최대 2시간이 지나야 활성화됩니다. 키를 다시 확인하고 앞뒤 공백이 없는지 점검하세요.
오류 2: 404 Not Found
CITY에 입력한 도시 이름을 찾을 수 없는 경우입니다. 영문 도시명을 정확히 입력했는지 확인하세요. 도시명이 불분명할 경우 "Seoul,KR"처럼 국가 코드를 함께 입력하면 더 정확하게 찾습니다.
오류 3: 날씨 설명이 한국어가 아닌 영어로 출력됨
API 파라미터에 "lang": "kr"이 포함되어 있는지 확인하세요. 없다면 추가하세요. OpenWeatherMap의 한국어 지원이 불완전한 날씨 코드는 영어로 출력될 수 있습니다.
응용: 여러 도시 날씨를 한꺼번에 수집하기
여러 지점의 날씨를 동시에 수집하고 싶다면 도시 목록을 리스트로 만들어 반복 처리하면 됩니다. 코드 ① 설정의 CITY를 아래처럼 교체하세요.
CITIES = ["Seoul,KR", "Busan,KR", "Jeju,KR", "Tokyo,JP"] # ← 수집할 도시 목록
all_results = []
for city in CITIES:
params["q"] = city
res = requests.get(url, params=params, timeout=10)
data = res.json()
# ... (기존 파싱 코드에서 CITY → city로 교체)
all_results.append(result)
df_new = pd.DataFrame(all_results)
💡 이전 게시글과 결합하면: 텔레그램 자동 발송 편과 결합하면 비·눈·강풍 경보 시 즉시 텔레그램 알림을 받을 수 있고, 알람 자동 실행 편과 결합하면 매일 아침 날씨 요약을 자동으로 수신하는 것도 가능합니다.
핵심 요약
- 준비물: OpenWeatherMap 무료 API 키 발급(최초 1회) + pip install requests pandas openpyxl
- 설정: API_KEY, CITY, OUTPUT_PATH, 경고 기준 온도 수정
- 실행: 터미널에서 python weather.py 입력
- 결과: 기온·습도·풍속·날씨 상태가 수집일시와 함께 엑셀에 누적 저장, 경보 조건 자동 감지
이 코드를 응용하면 5일치 예보 데이터를 수집하거나, 일출·일몰 시각을 함께 기록하는 것도 가능합니다.
