반응형

전반적인 오류를 수정했다.

수정내용은 아래 코드에서 #으로 추가됨. 혹은 변경됨. 등으로 안내되어 있다.

코드 아래 사진은 동작시 사진으로 잘 동작됨을 확인했다.

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까지는 넣지 않았다.

 

앞으로의 프로젝트는 완성 후 포스팅되지 않을 것이기에 시간도 걸리고 오류도 많을 것이다.

함께 고민하면서 배울 수 있으면 좋겠다.

 

반응형
Dvlp.Jun