반응형
전반적인 오류를 수정했다.
수정내용은 아래 코드에서 #으로 추가됨. 혹은 변경됨. 등으로 안내되어 있다.
코드 아래 사진은 동작시 사진으로 잘 동작됨을 확인했다.
from openpyxl import Workbook, load_workbook #xlsx파일 읽는데 필요한 모듈 import
load16 = load_workbook("daily2016.xlsx", data_only = True) #파일로드
load16S = load16['Sheet1'] #파일속 Sheet를 가져옴
load17 = load_workbook("daily2017.xlsx", data_only = True)
load17S = load17['Sheet1']
load18 = load_workbook("daily2018.xlsx", data_only = True)
load18S = load18['Sheet1']
def NewCalc(mon,Num):
if mon == 1:
a = "1월"+ str(Num+1)+"일"
return a
elif mon == 2:
a = "2월"+ str(Num+1)+"일"
return a
elif mon == 3:
a = "3월" +str(Num+1) +"일"
return a
elif mon == 4:
a = "4월" +str(Num+1) +"일"
return a
elif mon == 5:
a = "5월" +str(Num+1) +"일"
return a
elif mon == 6:
a = "6월" +str(Num+1) +"일"
return a
elif mon == 7:
a = "7월" +str(Num+1) +"일"
return a
elif mon == 8:
a = "8월" +str(Num+1) +"일"
return a
elif mon == 9:
a = "9월" +str(Num+1) +"일"
return a
elif mon == 10:
a = "10월" +str(Num+1) +"일"
return a
elif mon == 11:
a = "11월" +str(Num+1) +"일"
return a
elif mon == 12:
a = "12월" +str(Num+1) +"일"
return a
else:
a = "Error"
return a
def Three_min(mon,L):
subL = L
sort_L = sorted(subL)
min1 = subL.index(sort_L[0])
L.remove(sort_L[0])
L.insert(min1, None)
min2 = subL.index(sort_L[1])
L.remove(sort_L[1])
L.insert(min2, None)
min3 = subL.index(sort_L[2])
return (NewCalc(mon, min1),NewCalc(mon,min2),NewCalc(mon, min3))
#모든 데이터들이 들어갈 빈 리스트 생성
all_value16 = []
all_value17 = []
all_value18 = []
#3년 간의 일평균 대기환경 지수 리스트로 가져오기 (all_valueYY) for문 사용
for row in load16S.rows:
row_value = []
for cell in row:
row_value.append(cell.value)
all_value16.append(row_value)
for row in load17S.rows:
row_value = []
for cell in row:
row_value.append(cell.value)
all_value17.append(row_value)
for row in load18S.rows:
row_value = []
for cell in row:
row_value.append(cell.value)
all_value18.append(row_value)
select16 = [] #필요한 데이터. 즉 서대문구의 데이터만 담을 리스트 생성
select17 = [] #필요한 데이터. 즉 서대문구의 데이터만 담을 리스트 생성
select18 = [] #필요한 데이터. 즉 서대문구의 데이터만 담을 리스트 생성
average10 = [] #미세먼지평균 데이터를 넣을 빈리스트
average25 = [] #초미세먼지평균 데이터를 넣을 빈리스트
loc_list = []
for i in range(38):
i = i + 1
loc_list.append(all_value16[i][1])
loc = 'None' #추가됨. 사용자가 입력을 안하고 다른 행동 할 경우 대비.
mon = 0 #추가됨. 사용자가 입력을 안하고 다른 행동 할 경우 대비.
#사용자가 원하는 기능을 계속 사용할 수 있도록 하여 다시 실행하였을 때 생길 파일리딩 시간을 줄임.
while True:
print("1)지역설정")
print("2)달 설정")
print("3)결과 확인")
print("4)프로그램종료")
ans = input("원하시는 기능의 숫자를 입력해주세요 (ex 3):")
#지역설정을 하는 코드
if ans == '1':
print()
loc = input("지역명을 한개만 입력하세요(ex 은평구, 서대문구):")
print("입력완료!")
print()
#loc_list.count가 1 이여야 데이터가 존재하는 지역.
if loc_list.count(loc) != 1 or loc =='None':
print("없는 지역이거나 잘못된 지역명입니다.")
print()
else:
for i in range(len(all_value16)):
if all_value16[i][1] == loc: #원하는 지역인 것만 모아온 것.
select16.append(all_value16[i])
for i in range(len(all_value17)):
if all_value17[i][1] == loc: #원하는 지역인 것만 모아온 것.
select17.append(all_value17[i])
for i in range(len(all_value18)):
if all_value18[i][1] == loc: #원하는 지역인 것만 모아온 것.
select18.append(all_value18[i])
#pm10(미세먼지) 3년간의 일 평균 미세먼지 농도를 가지고 새로운 일 평균 미세먼지 값을 찾는 과정
for i in range(len(select18)):
#None 인 데이터 처리
if select16[i][6] == None:
if select17[i][6] == None:
if select18[i][6] == None:
ans10 = '측정불가'
else:
ans10 = select18[i][6]
else:
if select18[i][6] == None:
ans10 = select17[i][6]
else:
ans10 = (select17[i][6] + select18[i][6]) / 2
else:
if select17[i][6] == None:
if select18[i][6] == None:
ans10 = select16[i][6]
else:
ans10 = (select16[i][6] + select18[i][6]) / 2
else:
if select18[i][6] == None:
ans10 = (select16[i][6] + select17[i][6]) / 2
else:
ans10 = (float(select16[i][6]) + float(select17[i][6]) + float(select18[i][6])) / 3
average10.append(ans10)
#pm25(초미세먼지) 3년간의 일 평균 초미세먼지 농도를 가지고 새로운 일 평균 초미세먼지 값을 찾는 과정
for i in range(len(select18)):
#None 인 데이터 처리
if select16[i][7] == None:
if select17[i][7] == None:
if select18[i][7] == None:
ans25 = '측정불가'
else:
ans25 = select18[i][7]
else:
if select18[i][7] == None:
ans25 = select17[i][7]
else:
ans25 = (select17[i][7] + select18[i][7]) / 2
else:
if select17[i][7] == None:
if select18[i][7] == None:
ans25 = select16[i][7]
else:
ans25 = (select16[i][7] + select18[i][7]) / 2
else:
if select18[i][7] == None:
ans25 = (select16[i][7] + select17[i][7]) / 2
else:
ans25 = (float(select16[i][7]) + float(select17[i][7]) + float(select18[i][7])) / 3
average25.append(ans25)
elif ans == '2':
print()
mon = input("원하는 달을 숫자로 한개만 입력하세요.(ex 10, 1, 2):")
print("입력완료!")
print()
monwant10 = []
monwant25 = []
if len(average25) > 1: #추가됨. 리스트 길이가 1보다 크다는 건 적어도 지역설정이 된 것이므로 그 때에만 슬라이싱 시작.
if mon == '1':
mon = int(mon)
monwant10 = average10[0:31:1]
monwant25 = average25[0:31:1]
elif mon == '2':
mon = int(mon)
monwant10 = average10[31:60:1]
monwant25 = average25[31:60:1]
elif mon == '3':
mon = int(mon)
monwant10 = average10[60:91:1]
monwant25 = average25[60:91:1]
elif mon == '4':
mon = int(mon)
monwant10 = average10[91:121:1]
monwant25 = average25[91:121:1]
elif mon == '5':
mon = int(mon)
monwant10 = average10[121:152:1]
monwant25 = average25[121:152:1]
elif mon == '6':
mon = int(mon)
monwant10 = average10[152:182:1]
monwant25 = average25[152:182:1]
elif mon == '7':
mon = int(mon)
monwant10 = average10[182:213:1]
monwant25 = average25[182:213:1]
elif mon == '8':
mon = int(mon)
monwant10 = average10[213:244:1]
monwant25 = average25[213:244:1]
elif mon == '9':
mon = int(mon)
monwant10 = average10[244:274:1]
monwant25 = average25[244:274:1]
elif mon == '10':
mon = int(mon)
monwant10 = average10[274:305:1]
monwant25 = average25[274:305:1]
elif mon == '11':
mon = int(mon)
monwant10 = average10[305:335:1]
monwant25 = average25[305:335:1]
elif mon == '12':
mon = int(mon)
monwant10 = average10[335:366:1]
monwant25 = average25[335:366:1]
else:
print()
print("잘못입력하셨습니다. 다시 입력해주세요.")
print()
else: #추가됨. 위에 if가 생겼기 때문에 그에 맞지 않는 경우 지역설정을 안한 것으로 간주, 지역설정을 해달라는 메세지 출력.
print()
print("지역설정을 먼저해주세요.")
mon = ''
print()
#지역과 달설정이 되었을 때만 결과를 출력합니다. Three_min(mon,L)함수 사용
elif ans == '3':
if loc_list.count(loc) != 1:
print()
print("없는 지역이거나 잘못된 지역명입니다. 지역설정을 해주세요.") #변경됨. 지역설정이 안됐을 때도 뜨므로 메세지 변경됨.
print()
elif loc =='None':
print()
print('지역명을 먼저 입력해주세요!')
print()
elif mon == 0 or mon =='':
print()
print("달 설정이 되지 않았습니다.")
print()
elif mon <= 12 and mon >= 1: #추가됨. 달 설정이 제대로 되어야만 기능하도록.
print()
print(str(loc)+"지역의 "+str(mon)+"월달 미세먼지가 가장 적은 날은")
print(Three_min(mon,monwant10), end="")
print("이고")
print("초미세먼지가 가장 적은 날은")
print(Three_min(mon,monwant25), end="")
print("입니다.")
print()
else: #아마도 그외에 오류는 원인을 모르기 때문에 처음부터 진행하도록 메세지 출력.
print("오류가 발생했습니다. 지역설정과 달 설정을 다시 해주세요.")
#사용자가 사용을 다 했을때 종료할 수 있도록 만든 코드.
elif ans == '4':
break
#제시한 숫자는 1부터 4까지 이므로 이외의 문자, 숫자(사실상 문자로 입력됨)를 입력하면 다시입력하게 됨.
else:
print()
print("다시 입력해주세요.")
print()
이렇게 하나의 간단한 프로그램이 완성됐다.
기능의 추가는 이제 개인의 몫이다.
필요하다고 생각되는 것들은 추가해도 좋고
뺄건 빼도 좋다.
향후 서울시 실시간 미세먼지 농도 API 사용에 관해 포스팅할 예정인데
그 기능을 넣어도 좋을 것 같다.
사실 이 프로젝트는 이전에 진행된 프로젝트이기 때문에 필자의 경우 API기능까지 구현했다.
그러나 이미 했던 프로젝트여서인지 프로젝트 진행과정을 제대로 보이지 못한것 같아. API까지는 넣지 않았다.
앞으로의 프로젝트는 완성 후 포스팅되지 않을 것이기에 시간도 걸리고 오류도 많을 것이다.
함께 고민하면서 배울 수 있으면 좋겠다.
반응형
'[파이썬]Python > 미세먼지 프로젝트' 카테고리의 다른 글
[Python Project 1.4]미세먼지 예측 프로그램 개발-최솟값3개 찾기 (0) | 2020.07.06 |
---|---|
[Python Project 1.3]미세먼지 예측 프로그램 개발-리스트슬라이싱,날짜계산 (0) | 2020.07.04 |
[Python Project 1.2]미세먼지 예측 프로그램 개발-평균데이터 구하기 (0) | 2020.07.02 |
[Python Project 1.1]미세먼지 예측 프로그램 개발 (0) | 2020.06.29 |