이번 포스팅부터, Python의 표준 라이브러리의 자주 사용하는 기능들에 대해 하나씩 알아보려 한다. 그 중 첫 번째로 소개할 라이브러리는, Python에서 날짜와 시간을 출력하도록 만들어주는 datetime.py다.
모든 Python의 내장 라이브러리는 Python 폴더의 Lib 폴더에 저장되어 있다. 그리고 이 폴더 내에 datetime.py 문서를 에디터로 열어보면, 아래와 같이 datetime.py 내에 정의되어 있는 날짜/시간 관련 변수, 함수 및 클래스들을 확인할 수 있다.
** 에디터로 파일을 열면, 내용이 많아 어떤 함수와 클래스가 존재하는지 한 눈에 파악하기가 힘들다. 따라서, Python의 인터렉티브 모드로 진입하여, datetime 파일을 import 하고 dir(datetime)을 입력하면, datetime.py에 정의된 함수와 클래스 명을 리스트 형태로 확인할 수 있다.
인터렉티브 모드에서 datetime에서 사용가능한 함수와 클래스가 생각 외로 적다는 느낌이 드는데, 그 이유는 자주 사용하는 기능 함수들이 datetime 클래스 내의 함수에 따로 저장되어 있기 때문이다. datetime.py 문서를 에디터로 열어보면, 1509번째 줄에, datetime이라는 이름의 클래스가 정의된 내용이 보이는데, 이 클래스 내에 정의된 함수들이 대부분의 날짜와 시간을 출력해주는 기능을 가지고 있다.
인터렉티브 모드에서, datetime.py 파일 내용 중, datetime 클래스 내용만 import 하고, 다시 dir(datetime)을 입력하면, datetime 클래스에 정의된 함수명 목록이 쭉 출력된다.
이제, datetime.py의 datetime 클래스 내의 함수를 이용해 시간 출력과 관련된 기능에 대해 하나씩 알아보자.
1. today(), now() 함수
today() 또는 now() 함수는, 이름에서도 알 수 있듯이, 현재의 날짜와 시간을 출력해주는 함수다. 이 함수는 인자를 따로 입력할 필요가 없으며, 출력값은 년, 월, 일, 시, 분, 초 등을 datetime의 튜플 형식으로 돌려준다.
2. date(), time() 함수
today()와 now()함수로 출력된 내용은, 날짜와 시간을 모두 포함하는 정보다. Python 코딩을 진행하다보면, 날짜와 시간을 따로 분리해야 할 필요성이 있는데, 이 때 사용하는 함수가 date(), time() 함수다. 이 두 함수는 datetime.today()와 now() 함수의 출력값을 참조하여, 이들 값을 날짜와 시간만 분리하여 다시 datetime 튜플 형태로 돌려주는 기능을 가지고 있다.
3. year(), month(), day(), hour(), minute(), second(), microsecond() 함수
그런데, 우리는 이렇게 datetime 튜플 형식으로 날짜와 시간을 돌려받아봤자, 이를 제대로 활용할 수가 없다. 대부분 사람들이 사용하는 날짜와 시간의 형태는 yyyy-mm-dd hh:MM:ss이기 때문에, 연, 월, 일과 같이 각각의 항목에 대해 변수를 만들고 값을 지정해야 할 필요가 있다. 이 때 사용하는 함수들이 바로 위에 표현한 year()를 위시한 7개 함수이다.
특이하게도 이 함수들은, 함수이긴 하나 함수 호출 형태를 사용하는 일반적인 형식과 조금 다른 방식으로 사용된다. 일반적인 함수의 경우, 함수명 뒤에 괄호()를 붙여 함수를 호출하는 반면, 이 7개 함수는 괄호() 없이 호출한다는 차이점이 있다. 그 이유는 이 함수들이 클래스 내부 변수를 읽기만 가능하도록 만들어주는 @property라는 속성이 붙어있기 때문이다(이 부분에 대해서는 나중에 따로 포스팅을 진행하려 한다).
따라서, 각 항목에 맞는 날짜, 시간 값을 출력하려면, 아래와 같이 코드를 작성해주면 된다.
이들을 변수로 지정하여 str 형식으로 yyyy-mm-dd 형태의 날짜를 출력하는 것은 아래와 같이 진행해주면 된다.
4. isoformat() 함수
그런데, 이런 식으로 일일이 변수를 지정하고, 이를 문자열로 포맷팅하여 출력하는 것은 여간 번거로운 작업이 아니다. 따라서 Python의 datetime.py에서는 튜플 형태의 날짜 형식을 국제적으로 공인된 형태의 날짜/시간 문자열로 변경해주는 함수를 정의해 놓았다. 바로 isoformat() 함수가 그것인데, 사용법은 위의 date(), today() 함수와 동일하다.
5. strftime(), strptime() 함수
isoformat() 함수의 경우, 공인된 날짜/시간 형식을 받기에는 아주 유용하지만, 우리가 일상에서 사용하는 날짜/시간의 형식이 항상 공인된 형식만을 따르지는 않는다. 그런다고, 3번의 항목에서 소개한대로 일일이 변수를 넣고 값을 지정하는 방법 역시, 너무나 손이 많이 간다. 따라서, Python에서는 datetime 튜플 형태를 프로그래머가 원하는 형태의 문자열로 변경할 수 있는 strftime() 함수를 제공한다.
strftime() 함수는 하나의 인자를 가지며, 사용법은 다음과 같다.
----------------------------------------------------------
datetime.today().strftime("{날짜 옵션 및 형식 입력}")
----------------------------------------------------------
strftime() 함수 내에서 사용할 수 있는 옵션은 아래와 같다.
%Y : 년도 출력
%m: 월 출력
%d: 일 출력
%H: 시 출력
%M: 분 출력
%S : 초 출력
참고로, 각 옵션들은 대/소문자를 구분하야 하며, 이 옵션을 이용해, 현재의 날짜를 원하는 형태의 포맷으로 출력할 수 있다. 필자는 yyyy/mm/dd HH:MM:ss로 출력하려고 한다.
반면, strptime() 함수는 문자열로 작성된 날짜를 datetime의 튜플 형태로 돌려주는 역할을 한다. "아니, 왜 굳이 힘들게 문자열로 만들어 놓은 것을 다시 datetime 형식의 튜플로 되돌리는가요?" 라고 물으실 수 있는데, 뒤에 설명할 timedelta 클래스 내용과 연결되니 우선 이렇게 역으로 날짜/시간을 변형하는 것도 가능하다는 것을 알아두자.
strptime() 함수는 두 개의 인자를 사용한다. 하나는 문자열 형태의 날짜, 그리고 다른 하나는 컴퓨터가 해당 날짜를 잘 인식할 수 있도록 만드는 strftime에서 사용한 옵션 문자열이다. 필자는 아까 만든 문자열 형태의 날짜/시간을 다시 datetime 튜플로 되돌리려 한다.
strptime() 함수로 출력된 날짜 포맷이 datetime 형태의 클래스로 나타남을 알 수 있다.
6. weekday() 함수
weekday() 함수는 요일을 출력해주는 함수다. 그러나, 우리가 알고 있는 "월요일" 또는 "Monday"와 같은 문자열 형식이 아니라, 정수로 출력값이 돌아오는 함수다.
weekday() 함수의 출력값은 datetime.py 내에 weekday()에 대해 정의된 부분에 자세히 나와있다. 리눅스의 crontab을 사용할 줄 아시는 분들이라면, 아마 익숙한 내용일 것이다.
즉, 월요일이면 0, 화요일이면 1, 수요일이면 2가 결과값으로 반환되며, 마지막 날인 일요일은 6으로 반환된다는 말이다. 이를 우리가 아는 형태의 요일로 작성하기 위해서는, 번거롭지만 리스트나 튜플을 따로 만들어야만 한다.
weekday()와 유사한 함수로, isoweekday() 함수도 존재하는데, 이 함수는 요일에 따라 반환되는 값이 weekday()함수와는 조금 다르다. 월요일이 1, 화요일이 2며, 일요일은 7이 반환된다.
7. 두 날짜 사이의 일수 계산하기 및 timedelta() 클래스
** datedelta() 클래스는 datetime.py 내에 작성되어 있는 클래스다. 따라서 import 시, from datetime import datetime 과 함께 사용하기 위해서, from datetime import timedelta 를 코드에 넣어주어야 한다.
연애를 하시는 분들이라면, 우리가 오늘로 사귄 날짜가 몇일이 되었는지 확인해야 할 때가 종종 있을 것이다. 특히 남자의 경우라면, 100일 200일 300일 기념일을 놓쳐 쿠사리(?)를 먹는 경우가 많은데, Python 개발자들도 아마 이 때문에 고생을 조금 많이 했는지, 아주 간편한 방식으로 특정 두 날짜 사이의 시간 간격을 확인할 수 있도록 만들어 놓았다.
datetime 형식의 날짜 두 개를 임의로 지정해보자. 하나는 오늘 날짜, 그리고 하나는 올해의 새해 날짜로. 그리고 오늘 날짜가 1월 1일부터 며칠이나 지났는지 확인해보자. 확인 방법은 다음과 같다.
현충일인 오늘의 날짜는 새해로부터 157일이 지난 날짜이다. 그런데, today - new_day의 결과를 보면, 특이하게도 timedelta라는 형태가 출력된 것이 보인다.
이 timedelta는 날짜를 계산할 때 사용되는 클래스인데, 위의 예시처럼 두 날짜 사이의 간격을 확인하는 것 뿐만 아니라, 오늘 날짜로부터 200일 뒤의 날짜가 며칠인지 등, 날짜와 관련된 계산에 특화된 녀석라고 보면 된다.
예를 들어, 오늘로부터 200일 뒤의 날짜를 알아보기 위해 timedelta를 사용한다면, 아래와 같이 사용할 수 있다.
timedelta() 내에 사용하는 인자(옵션)는 days 외에도 시간, 분 등이 추가될 수 있다. 각 항목에 사용하는 옵션명은 아래와 같다.
days: 날짜
seconds: 초
microseconds = 마이크로초(0.001)
milliseconds = 밀리초(0.000001)
minutes = 분
hours = 시간
weeks = 주
Python을 접한지 얼마 안 된 분들의 대부분이, 시간과 관련된 함수를 많이 사용하지 않을 것이라 생각하는데, datetime은 은근히 사용되는 곳이 많다. 예를 들어, 보통 하나의 프로그램을 제작할 때, 프로그램 사용자의 사용 내역을 기록하거나, 특정 사용자가 프로그램에 로그인 하기 위해 필요한 비밀번호의 변경 주기(보통 90일이다)를 설정하는 작업 등에 많이 사용된다.
다음 포스팅에서는 time 라이브러리의 자주 사용하는 기능에 대해 포스팅을 진행하려 한다.
FIN.
'Python > Python Advanced' 카테고리의 다른 글
6. Python - os 모듈: chdir(), listdir(), getcwd() 함수 (0) | 2020.08.17 |
---|---|
5. Python - OS 모듈, system() 함수 (0) | 2020.07.01 |
4. Python - time 모듈 (0) | 2020.06.08 |
2. Python - pip를 이용한 외부 패키지 설치, 삭제 (0) | 2020.06.04 |
1. Python - 패키지?? 표준 라이브러리?? (0) | 2020.06.03 |
댓글