import requests
import random
from xml.etree import ElementTree as ET
import pandas as pd
# 지역코드
local = {'서울' : '01', '세종' : '02', '부산' : '03', '대구' : '04', '광주' : '05',
'인천' : '06', '대전' : '07', '울산' : '08', '경기' : '09', '강원' : '10',
'충남' : '11', '충북' : '12', '전남' : '13', '전북' : '14', '경남' : '15', '경북' : '16', '제주' : '17'}
# API 키
SKEY = '04ivMBs+T+/URYubuW0VoEysuWeCU4Oj2pts0CujIh1h3rcbtP2XmmgCOmIhHyBRGI1uGJEBhrY0cuac9lHz0w=='
# 산불 데이터 로드
fire_data_path = '2022 전국산불데이터.xlsx' # 파일 경로
fire_df = pd.read_excel(fire_data_path)
# 위도와 경도가 있는 데이터만 필터링
fire_df = fire_df.dropna(subset=['위도', '경도'])
# API URL
url = '<http://apis.data.go.kr/1400377/mtweather/mountListSearch>'
# 결과를 저장할 데이터프레임 초기화
weather_data = []
# 산불 발생 지역에 대한 기상 데이터를 가져오기
for _, row in fire_df.iterrows():
city = row['시']
latitude = row['위도']
longitude = row['경도']
fire_date = row['발생연월일'] # 발생 연월일 (YYYYMMDD 형식)
fire_time = row['발생시'] # 발생 시 (HHMM 형식)
# 발생시에서 초 단위와 ':' 제거 (HH:MM:SS -> HHMM 형식)
fire_time = fire_time.replace(':', '')[:4] # 예: '12:30:45' -> '1230'
tm = str(fire_date) + str(fire_time) # 발생 연월일 + 발생 시간 (YYYYMMDDHHMM 형식)
print(tm)
while True:
c = random.choice(list(local.keys()))
if(c != city):
break
print(city, c)
# API 파라미터 설정
params = {
'serviceKey': SKEY,
'numOfRows': '1000',
'pageNo': '1',
'_type': 'xml',
#'localArea' : '01', #지역 코드 (10: 강원도)
'localArea' : local[c],
'tm': tm # 발생 연월일 + 발생 시간 (YYYYMMDDHHMM 형식)
}
# API 요청
response = requests.get(url, params=params)
# 응답 데이터 처리
if response.status_code == 200:
root = ET.fromstring(response.content)
for item in root.findall('.//item'):
print(item)
weather_data.append({
'시': c,
'산이름': item.find('obsname').text if item.find('obsname') is not None else None,
'관측시간': item.find('tm').text if item.find('tm') is not None else None,
'10m 풍향': item.find('wd10m').text if item.find('wd10m') is not None else None,
'10m 풍속': item.find('ws10m').text if item.find('ws10m') is not None else None,
'2m 풍향': item.find('wd2m').text if item.find('wd2m') is not None else None,
'2m 풍속': item.find('ws2m').text if item.find('ws2m') is not None else None,
'2미터 습도': item.find('hm2m').text if item.find('hm2m') is not None else None,
})
else:
print(f"Failed to retrieve data for {c}: {response.status_code}")
# 기상 데이터프레임 생성
weather_df = pd.DataFrame(weather_data)
output_path = 'non_fire_weather_data.xlsx'
weather_df.to_excel(output_path, index=False, sheet_name='비산불 지역 기상 데이터')