본문 바로가기
python

파이썬3.6 [datetime] 날짜 시간 처리 모듈

by 이농이능 2018. 2. 22.

파이썬3.6 에서 날짜와 시간을 제공하는 datetime 모듈이 있다. 날짜 및 시간 계산을 지원한다. 


* Available Type

datetime.date         # 날짜만 저장

datetime.time         # 시간만 저장

datetime.datetime   # 날짜와 시간을 저장

datetime.timedelta  # 시간 구간 정보

datetime.tzinfo       # 두 날짜, 시간 또는 날짜 시간의 인스턴스 객체 간 차이를 마이크로 초 해상도로 나타내는 기간

datetime.timezone  # tzinfo 추상 기본 클래스를 UTC의 고정 offset으로 구현하는 클래스 



6가지의 타입 중 현재 진행중인 프로젝트에서 필요한 timedeltadatedatetime 클래스를 공부해보면서 정리를 해보았다.

출처 : python 3.6 datetime 공식문서 




1. datetime.timedelta Object

class datetime.timedelta(days=0seconds=0microseconds=0milliseconds=0minutes=0hours=0weeks=0)

: 날짜나 시간 사이의 구간을 나타낸다.  timedelta에 들어갈 수 있는 인자값은 아래와 같다.


1주 : datetime.timedelta(weeks=1)
1일 : datetime.timedelta(days=1)
1시간 : datetime.timedelta(hours=1)
1분 : datetime.timedelta(minutes=1)
1초 : datetime.timedelta(seconds=1)
1밀리초 : datetime.timedelta(milliseconds=1)
1마이크로초 : datetime.timedelta(microseconds=1)


▶ 가능한 연산


Operation

 

timedelta1 = timedelta2 + timedelta3 

 

 t1 = t2 - t3

 

 t1 = t2 * integer or t1 = integer * t2

 

 t1 = t2 * float or t1 = float * t2

 

 float = t2/ t3

 

 t1 = t2 / float or t1 = t2/ int

 

 t1 = t2 // i or t1 = t2 // t3

 나머지를 버림

 t1 = t2 % t3

 

 q,r = divmod( t1, t2 )

 q = t1 // t2 , t = t1 % t2

 abs( t ) 

 절대값 리턴. 음수일 경우에 - t 한 값이 리턴됨 

 str( t )

 [D day[s], ][H]H:MM:SS[.UUUUUU] 형식으로 문자열 리턴

 repr( t )

 공식적인(official) 문자열을 출력


* repr() 은 __repr__ 메소드를 호출하고 str()은 __str__ 메소드를 호출하도록 되어있는데 __str__는 객체의 비공식적인(informal) 문자열 출력할 때 사용하고 , __repr__ 는 공식적인(official) 문자열을 출력할 때 사용한다. 쉽게 말하면 __str__는 사용자가 보기 쉬운 형태로 보여줄 때 사용하고 __repr__는 시스템(python interpreter)이 해당 객체를 인식할 수 있는 공식적인 문자열로 나타낼 때 사용한다. 



▶ 사용예시 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> from datetime import timedelta
>>> year = timedelta(days=365)
>>> another_year = timedelta(weeks=40, days=84, hours=23,
...                          minutes=50, seconds=600)  # 다 더하면 365 일
>>> year.total_seconds() # 날짜를 초단위로 계산해주는 함수
31536000.0
 
>>> year == another_year
True
 
>>> ten_years = 10 * year
>>> ten_years, ten_years.days // 365   
(datetime.timedelta(days=3650), 10)
 
>>> nine_years = ten_years - year # 10년 - 1년
>>> nine_years, nine_years.days // 365
(datetime.timedelta(days=3285), 9)
 
>>> three_years = nine_years // 3 
>>> three_years, three_years.days // 365
(datetime.timedelta(days=1095), 3)
 
>>> abs(three_years - ten_years) == 2 * three_years + year  # 절대값(3 - 10) = 7년 -> 7년 == 2*3년 +1 -> 7년 == 7년 같음
True
cs






2. datetime.date Object


