년도주차 정보와 과거로 돌아갈 주차 정보 2가지를 입력 받아 과거에 몇년도 몇주차인지를 출력하는 함수를 만들어라.
i.e. preWeek(201713,10) 을 하면 2017년도 13주차의 10주전 '201703'를 출력.
# 내용 : 기준이 되는 년도주차 정보와 과거로 돌아갈 주차를 입력 받아 계산한다.
# 파라미터 : fromWeeks, weeksAgo (int 타입, str 타입 무관하게 입력 받음)
# 목적 : i.e (201704,20) 2017년 4주차로부터 20주 전은 언제인가를 계산할 수 있다.
# Step 0: isoweek 모듈을 불러온다.
# Step 1: 입력 받은 년도주차 정보와 과거주 정보를 문자 캐스팅 해서 분리한 다음 계산을 위해 다시 int 캐스팅.
# Step 2: 과거 년도로 돌아가지 않는 경우를 분리하여 계산.
# Step 3: 주차 자릿수가 1자리로 줄어드는 경우에 대한 보정 로직.
# Step 4: 과거 년도로 돌아가는 경우를 분리하여 계산.
# Step 5: 1년 더 과거로 가야할 지 계산. 조건을 만족하지 않을 때까지 1년씩 과거로 이동.
# Step 6: 위 Step 3.에서 했던 보정을 동일하게 적용하여 결과 산출.
# Step 7: 최종 결과 result 값을 반환.
# cf. Step 3.1 은 if문 없이 str(inputWeeks - weeksAgo).zfill(2)로 자릿수 보정 가능. Step 6도 마찬가지.
def preWeek(fromWeek,weeksAgo):
#fromWeek = 201720
#weeksAgo = 100 # 10이면 201710, 20이면 201652, 21이면 201651, 71이면 201601, 72면 201553, 124면 201501
# 125면 201452, 176이면 201401, 177이면 201352, 228이면 201301, 229면 201252, 1000이면 199812
# 가 나오면 된다.
# Step 0. isoweek 모듈을 불러온다.
from isoweek import Week
# Step 1. 년도, 주차 분리를 위해 문자 캐스팅 해서 분리한 다음 모든 변수 int 캐스팅
inputYear = int(str(fromWeek)[:4])
inputWeeks = int(str(fromWeek)[4:])
weeksAgo = int(weeksAgo)
# Step 2. 기준 주차 > 과거로 돌아가려는 주 (년도가 바뀌지 않는 경우임.)
if inputWeeks - weeksAgo > 0:
# Step 3. (기준 주차 - 과거 주) >= 10이면 연도와 (기준 주차 - 과거 주)를 문자열 캐스팅 한 다음 더한다.
if inputWeeks - weeksAgo >= 10:
result = str(inputYear) + str(inputWeeks - weeksAgo)
else: # Step 3.1 계산한 주차가 한자리수로 작아질 경우 앞에 0을 붙여서 보정한다.
result = str(inputYear) + "0" + str(inputWeeks - weeksAgo)
# Step 4. 과거 년도로 가는 경우.
else:
remainWeeks = weeksAgo - inputWeeks # 마이너스 인덱싱 타임머신 여행할 횟수 계산.
inputYear -= 1 # inputWeeks만큼 빼고 1년 전으로 이동했으니 -1년을 해주고 시작.
maxWeeks = Week.last_week_of_year(inputYear).week # 해당 년도에 주차가 몇이나 되는지 확인.
while remainWeeks >= maxWeeks: # Step 5. 과거로 돌아갈 횟수가 해당 년도 주차보다 크다면 1년씩 반복해 과거로 이동.
remainWeeks -= maxWeeks
inputYear -= 1
maxWeeks = Week.last_week_of_year(inputYear).week
else:
pass
maxWeeks -= remainWeeks # 과거로 이동이 끝난 주차가 계산됨.
# Step 6. Step 3.1 에서 했던 주차 자릿수 보정을 동일하게 해준다.
if maxWeeks >= 10:
result = str(inputYear) + str(maxWeeks)
else:
result = str(inputYear) + "0" + str(maxWeeks)
# Step 7. 최종 결과 반환
return result
결과 :
preWeek(201720,71) = '201601'
preWeek(201720,72) = '201553'
preWeek(201720,100) = '201525'
preWeek(201720,1000) = '199812'
이를 그림으로 표현하면 이런 개념이다.
하지만 위에 짠 코드는 지금까지 설명과는 1씩 차이가 난다. 이유는 코드를 짜기 편하게 하기 위해 평행이동을 시켜 시작을 zeoro base로 만들었기 때문이다. 이게 왜 가능한지는 아래에 설명한다.
제로베이스로 하지 않고 19만 뺀 다음 81번째를 찾은 코드를 아래 추가한다. 위에 코드랑 비교해보자.
더보기
# 내용 : 기준이 되는 년도주차 정보와 과거로 돌아갈 주차를 입력 받아 계산한다.
# 파라미터 : fromWeeks, weeksAgo (int 타입, str 타입 무관하게 입력 받음)
# 목적 : i.e (201704,20) 2017년 4주차로부터 20주 전은 언제인가를 계산할 수 있다.
# Step 0: isoweek 모듈을 불러온다.
# Step 1: 입력 받은 년도주차 정보와 과거주 정보를 문자 캐스팅 해서 분리한 다음 계산을 위해 다시 int 캐스팅.
# Step 2: 과거 년도로 돌아가지 않는 경우를 분리하여 계산.
# Step 3: 주차 자릿수가 1자리로 줄어드는 경우에 대한 보정 로직.
# Step 4: 과거 년도로 돌아가는 경우를 분리하여 계산.
# Step 5: 1년 더 과거로 가야할 지 계산. 조건을 만족하지 않을 때까지 1년씩 과거로 이동.
# Step 6: 위 Step 3.에서 했던 보정을 동일하게 적용하여 결과 산출.
# Step 7: 최종 결과 result 값을 반환.
# cf. Step 3 은 if문 없이 str(inputWeeks - weeksAgo).zfill(2)로 자릿수 보정 가능. Step 7도 마찬가지.
def preWeek(fromWeek,weeksAgo):
#fromWeek = 201720
#weeksAgo = 100 # 10이면 201710, 20이면 201652, 21이면 201651, 71이면 201601, 72면 201553, 124면 201501
# 125면 201452, 176이면 201401, 177이면 201352, 228이면 201301, 229면 201252, 1000이면 199812
# 가 나오면 된다.
# Step 0. isoweek 모듈을 불러온다.
from isoweek import Week
# Step 1. 년도, 주차 분리를 위해 문자 캐스팅 해서 분리한 다음 모든 변수 int 캐스팅
inputYear = int(str(fromWeek)[:4])
inputWeeks = int(str(fromWeek)[4:])
weeksAgo = int(weeksAgo)
# Step 2. 기준 주차 > 과거로 돌아가려는 주 (년도가 바뀌지 않는 경우임.)
if inputWeeks - weeksAgo > 0:
# Step 3. (기준 주차 - 과거 주) >= 10이면 연도와 (기준 주차 - 과거 주)를 문자열 캐스팅 한 다음 더한다.
if inputWeeks - weeksAgo >= 10:
result = str(inputYear) + str(inputWeeks - weeksAgo)
else: # Step 3.1 계산한 주차가 한자리수로 작아질 경우 앞에 0을 붙여서 보정한다.
result = str(inputYear) + "0" + str(inputWeeks - weeksAgo)
# Step 4. 과거 년도로 가는 경우.
else:
remainWeeks = weeksAgo - (inputWeeks - 1) # 마이너스 인덱싱 타임머신 여행할 횟수 계산. # 다른 부분.
inputYear -= 1 # inputWeeks만큼 빼고 1년 전으로 이동했으니 -1년을 해주고 시작.
maxWeeks = Week.last_week_of_year(inputYear).week # 해당 년도에 주차가 몇이나 되는지 확인.
while remainWeeks >= maxWeeks: # Step 5. 과거로 돌아갈 횟수가 해당 년도 주차보다 크다면 1년씩 반복해 과거로 이동.
remainWeeks -= maxWeeks
inputYear -= 1
maxWeeks = Week.last_week_of_year(inputYear).week
else:
pass
maxWeeks -= remainWeeks # 과거로 이동이 끝난 주차가 계산됨.
# Step 6. Step 3.1 에서 했던 주차 자릿수 보정을 동일하게 해준다.
if maxWeeks >= 10:
result = str(inputYear) + str(maxWeeks + 1) # 다른 부분.
else:
result = str(inputYear) + "0" + str(maxWeeks + 1) # 다른 부분.
# Step 7. 최종 결과 반환
return result
깔끔한 예제 추가... 그냥 마이너스를 더한다고 생각했으면 더 쉬웠을걸 왜 생각 못 했지... ㅠㅠ
preWeek 이전 주차 구하기
def preWeek(yearWeek, preWeek): # preWeek 이전 주차를 반환하는 함수
from isoweek import Week
yeardigit = -2
inputYear = int(str(yearWeek)[:yeardigit]) #년도만 잘라서 저장
inputWeek = int(str(yearWeek)[yeardigit:]) #주차만 잘라서 저장
resultWeek = inputWeek - preWeek #현 주차 - 뒤로 갈 주차 계산결과
while(resultWeek<=0): # 주차가 0 이하라면
inputYear = inputYear-1 # 년도가 하나 줄어듭니다
calcWeek = Week.last_week_of_year(inputYear).week #줄어든 년도의 총 주차수
resultWeek = calcWeek + resultWeek
#총 주차수에 resultWeek 을 더해줍니다. (0 또는 음수일테니까)
#더했는데도 0 또는 음수라면 양수가 될 때까지 반복됩니다.
# if(resultWeek<10):
# resultWeek = "0"+str(resultWeek) # 1자릿수면 앞에 0을 붙여줌 -> zfill()로 처리.
result = str(inputYear)+str(resultWeek).zfill(2) #년도와 주차를 문자열로 더해서 출력
return result
postWeek 이후 주차 구하기
def postWeek(yearWeek, postWeek): #postWeek 이후 주차를 반환하는 함수
from isoweek import Week
yeardigit = -2
inputYear = int(str(yearWeek)[:yeardigit]) #년도만 잘라서 저장
inputWeek = int(str(yearWeek)[yeardigit:]) #주차만 잘라서 저장
resultWeek = inputWeek + postWeek #현 주차 + 뒤로 갈 주차 계산결과
calcWeek = Week.last_week_of_year(inputYear).week
while(resultWeek>calcWeek): # 주차가 넘어간다면
inputYear = inputYear+1 # 년도가 하나 늘어납니다
calcWeek = Week.last_week_of_year(inputYear).week #늘어난 년도의 총 주차수
resultWeek = resultWeek - calcWeek
#resultWeek 에서 총 주차를 빼줍니다
#결과가 아직도 총 주차보다 크다면 작아질때까지계속 반복
# if(resultWeek<10):
# resultWeek = "0"+str(resultWeek) # 1자릿수면 앞에 0을 붙여줌 -> zfill()로 처리.
result = str(inputYear)+str(resultWeek).zfill(2) #년도와 주차를 문자열로 더해서 출력
return result
'개발자 > Python' 카테고리의 다른 글
Python (파이썬) 웹 크롤링 에러 SSLCertVerificationError (0) | 2020.04.11 |
---|---|
Python (파이썬) Mac, Linux에서 psycopg2 설치 에러 해결하기 (최종) (0) | 2020.04.10 |
Python (파이썬) Escape Sequences (0) | 2020.03.29 |
Python (파이썬) 문자열 분리하기 (0) | 2020.03.25 |
Python (파이썬) import datetime 시스템 시간 가져오기 (0) | 2020.03.25 |