안녕하세요! 오늘은 Python을 이용해 기상청 API를 통해 날씨 정보를 조회하고 이를 출력하는 코드에 대해 설명드리겠습니다. 이 글은 Python과 API를 사용하여 날씨 데이터를 다루고자 하는 분들을 위한 자세한 설명을 포함하고 있습니다.
1. 개요
이번 포스트에서는 Python을 사용하여 기상청에서 제공하는 초단기 예보 정보를 가져오는 방법에 대해 설명드리겠습니다. API 요청을 통해 특정 지역의 날씨 데이터를 수집하고, 이 데이터를 보기 쉽게 변환하여 출력하는 과정까지 상세히 설명합니다. 이 코드는 기본적으로 기상청의 초단기 예보 API를 이용하며, Pandas를 사용해 데이터를 처리하고, 예보 시간과 좌표를 통해 원하는 위치의 날씨 정보를 가져옵니다.
2. 주요 코드 설명
2.1 필요한 라이브러리 임포트
먼저 필요한 Python 라이브러리들을 임포트합니다.
import requests
from datetime import datetime, timedelta
import json
import pandas as pd
requests
: API 요청을 보내기 위한 라이브러리입니다.datetime
,timedelta
: 시간 계산에 사용됩니다.json
: API로부터 받은 응답을 JSON으로 처리하기 위해 사용합니다.pandas
: 엑셀 파일을 읽어오기 위한 라이브러리입니다.
2.2 서비스 키 설정 및 API 요청 함수 정의
날씨 정보를 요청하기 위해서는 서비스 키가 필요합니다. 여기서는 기상청의 API 키를 사용하여 정보를 가져옵니다.
serviceKey = "서비스 키를 여기에 입력하세요." # 서비스 키 설정
API 요청을 위해 get_weather_data()
함수를 정의합니다.
def get_weather_data(base_date, base_time, nx, ny):
url = (f"http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtFcst"
f"?serviceKey={serviceKey}&numOfRows=60&pageNo=1&dataType=json"
f"&base_date={base_date}&base_time={base_time}&nx={nx}&ny={ny}")
response = requests.get(url)
if response.status_code != 200:
print("Error:", response.status_code, response.text)
return None
try:
return json.loads(response.text)
except json.JSONDecodeError as e:
print("JSON Decode Error:", e)
return None
- API 요청 URL을 구성하고,
requests.get()
을 이용해 데이터를 요청합니다. - 응답이 정상적이지 않을 경우 에러 메시지를 출력합니다.
- 응답이 정상이라면 JSON 형식으로 변환합니다.
2.3 엑셀 파일 읽기
날씨 정보를 요청할 좌표를 포함한 location_grids.xlsx
파일을 읽어옵니다.
try:
import openpyxl
data = pd.read_excel('./data/location_grids.xlsx')
data.head()
except FileNotFoundError:
print("Error: location_grids.xlsx 파일을 찾을 수 없습니다.")
exit()
except ImportError:
print("Error: openpyxl 모듈이 설치되어 있지 않습니다. 'pip install openpyxl' 명령어를 사용하여 설치하세요.")
exit()
- 파일이 없거나
openpyxl
모듈이 설치되어 있지 않은 경우를 대비하여 에러 처리를 해줍니다.
2.4 날짜 및 시간 설정
기상청 API는 데이터를 요청할 때 기본적으로 기준 날짜와 시간을 요구합니다. 여기에선 사용자가 설정한 시간을 기반으로 실제 발표 시간에서 1시간을 빼준 후 이를 API 요청에 사용합니다.
base_date = '20241101' # 발표 일자
base_time = '0700' # 발표 시간
nx = '62' # 예보 지점 x좌표
ny = '123' # 예보 지점 y좌표
input_d = datetime.strptime(base_date + base_time, "%Y%m%d%H%M")
input_d = input_d - timedelta(hours=1)
input_datetime = datetime.strftime(input_d, "%Y%m%d%H%M")
input_date = input_datetime[:-4]
input_time = input_datetime[-4:]
datetime
모듈을 사용하여 날짜와 시간을 계산합니다.- 기상청 API는 요청 시간 기준으로 발표된 시간에서 1시간 전 데이터를 사용하므로 이를 반영해 실제 요청 시간을 설정합니다.
2.5 응답 데이터 처리
API로부터 받은 응답 데이터를 처리하여 딕셔너리 형태로 저장합니다.
res = get_weather_data(input_date, input_time, nx, ny)
if res is None:
exit()
try:
items = res['response']['body']['items']['item']
except KeyError:
print("Error: 응답 데이터에 'item' 키가 없습니다.")
exit()
informations = dict()
for item in items:
cate = item['category']
fcstTime = item['fcstTime']
fcstValue = item['fcstValue']
if fcstTime not in informations.keys():
informations[fcstTime] = dict()
informations[fcstTime][cate] = fcstValue
- 응답 데이터에서 필요한 정보(
item
)를 추출하고, 각 시간대별 예보 정보를 저장합니다.
2.6 풍향 변환 함수 정의
풍향 데이터를 사람에게 익숙한 방향으로 변환하기 위해 deg_to_dir()
함수를 정의합니다.
def deg_to_dir(deg):
if deg in deg_code:
return deg_code[deg]
closest_key = min(deg_code.keys(), key=lambda k: abs(k - deg))
return deg_code[closest_key]
- 풍향 각도를 동서남북 등의 문자열로 변환해줍니다.
2.7 날씨 정보 출력
최종적으로 각 예보 시간대의 날씨 정보를 보기 쉽게 출력합니다.
for key, val in informations.items():
template = f"{input_date[:4]}년 {input_date[4:6]}월 {input_date[-2:]}일 {key[:2]}시 {key[2:]}분 ({int(nx)}, {int(ny)}) 지역의 날씨는 "
if 'SKY' in val:
sky_temp = sky_code.get(int(val['SKY']), '정보 없음')
template += sky_temp + " "
if 'PTY' in val:
pty_temp = pty_code.get(int(val['PTY']), '정보 없음')
template += pty_temp + " "
if 'RN1' in val and val['RN1'] != '0':
rn1_temp = val['RN1']
template += f"시간당 {rn1_temp}mm "
if 'T1H' in val:
t1h_temp = float(val['T1H'])
template += f"기온 {t1h_temp}℃ "
if 'REH' in val:
reh_temp = float(val['REH'])
template += f"습도 {reh_temp}% "
if 'VEC' in val and 'WSD' in val:
vec_temp = deg_to_dir(float(val['VEC']))
wsd_temp = float(val['WSD'])
template += f"풍속 {vec_temp} 방향 {wsd_temp}m/s"
print(template)
for
루프를 통해 각 예보 시간대의 날씨 데이터를 문자열 템플릿 형식으로 출력합니다.
3. 맺음말
이번 포스트에서는 Python을 이용해 기상청 API를 통해 날씨 정보를 가져오는 방법에 대해 알아보았습니다. 데이터를 요청하고, 이를 가공하여 사람이 읽기 쉽게 변환하는 과정을 설명드렸습니다. 이 코드를 통해 특정 지역의 최신 날씨 정보를 얻어 개인 프로젝트나 자동화된 서비스 등에 활용해 보실 수 있습니다.