class datetime.date(yearmonthday)

 : 년도, 월, 일 의 날짜를 나타낸다.



▶ 가능한 연산


Operation

 date2 = date1 + timedelta

 date2 = date - timedelta

 timedelta = date1 - date2

 date1 < date2 




▶ 사용 예시



1. 오늘 날짜 구하기 및 응용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> import time
>>> from datetime import date
 
>>> today = date.today() # 오늘 날짜 리턴
>>> today
datetime.date(20180221)
 
>>> today == date.fromtimestamp(time.time()) # date.today()와 같은 값 
True
 
>>> my_birthday = date(today.year, 326)
>>> if my_birthday < today:   # 생일(2018-03-26) > 오늘(2018-02-21) 이기 때문에
...     my_birthday = my_birthday.replace(year=today.year + 1# 내년으로 고치지 않음
>>> my_birthday
datetime.date(2018326)
 
>>> time_to_birthday = abs(my_birthday - today)  # 생일까지 남은 날을 계산
>>> time_to_birthday.days  
33
cs



 

2. date 객체 활용


>>> from datetime import date

 ◎ date - date 연산 


1
2
3
4
>>> startDate = date(1994,3,26)
>>> endDate = date(2018,02,21)
>>> print(endDate-startDate)
8733 days, 0:00:00
cs



 classmethoddate.fromordinal(ordinal)


1
2
3
>>> d = date.fromordinal(736746# 736746th day after 1. 1. 0001
>>> d
datetime.date(2018221)
cs





 instance method)date.timetuple()


: struct_time 클래스 객체 리턴


class time.struct_time 

time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1)) 와 같음


* struct_time 클래스 

Index

Attribute

Values

0

tm_year

(for example, 1993)

1

tm_mon

range [1, 12]

2

tm_mday

range [1, 31]

3

tm_hour

range [0, 23]

4

tm_min

range [0, 59]

5

tm_sec

range [0, 61]; see (2) in strftime()description

6

tm_wday

range [0, 6], Monday is 0

7

tm_yday

range [1, 366]

8

tm_isdst

0, 1 or -1; see below

N/A

tm_zone

abbreviation of timezone name

N/A

tm_gmtoff

offset east of UTC in seconds


* 사용 예시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> t = d.timetuple()
>>> for i in t:
...     print(i)
... 
2018    # year
2       # month
21      # day
0
0
0
2        # weekday ( 0 = Monday) 
52       # 그 해 52번째 날
-1
 
cs



- date.isocalendar()

:  3-tuple, (ISO year, ISO week number, ISO weekday) 리턴


1
2
3
4
5
6
7
8
>>> ic = d.isocalendar()
>>> for i in ic:
...     print(i)
... 
2018
8
3
 
cs





3. 문자열로 출력



 날짜 String으로 표현하기


1
2
3
4
5
6
7
8
9
10
11
12
>>> d.isoformat()                # ISO 8601 format, ‘YYYY-MM-DD’ 형식의 문자열 리턴
'2018-02-21'
 
>>> d.strftime("%Y/%m/%d")        # '년도/월/일' 포맷으로 날짜를 문자열로 리턴
'2018/02/21'
 
>>> d.strftime("%A %d, %B %Y")
'Wednesday 21, February 2018'
 
>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d,"day","month")
'The day is 21, the month is February.'
 
cs




* strftime 의 format 표현

