
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
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)