[Python] n월 n주차 구하기

조영훈·2021년 11월 2일
2

특정 연, 월, 일을 입력 받았을 때, 해당 날짜가 해당 월의 몇주차인지 알고 싶을때는 원하는 요일과 해당 월의 시작되는 요일을 빼서 계산을 하면 됩니다.

이 방법은 주차의 시작 요일이 정해져있고, 1주차는 해당 일이 시작되는 주를 조건으로 사용됩니다. 만약 해당 1주차 시작전에 다른 날이 존재한다면 0주차 혹은 이전달의 마지막 주차로 적용됩니다.

예를들어 시작요일이 월요일이면 1일부터 5일까지는 0주차, 6일부터 12일까지 1주차 ... 이런식으로 적용됩니다.

 -  | -  -  1  2  3  4    -> 0 주차
 5  | 6  7  8  9  10 11   -> 1 주차
 12 | 13 14 15 16 17 18   -> 2 주차
 19 | 20 21 22 23 24 25   -> 3 주차
 26 | 27 28 29 30 -  -    -> 4 주차

만약 시작 요일을 수요일로 적용하면 1일부터 7일까지 1주차, 8일부터 14일까지 2주차 ... 이런식으로 적용됩니다.

 -  -  -  | 1  2  3  4    -> 1 주차
 5  6  7  | 8  9  10 11   -> 2 주차
 12 13 14 | 15 16 17 18   -> 3 주차
 19 20 21 | 22 23 24 25   -> 4 주차
 26 27 28 | 29 30 -  -    -> 5 주차
from datetime import datetime # 1
from datetime import timedelta # 2

def week_no(y, m, d):
  """ 연월일을 입력받아 해당 요일의 주차를 얻는 함수

  Args:
      y (int) - 연도
      m (int) - 월
      d (int) - 일

  Return:
      int - 해당 요일의 주
  """
	def _ymd_to_datetime(y, m, d): # 3
          """ 연월일을 입력받아 datetime 객체로 변환하는 함수
          
          Args:
              y (int) - 연도
              m (int) - 월
              d (int) - 일

          Return:
              datetime - YYYY-MM-DD 형식의 datetime 객체
          """
    	s = f'{y:04d}-{m:02d}-{d:02d}'
        return datetime.strptime(s, '%Y-%m-%d')
    
    target_day = _ymd_to_datetime(y, m, d) # 4
    firstday = target_day.replace(day=1) # 5
    while firstday.weekday() != 0: # 6
      firstday += timedelta(days=1)
      
    if target_day < firstday: # 7
      return 0
  
    return (target_day - firstday).days // 7 + 1 # 8

코드의 번호별 설명은 아래와 같습니다.
1. 파이썬의 시간관련 모듈, datetime 객체 사용 및 문자열 변환 함수 사용을 로드
2. datetime 객체에 시간을 더하고 빼는데 사용
3. 입력받은 연, 월, 일 데이터를 YYYY-MM-DD 형식의 datetime 객체로 변환하는 함수
4. 구해야하는 요일, 입력받은 연, 월, 일 데이터를 YYYY-MM-DD 형식의 datetime 객체로 변환
5. 첫 주의 요일을 계산하기위한 해당 월의 첫 날
6. firstday가 첫 주의 시작 요일이 될때까지 하루씩 증가
7. 구해야하는 요일이 첫 주의 시작 요일보다 이전이면 0주차
8. (구해야하는 요일 - 첫날)을 7로(7일) 나누고, 1을 더함(시작이 1주차)

0개의 댓글