오늘 날씨 자동으로 수집해서 기록하기! 파이썬 날씨 데이터 자동화

오늘 날씨 자동으로 수집해서 기록하기! 파이썬 날씨 데이터 자동화 (완성 코드 공개)

파이썬으로 날씨 데이터를 자동으로 수집하고 기록하는 모습


"현장 작업 일지에 매일 아침 날씨를 입력해야 한다", "비가 올 것 같은 날 외근 일정을 바꾸려면 미리 알림이 필요하다", "월별 날씨 데이터를 모아 두고 싶다"…

날씨 정보는 매일 포털 사이트에서 확인할 수 있지만, 이력을 자동으로 기록하거나 조건에 따라 알림을 받으려면 별도 설정이 필요합니다. 파이썬과 무료 날씨 API를 활용하면 현재 날씨, 기온, 습도, 풍속 데이터를 자동으로 수집하고 엑셀에 누적 저장할 수 있습니다. 회원가입 없이 무료로 사용할 수 있는 OpenWeatherMap API를 사용합니다.


1단계: 무료 API 키 발급 (최초 1회만)

OpenWeatherMap은 하루 1,000회까지 무료로 날씨 데이터를 제공합니다. 아래 순서로 API 키를 발급받으세요.

  1. openweathermap.org에 접속해 "Sign Up"으로 무료 회원가입합니다.
  2. 로그인 후 상단 메뉴 "API keys" 탭을 클릭합니다.
  3. 기본으로 생성된 API 키를 복사해 둡니다. 키 활성화까지 최대 2시간이 소요됩니다.
⚠️ 주의: API 키는 개인 식별 정보입니다. 코드를 외부에 공유할 때는 API 키 부분을 반드시 삭제하거나 환경 변수로 분리하세요.

2단계: 준비물 설치

터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install requests pandas openpyxl

requests는 OpenWeatherMap API 서버에 날씨 데이터를 요청하는 라이브러리입니다. pandasopenpyxl은 수집한 데이터를 엑셀에 누적 저장하는 데 사용합니다.


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단계: 실행 방법

  1. 코드 ① 설정의 API_KEY에 발급받은 키를 입력합니다.
  2. CITY에 수집할 도시 이름을 영문으로 입력합니다. 서울은 Seoul, 부산은 Busan, 제주는 Jeju입니다.
  3. OUTPUT_PATH에 저장할 엑셀 경로를 입력합니다.
  4. 터미널에서 아래 명령어로 실행합니다:
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일치 예보 데이터를 수집하거나, 일출·일몰 시각을 함께 기록하는 것도 가능합니다.

이 블로그의 인기 게시물

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