오픈API 데이터 시간 설정

조회수 701회

안녕하세요, 오픈API 데이터를 공부하고 있는중 구글링을 해도 원하는대로 출력이 안되어 질문드립니다. 해당 소스 코드는 해양청에서 제공하고 있는 실측수온코드 입니다. 저는 4시간마다 출력을 하고싶은데요, 요청변수가 아닌 출력값에 record_time이란 변수가 있습니다. 이 변수는 년월일시분초(ex 20200925 08:01:00) 이렇게 포함되어 있어서 datetime.delta로 시도해보았으나, pandas와 호환되지 않은점. 여러 시행착오를 겪어 이렇게 글남깁니다. 해당 코드는 이렇습니다.

import requests import pandas as pd import datetime

url = "http://www.khoa.go.kr/oceangrid/grid/api/tideObsTemp/search.do"

headers = { 'cache-control': "no-cache", 'postman-token': "96839df0-3d9a-c381-b166-2250742a86d8" }

dt_index = pd.date_range(start='20200922', end='20200923') dt_list = dt_index.strftime("%Y%m%d").tolist()

for i in dt_list: date=i querystring = {"ServiceKey":"OHVMK3dF0Ah6K/oIG71f0g==","ObsCode":"DT_0001","Date":date,"ResultType":"json"} response = requests.request("GET", url, headers=headers, params=querystring) print(response.text)

출처:http://www.khoa.go.kr/oceangrid/khoa/takepart/openapi/openApiObsTempTideRealDataInfo.do

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • from pprint import pprint
    
    import requests
    import pandas as pd 
    import datetime
    
    url = "http://www.khoa.go.kr/oceangrid/grid/api/tideObsTemp/search.do"
    
    headers = {
        'cache-control': "no-cache",
        'postman-token': "96839df0-3d9a-c381-b166-2250742a86d8"
        }
    
    dt_index = pd.date_range(start='20200922', end='20200923')
    dt_list = dt_index.strftime("%Y%m%d").tolist()
    
    dat = []
    for i in dt_list:
        date=i
        querystring = {"ServiceKey":"=================","ObsCode":"DT_0001","Date":date,"ResultType":"json"}
        response = requests.request("GET", url, headers=headers, params=querystring)
        #print(response.text)
        #print(response.json())
        dat.extend(response.json()["result"]["data"])
    
    df = pd.DataFrame(dat)
    df.info()
    
    df["record_time"] = pd.to_datetime(df["record_time"])
    df["water_temp"] = df["water_temp"].astype(float)
    
    df.info()
    print(df)
    """
                 record_time  water_temp
    0    2020-09-22 00:00:00        23.5
    1    2020-09-22 00:01:00        23.5
    2    2020-09-22 00:02:00        23.5
    3    2020-09-22 00:03:00        23.5
    4    2020-09-22 00:04:00        23.5
    ...                  ...         ...
    2877 2020-09-23 23:56:00        23.1
    2878 2020-09-23 23:57:00        23.1
    2879 2020-09-23 23:58:00        23.1
    2880 2020-09-23 23:59:00        23.1
    2881 2020-09-24 00:00:00        23.1
    """
    
    
    df4hours = df.set_index("record_time").resample("4H").mean()
    df4hours.info()
    print(df4hours)
    
    """
                             water_temp
    record_time
    2020-09-22 00:00:00   23.355833
    2020-09-22 04:00:00   23.174167
    2020-09-22 08:00:00   23.153333
    2020-09-22 12:00:00   23.393333
    2020-09-22 16:00:00   23.367083
    2020-09-22 20:00:00   23.331250
    2020-09-23 00:00:00   23.302905
    2020-09-23 04:00:00   23.101250
    2020-09-23 08:00:00   23.014583
    2020-09-23 12:00:00   23.150000
    2020-09-23 16:00:00   23.129167
    2020-09-23 20:00:00   23.040833
    2020-09-24 00:00:00   23.100000
    """
    

    response 객체에서 json() 메소드를 쓰면, json 형식의 리턴값이 python dict 로 반환됩니다.

    1. 데이터를 쭉 dat 라는 리스트에 모으고,
    2. 루프를 나와서, 리스트형식의 dat 를 pd.DataFrame 으로 바꾸면 예쁘게 테이블형태의 데이터를 얻어요.
    3. 데이터타입을 각각 datetime, float 으로 바꾸어주고,
    4. 수집시각을 4시간씩 묶어서 처리할 수 있어요. resample 이라는 함수를 사용하고, "4H" 가 4시간이라는 뜻이에요.
    5. resample 을 사용하려면, 시각이 데이터프레임의 index 가 되어야 하기 때문에, set_index 를 사용하고, resample 을 하고, 각 묶인 데이터의 평균을 mean 으로 구합니다.
    • 정말 감사드립니다. ㅠㅠ 알 수 없는 사용자 2020.9.25 13:04
    • 편집요청 수락해 주실 수 있나요? nowp 2020.9.25 13:33
    • 아 네 안그래도 2년치 데이터를 불러왔는데 16시 20시 값은 안불러와지고 중복값이 불러와졌네요 .. 알 수 없는 사용자 2020.9.25 13:42
    • 혹시 편집요청 가능할가요?.. 알 수 없는 사용자 2020.9.27 08:17
    • @gustj258 : 무슨 말씀이신가요? nowp 2020.9.27 13:40
    • 마지막줄에 df4hours.to_excel('excel.xlsx') 이렇게 추가 출력하면 00시 04시 08시 12시 16시 20시 이렇게 출력되는게 아니라 12시 4시 8시 이렇게 반복되서 엑셀로 저장되던데 왜그런건가요?.. 알 수 없는 사용자 2020.9.28 09:08
    • @gustj258 : 원 데이터가 그 시간대가 없는 것 아닐까요. nowp 2020.9.28 09:13
    • 엑셀 시간 설정하니 원본으로 나오네요 감사합니다..ㅠㅠ 알 수 없는 사용자 2020.9.28 15:31
    • 혹시 해양청 데이터말고 다른 기상 데이터 코드도 봐주실수 있나요? 응용해서 코드짰는데 data에 에러가 있다고 하네요 ㅠㅠ; 알 수 없는 사용자 2020.10.7 10:39
    • @gustj258 : 질문을 올리시죠. nowp 2020.10.7 10:49

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)