별로 안쓸 줄 알았던 날짜 연산 코드가 프로젝트에 가면 심심찮게 많이 사용된다.
그리고 하나의 객체에 대한 날짜 연산 프로그램도 있지만, Series 날짜의 연산도 아주 많이 사용된다.
이번 포스팅에서는 우선 하나의 객체에 대한 날짜 연산 모듈에 대해 알아본다. 그리고 자주 사용하는 월말일자 구하는 모듈도 알아본다.
1. datetime class
datetime 모듈은 가장 많이 사용하는 날짜 연산 모듈이다.
datetime 모듈 안에는 datetime 이라는 같은 클래스가 또 존재한다. 같은 이름의 모듈과 패키지로 헷갈릴 수 있는데, 코드를 최소한으로 줄이기 위해서, 그리고 메모리위에 클래스를 적게 불러오기 위해 datetime class 단위로 불러오도록 한다.
1.1. datetime 모듈로 현재 날짜와 시간 구하기
현재 날짜와 현재 시간을 구할 때에는 다음과 같이 today mathod를 사용한다.
>>> from datetime import datetime, timedelta
>>> datetime.today()
datetime.datetime(2020, 11, 24, 10, 58, 38, 143138)
1.2. 특정 날짜와 시간으로 객체 만들기
우리가 특정한 날짜와 시간을 지정할 수도 있다.
다음과 같이 지정하면 datetime 타입의 객체가 생성된다.
## 일자까지만 지정할 경우
>>> date = datetime(2020, 11, 20)
>>> date ## 시. 분, 초는 0으로 지정됨
datetime.datetime(2020, 11, 20, 0, 0)
## 시간까지 지정할 경우
>>> time = datetime(2020, 11, 20, 10, 10, 10)
>>> time ## 시, 분, 초까지 나옴
datetime.datetime(2020, 11, 20, 10, 10, 10)
※ datetime 객체를 print 하게 될 경우 다음과 같이 출력된다.
>>> print(time)
2020-11-20 10:10:10
1.3. 문자열로 날짜/시간 객체 만들기
보통은 날짜를 문지열 타입으로 지정하는 경우가 많기 때문에 datetime.strptime을 사용해서 날짜 객체로 사용해야 연산을 할 수 있다.
>>> d = datetime.strptime('2020-11-20', '%Y-%m-%d')
>>> d
datetime.datetime(2020, 11, 20, 0, 0)
이 때, %Y는 년, %m는 월, %d는 일을 뜻한다.(대소문자 구분 필수)
1.4. 날짜 객체를 문자열로 만들기
반대로 datetime.strftime을 사용해서 날짜 객체를 문자열로 만들 수 있다.
>>> datetime.strftime(d, '%Y-%m-%d')
'2020-11-20'
>>> datetime.strftime(d, '%Y%m%d')
'20201120'
>>> datetime.strftime(d, '%Y%m%d %H:%M:%S') ## 시간까지 출력
'20201120 00:00:00'
2. timedelta class
timedelta class는 두 날짜와 시간의 차이를 계산할 때 자주 사용한다.
2.1. 날짜 차이 계산하기
2020년 11월 20일에서 10일 전의 날짜를 구해본다.
>>> d = datetime(2020, 11, 20)
>>> d - timedelta(days=10)
datetime.datetime(2020, 11, 10, 0, 0)
2.2. 시간 차이 계산하기
datetime 객체끼리 연산을 하면 timedelta 객체로 결과가 출력된다.
>>> datetime(2020, 11, 13) - datetime(2020, 11, 1)
datetime.timedelta(days=12)
3. calendar
월초는 해당 월 + 01을 입력하면 되지만, 월말의 날짜는 월마다 다르기 때문에 통일시키기 어렵다.
그래서 사용하는 두가지 방법이 있는데,
하나는 다음 달 월초의 하루 전을 계산해서 넣는 방법이 있고
하나는 calendar module을 사용하는 것이다.
>>> datetime(2020, 12, 1) + timedelta(days = -1)
datetime.datetime(2020, 11, 30, 0, 0)
>>> import calendar
>>> calendar.monthrange(2020, 11)
(6, 30)
위처럼 calendar 패키지를 부르고, monthrange(year, month)를 입력하면, tuple 형태가 나온다.
첫번째 원소는 해당 년월의 1일의 요일을 말하고,
두번째 원소는 해당 년월의 마지막 날짜를 말한다.
그렇다면 2020년 11월 1일은 6번째 날 (일요일. 월요일을 0으로 시작)이고, 마지막 날짜는 30일이라는 뜻이다.
※번외.
원래는 월말을 구하는 용으로 calendar를 사용해왔는데 찾다가 재미있는 걸 발견했다.
calendar.calendar(year)를 입력하면 그 해의 달력을 전부 출력한다는 것.
>>> print(calendar.calendar(2020))
2020
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 1 2 1
6 7 8 9 10 11 12 3 4 5 6 7 8 9 2 3 4 5 6 7 8
13 14 15 16 17 18 19 10 11 12 13 14 15 16 9 10 11 12 13 14 15
20 21 22 23 24 25 26 17 18 19 20 21 22 23 16 17 18 19 20 21 22
27 28 29 30 31 24 25 26 27 28 29 23 24 25 26 27 28 29
30 31
April May June
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 1 2 3 1 2 3 4 5 6 7
6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14
13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21
20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28
27 28 29 30 25 26 27 28 29 30 31 29 30
July August September
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 1 2 1 2 3 4 5 6
6 7 8 9 10 11 12 3 4 5 6 7 8 9 7 8 9 10 11 12 13
13 14 15 16 17 18 19 10 11 12 13 14 15 16 14 15 16 17 18 19 20
20 21 22 23 24 25 26 17 18 19 20 21 22 23 21 22 23 24 25 26 27
27 28 29 30 31 24 25 26 27 28 29 30 28 29 30
31
October November December
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 1 1 2 3 4 5 6
5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13
12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20
19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27
26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31
30
참고 사이트
'Code > Python' 카테고리의 다른 글
[Python] pytorch 모델 저장하기 - state_dict() (0) | 2021.01.06 |
---|---|
[Python] isinstance 함수 - 파이썬 자료형 확인하는 함수 (0) | 2021.01.06 |
[Python] enumerate 함수 (0) | 2020.12.31 |
[Python] Colab이란? Colab 구글 드라이브에서 사용하기 (0) | 2020.12.28 |
[python]Series, Dataframe에서 날짜 연산하기 (0) | 2020.11.24 |