본문 바로가기
공부공부공부를 합시다/분석을 공부해 봅시다

[데이터 수집] 기상청 종관기상관측(ASOS) API로 수집

by 뻒음 2021. 7. 4.

 

최근에 기상청 데이터를 이용했는데 앞으로 많이 사용할 것 같아 코드를 저장해두려고 합니다.

이 코드는 매년 모든 지역(기상자료개방포털 관측지점정보에서 선택해서 다운로드 한 모든 지역)에 대한 매일의 일자별 ASOS 데이터를 수집하는 코드입니다.

 

 

 

 

 

# 1. 사용 패키지 가져오기

import pandas as pd 
from urllib.request import urlopen 
from urllib.parse import urlencode, unquote, quote_plus 
import requests 
import json 

 

 

# 2. 기상자료개방포털 > 데이터 > 메타데이터 > 지점정보 > 관측지점정보에서 다운로드 한 지점 데이터 불러오기

asos_meta = pd.read_csv('ASOS_META_관측지점정보.csv', encoding='utf8'
asos_meta = asos_meta['지점'].tolist() 

 

 

# 3. 데이터 수집 함수 작성

## ids는 수집할 지역, year은 수집할 연도를 나타내는 변수임

def download_ASOS(ids, year):
    url = 'http://apis.data.go.kr/1360000/VilageFcstInfoService/getUltraSrtNcst'
    key = "사용자 API Key" 

    params = '?' + urlencode({ quote_plus("ServiceKey"): key,  
                                        quote_plus("pageNo"): 1,  
                                        quote_plus("numOfRows"): 366,  
                                        quote_plus("dataType"): "JSON",  
                                        quote_plus("dataCd"): "ASOS",  
                                        quote_plus("dateCd"): "DAY",  
                                        quote_plus("startDt") : str(year) + "0101",  
                                        quote_plus("endDt"): str(year) + "1231",  
                                        quote_plus("stnIds"): ids}) 

 

    req = requests.get(url + unquote(params)) 
    result_data = req.json() 

    items = result_data['response']['body']['items']['item'
    return pd.DataFrame.from_dict(data=items, orient='columns')

 

 

# 4. 데이터를 불러올 DataFrame 생성

## 함수를 한 차례 실행시키고 수집된 데이터의 컬럼들을 데이터프레임의 컬럼으로 넣음

ASOS = pd.DataFrame(columns=download_weather(1082010).columns.tolist()) 

 

 

# 5. 2중 for 문으로 연도별 지역별 ASOS 데이터 수집

## 필요에 따라 첫번째 for문과 두번째 for문의 순서를 변경하여 정렬 순서를 바꿀 수 있음
for year in range(20102021): 
    for no in asos_meta: 
        try
            ASOS = ASOS.append(download_weather(no, year)) 
        except
            continue 

ASOS.to_csv('ASOS.csv', header=True, index=False, encoding='utf8')

 

 

댓글