날씨 데이터 저장

유현민·2022년 6월 21일
0

공공데이터를 이용해서 저장했다.

중요
api 실행 시 현재 시간 -1일 까지만 조회가 가능했다... 7일치를 모으려면 일주일 동안 매일 데이터를 저장해야함...(이런데서 airflow 이런걸 쓰나...?)

내일은... 공휴일데이터(?) 가져와야지...

이걸 사용했다.
단기예보

앞에서 설명한 부분은 빼고 새로운 부분만 설명

1. 테이블 생성

모든 데이터를 다 넣어줌

2. 현재 시간 필요

하루 전 데이터만 가능해서... 현재 시간 +1을 해서 가져와야했다.

now = datetime.now()

for h in range(now.hour + 1, 24):
    dic = defaultdict(list)
    today = date.today()
    yesterday = date.today() - timedelta(1)

    params = {'serviceKey': '키값',
              'pageNo': '1', 'numOfRows': '1000', 'dataType': 'JSON', 'base_date': f'{yesterday.strftime("%Y%m%d")}',
              'base_time': f'{h}00', 'nx': '60', 'ny': '127'}

3. 확인

4. 부연설명...

초단기실황 조회를 이용했다.
예보는 예상이기 때문에 필요가 없었고 실제 날씨가 중요했다.

5. 전체코드

import json
import requests
import pandas as pd
import pymysql
from sqlalchemy import create_engine
from datetime import date, timedelta, datetime
from collections import defaultdict


engine = create_engine('mysql+pymysql://bike:dbgusals1@localhost:3306/use_bike')
url = 'http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst'
now = datetime.now()

for h in range(now.hour + 1, 24):
    dic = defaultdict(list)
    today = date.today()
    yesterday = date.today() - timedelta(1)
    if h < 10:
        params = {'serviceKey': '키값',
                  'pageNo': '1', 'numOfRows': '1000', 'dataType': 'JSON', 'base_date': f'{yesterday.strftime("%Y%m%d")}',
                  'base_time': f'0{h}00', 'nx': '60', 'ny': '127'}
    else:
        params = {
            'serviceKey': '키값',
            'pageNo': '1', 'numOfRows': '1000', 'dataType': 'JSON', 'base_date': f'{yesterday.strftime("%Y%m%d")}',
            'base_time': f'{h}00', 'nx': '60', 'ny': '127'}

    response = requests.get(url, params=params)
    json_ob = json.loads(response.content)
    json_ar = json_ob.get('response').get('body').get('items').get('item')
    dic['DATE'].append(f'{yesterday.strftime("%Y-%m-%d")}" "{h}')
    for i in json_ar:
        dic[i['category']].append(i['obsrValue'])
    df = pd.DataFrame(dic)
    df.to_sql(name='weather', con=engine, if_exists='append', index=False)

profile
smilegate megaport infra

0개의 댓글