DirectiveMeaningExampleNotes
%aWeekday as locale’s abbreviated name.
Sun, Mon, …, Sat (en_US);
So, Mo, …, Sa (de_DE)
(1)
%AWeekday as locale’s full name.
Sunday, Monday, …, Saturday (en_US);
Sonntag, Montag, …, Samstag (de_DE)
(1)
%wWeekday as a decimal number, where 0 is Sunday and 6 is Saturday.0, 1, …, 6 
%dDay of the month as a zero-padded decimal number.01, 02, …, 31 
%bMonth as locale’s abbreviated name.
Jan, Feb, …, Dec (en_US);
Jan, Feb, …, Dez (de_DE)
(1)
%BMonth as locale’s full name.
January, February, …, December (en_US);
Januar, Februar, …, Dezember (de_DE)
(1)
%mMonth as a zero-padded decimal number.01, 02, …, 12 
%yYear without century as a zero-padded decimal number.00, 01, …, 99 
%YYear with century as a decimal number.0001, 0002, …, 2013, 2014, …, 9998, 9999(2)
%HHour (24-hour clock) as a zero-padded decimal number.00, 01, …, 23 
%IHour (12-hour clock) as a zero-padded decimal number.01, 02, …, 12 
%pLocale’s equivalent of either AM or PM.
AM, PM (en_US);
am, pm (de_DE)
(1), (3)
%MMinute as a zero-padded decimal number.00, 01, …, 59 
%SSecond as a zero-padded decimal number.00, 01, …, 59(4)
%fMicrosecond as a decimal number, zero-padded on the left.000000, 000001, …, 999999(5)
%zUTC offset in the form +HHMM or -HHMM (empty string if the object is naive).(empty), +0000, -0400, +1030(6)
%ZTime zone name (empty string if the object is naive).(empty), UTC, EST, CST 
%jDay of the year as a zero-padded decimal number.001, 002, …, 366 
%UWeek number of the year (Sunday as the first day of the week) as a zero padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0.00, 01, …, 53(7)
%WWeek number of the year (Monday as the first day of the week) as a decimal number. All days in a new year preceding the first Monday are considered to be in week 0.00, 01, …, 53(7)
%cLocale’s appropriate date and time representation.
Tue Aug 16 21:30:00 1988 (en_US);
Di 16 Aug 21:30:00 1988 (de_DE)
(1)
%xLocale’s appropriate date representation.
08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)
(1)
%XLocale’s appropriate time representation.
21:30:00 (en_US);
21:30:00 (de_DE)
(1)
%%A literal '%' character.% 







3. datetime.datetime Object

:date 객체와 time 객체를 모두 포함하는 객체이다.


class datetime.datetime(yearmonthdayhour=0minute=0second=0microsecond=0tzinfo=None*fold=0)




▶ 가능한 연산


Operation 

 datetime2 = datetime1 + timedelta

 datetime2 = datetime1 - timedelta

 timedelta = datetime1 - datetime2

 datetime1 < datetime2







▶ 사용 예시




1. date 객체와 time 객체 결합


classmethod datetime.combine(datetimetzinfo=self.tzinfo)


1
2
3
4
5
6
>>> from datetime import datetime,date,time
>>> d = date(2018,02,22)
>>> t = time(12,0)
>>> datetime.combine(d,t)
datetime.datetime(2018222120)
 
cs




2. 현재시간 출력


classmethod datetime.now(tz=None)     :  현재 지역의 날짜와 시간 리턴


classmethod datetime.utcnow()    :  현재 UTC 날짜와 시간 리턴 


1
2
3
4
5
6
7
>>> from datetime import datetime,date,time
>>> datetime.now()
datetime.datetime(201822210532871089)
>>> datetime.utcnow()
datetime.datetime(201822215331606943)
 
 
cs




3. 문자열로된 날짜 -> datetime 객체로 출력


classmethod datetime.strptime(date_stringformat)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> from datetime import datetime,date,time
>>> dt = datetime.strptime('2018/02/22 10:56','%Y/%m/%d %H:%M')
>>> dt
datetime.datetime(20182221056)
 
# timetuple() - struct_time  리턴
>>> tt = dt.timetuple()
>>> for it in tt:
...     print(it)
... 
2018
2
22
10
56
0
3
53
-1
 
cs




4. datetime 날짜 형식 포맷 변환해서 리턴 (formatting datetime)


datetime.strftime(format)


1
2
3
4
5
6
7
8
>>> from datetime import datetime,date,time
>>> dt = datetime.strptime('2018/02/22 10:56','%Y/%m/%d %H:%M')
>>> dt.strftime('%A, %d. %B %Y %I : %M%p')
'Thursday, 22. February 2018 10 : 56AM'
 
>>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(dt, "day""month""time")
'The day is 22, the month is February, the time is 10:56AM.'
 
cs