- 개요
ASOS 일(daily) 자료는 기상자료개방포털에서 손쉽게 받을 수 있습니다.
최대 10년치를 한 번에 다운로드 받을 수 있으니 50년치를 받더라도 수작업으로 5번만 다운로드 받으면 되거든요.
하지만 시간(hourly) 자료는 손으로 받기에는 작업량이 너무 많습니다.
그러므로 파이썬 코드를 이용해 기상청 API 허브(https://apihub.kma.go.kr/)에서 ASOS 시간 자료를 받아보고자 합니다.
이번 포스트에서는 기상청 API에서 제공하는 기본 URL을 사용해봅니다.
다음 포스트에서는 이 URL을 변경하고, 일정 기간의 ASOS 자료를 csv 파일로 저장하는 법을 알아보겠습니다.
- API로 ASOS 자료 다운 받기
1. 기상청 API 허브 가입하기
API를 이용해 자료를 다운로드 받으려면 API key가 필요합니다.
사이트에 가입하면 API 키가 발급됩니다. (마이페이지에서 확인 가능)
2. URL 발행
ASOS 자료를 다운 받을 것이므로 좌측의 지상관측을 클릭합니다.
이 버튼을 누르면 기본적으로 ASOS 탭이 열립니다.
다른 관측 자료를 받고 싶으면 원하는 관측 자료 버튼을 눌러주세요.
참고로 API 활용 신청을 해두어야 합니다.
아래 그림의 예시에서는 1. 지상 관측자료 조회의 API 활용신청을 하는 것인데
페이지를 아래로 내려보시면 시간자료(기간조회)의 API 활용이 있습니다.
저는 이 API를 이용할 것입니다.
API 샘플 코드를 누르면 아래와 같은 파이썬 예시 코드가 보입니다.
다음으로 URL 발행 버튼을 눌러봅시다.
전 특정 기간의 자료가 필요한지라 시간 자료 (기간 조회)를 선택했습니다.
필요한 기간(tm1, tm2)과 관측소 정보(stn)를 입력하고 우측 하단의 생성키를 누르면 문자열이 생성됩니다.
(stn을 0으로 설정하면 모든 관측소)
3. 코드 작성
API 샘플 코드에 방금 발행한 URL을 복사 붙여넣기 해주면 끝납니다.
import requests # requests 모듈 임포트
def download_file(file_url, save_path):
with open(save_path, 'wb') as f: # 저장할 파일을 바이너리 쓰기 모드로 열기
response = requests.get(file_url) # 파일 URL에 GET 요청 보내기
f.write(response.content) # 응답의 내용을 파일에 쓰기
# URL과 저장 경로 변수를 지정합니다.
url = 'https://apihub.kma.go.kr/api/typ01/url/kma_sfctm3.php?tm1=201512110100&tm2=201512140000&stn=108&help=1&authKey={본인인증키 입력}'
save_file_path = 'output_file.txt'
# 파일 다운로드 함수를 호출합니다.
download_file(url, save_file_path)
이러면 108번 서울 ASOS(stn)의 2015년 12월 11일 1시(tm1)부터 2015년 12월 14일 00시(tm2) 자료가 받아집니다.
- 문제점
1. 다운 받을 수 있는 최대기한은 30일)
(공식 문서에서 언급된 것은 못 찾았지만 기간을 확장하면 30일까지 받아짐)
긴 기간의 자료를 다운 받기 위해서는 약간의 코딩이 필요합니다.
2. 다운 받은 자료를 바로 읽기에 부적합
아래는 다운 받은 'output_file.txt' 파일의 일부입니다.
단순히 기상 자료 값만 있는 것도 아니며, 결정적으로 이 파일은 바로 pandas로 읽을 수 없습니다.
IX : 유인관측/무인관측 및 일기 포함여부 (code 1860) .. 1,2,3(유인) 4,5,6(무인) / 1,4(포함), 2,5(생략), 3,6(결측)
#--------------------------------------------------------------------------------------------------
#2345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234
# YYMMDDHHMI STN WD WS GST GST GST PA PS PT PR TA TD HM PV RN RN RN RN SD SD SD WC WP WW CA CA CH CT CT CT CT VS SS SI ST TS TE TE TE TE ST WH BF IR IX
# KST ID 16 m/s WD WS TM hPa hPa - hPa C C % hPa mm DAY JUN INT HR3 DAY TOT -- -- ---------------------- TOT MID MIN -------- TOP MID LOW GD C 5 10 20 30 SEA m -- - -
202212012300 108 34 1.9 -9 -9.0 -9 1020.8 1032.0 -9 -9.0 -5.3 -13.1 54.0 2.2 -9.0 -9.0 -9.0 -9.0 -9.0 -9.0 -9.0 -9 -9 - 0 0 -9 - -9 -9 -9 2000 -9.0 -9.00 -9 -3.1 2.2 2.5 3.8 6.0 -9 -9.0 -9 3 -9
다음 포스트에서는 30일보다 더 긴 기간의 자료를 다운 받고 pandas로 읽기 편하게 csv로 저장하는 방법을 알아보겠습니다.
'대기과학 > 프로그래밍' 카테고리의 다른 글
지도에 바람 벡터 그리기 (0) | 2024.06.05 |
---|---|
[기상청 API][ASOS 시간(hourly) 자료 다운로드] 2. 장기간 자료 다운로드 받기 (1) | 2024.05.29 |
관측 자료의 결측을 시각화하기 (0) | 2024.05.22 |
[folium] matplotlib을 활용한 온도 공간 분포 시각화 (0) | 2024.05.14 |
[folium] 지도에 ASOS 관측소 위치 표시하기 (0) | 2024.05.10 |