import os import pandas as pd import requests from datetime import datetime, timedelta from io import StringIO # https://apihub.kma.go.kr/ 참고 weather_api_columns = [ "관측시각", "지점번호", "풍향", "풍속", "돌풍향", "돌풍속", "돌풍속_관측_시각", "현지기압", "해면기압", "기압변화경향", "기압변화량", "기온", "이슬점_온도", "상대습도", "수증기압", "강수량", "위_관측시간까지의_일강수량", "위_관측시간까지의_일강수량(전문)", "강수강도", "3시간_신적설", "일_신적설", "적설", "GTS_현재일기", "GTS_과거일기", "국내식_일기코드", "전운량", "중하층운량", "최저운고", "운형", "GTS_상층운행", "GTS_중층운행", "GTS_하층운행", "시정", "일조", "일사", "지면상태_코드", "지면온도", "5cm지중온도", "10cm지중온도", "20cm지중온도", "30cm지중온도", "해면상태_코드", "파고", "Beaufart_최대풍력", "강수자료", "유인관측/무인관측" ] def generate_dates(start_date, end_date): current_date = datetime.strptime(start_date, '%Y%m%d%H%M') end_date = datetime.strptime(end_date, '%Y%m%d%H%M') list_of_days = [] while current_date <= end_date: list_of_days.append(current_date.strftime('%Y%m%d%H%M')) current_date += timedelta(days=1) return list_of_days def call_administration_of_weather_api(start_date, end_date, stn=281): # 281 == 영천 headers = { 'Content-Type': 'application/json' } # 이거 기상청 api가 조금 많이 이상해서 해더가 실제로 작동하지 아니하고 json 대신 그냥 txt 로 반환됩니다. auth = "umD2O5RRRSOg9juUUcUjvw" url = (f'https://apihub.kma.go.kr/api/typ01/url/kma_sfctm3.php?' f'tm1={start_date}&tm2={end_date}&stn={stn}&authKey={auth}') # API URL 설정 response = requests.get(url, headers=headers) # GET 요청 return response.text if __name__ == "__main__": start = '202007010000' end = '202308010000' date_lists = generate_dates(start, end) df_weather = pd.DataFrame() k = 24 for i, date in enumerate(range(0, len(date_lists)-1, k)): if date+k <= len(date_lists): end_day = date+k else: end_day = len(date_lists) - 1 text = call_administration_of_weather_api(date_lists[date], date_lists[end_day]) buffer = StringIO(text) df = pd.read_csv(buffer, skiprows=2, skipfooter=1, sep=r"\s+", header=None, index_col=False, engine="python").iloc[2:,:-1] df_weather = pd.concat([df_weather, df], ignore_index=True) print(f"{i}/{len(range(0, len(date_lists) - 1, k))-1}") df_weather = df_weather.set_axis(weather_api_columns, axis=1) df_weather.to_csv(f"{start}_{end}.csv", index=False)