프로그래밍을 하다 보면 다양한 형식의 날짜 문자열을 표준 형식으로 변환해야 하는 경우가 자주 있습니다. 이번 글에서는 "Day Month Year"(일 월 년) 형식으로 작성된 영문 날짜 문자열을 YYYY-MM-DD 형식으로 변환하는 Python 프로그램을 만들어 보겠습니다.
문제 정의
입력으로 주어지는 날짜 문자열은 다음과 같은 조건을 가집니다.
- 일(Day):
1st,2nd, ...,30th,31st처럼 서수 접미사가 붙은 형태 - 월(Month):
Jan,Feb, ...,Nov,Dec처럼 영문 약어 형태 - 연도(Year): 1900부터 2100 사이의 네 자리 숫자
예를 들어 입력이 "23rd Jan 2021"이라면, 출력은 2021-01-23이 되어야 합니다.
해결 접근 방식
이 문제는 다음 단계를 거쳐 해결할 수 있습니다.
- 영문 월 약어 목록을 준비합니다.
Months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] - 날짜 문자열을 공백 기준으로 분할하여
[day, month, year]형태의 리스트를 만듭니다. - 연도(year)는 리스트의 세 번째 요소를 그대로 사용합니다.
- 일(day)은 첫 번째 요소에서 마지막 두 글자(서수 접미사)를 제거하여 추출합니다.
- 일이 한 자리 숫자라면 앞에
"0"을 붙여 두 자리로 만듭니다. - 월(month)은
Months리스트에서 해당 약어의 인덱스를 찾아 숫자로 변환합니다. - 월 역시 한 자리 숫자라면 앞에
"0"을 붙입니다. - 최종적으로
YYYY-MM-DD형식의 문자열을 반환합니다.
Python 구현 예제
위 알고리즘을 실제 코드로 구현하면 다음과 같습니다.
def solve(date):
Months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
string = date.split()
year = string[2]
day = string[0][:-2] # 마지막 두 글자(st, nd, rd, th) 제거
if len(day) < 2:
day = "0" + day # 한 자리 일수는 앞에 0을 붙임
month = str(Months.index(string[1]) + 1)
if len(month) < 2:
month = "0" + month # 한 자리 월은 앞에 0을 붙임
return "{0}-{1}-{2}".format(year, month, day)
date = "23rd Jan 2021"
print(solve(date))실행 결과
입력
"23rd Jan 2021"
출력
2021-01-23
코드 설명
string[0][:-2] 슬라이싱은 문자열 끝의 두 글자를 제거하는 방법으로, 23rd에서 rd를 잘라내어 23만 남깁니다. 월 변환에는 리스트의 index() 메서드를 활용했는데, 인덱스가 0부터 시작하므로 1을 더해 실제 월 숫자(1~12)를 얻습니다.
참고로 실무에서는 Python의 내장 모듈인 datetime을 활용하면 더 간결하게 처리할 수도 있지만, 위 코드처럼 직접 구현하면 문자열 처리와 형식 변환의 원리를 명확히 이해할 수 있다는 장점이 있습니다.