파이썬3.6 에서 날짜와 시간을 제공하는 datetime 모듈이 있다. 날짜 및 시간 계산을 지원한다.
* Available Type
datetime.date # 날짜만 저장
datetime.time # 시간만 저장
datetime.datetime # 날짜와 시간을 저장
datetime.timedelta # 시간 구간 정보
datetime.tzinfo # 두 날짜, 시간 또는 날짜 시간의 인스턴스 객체 간 차이를 마이크로 초 해상도로 나타내는 기간
datetime.timezone # tzinfo 추상 기본 클래스를 UTC의 고정 offset으로 구현하는 클래스
6가지의 타입 중 현재 진행중인 프로젝트에서 필요한 timedelta, date, datetime 클래스를 공부해보면서 정리를 해보았다.
1. datetime.timedelta Object
class
datetime.
timedelta
(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=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 ) | |
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
: 년도, 월, 일 의 날짜를 나타낸다.
▶ 가능한 연산
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(2018, 02, 21) >>> today == date.fromtimestamp(time.time()) # date.today()와 같은 값 True >>> my_birthday = date(today.year, 3, 26) >>> if my_birthday < today: # 생일(2018-03-26) > 오늘(2018-02-21) 이기 때문에 ... my_birthday = my_birthday.replace(year=today.year + 1) # 내년으로 고치지 않음 >>> my_birthday datetime.date(2018, 3, 26) >>> time_to_birthday = abs(my_birthday - today) # 생일까지 남은 날을 계산 >>> time_to_birthday.days 33 | cs |
2. 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 |
◎ classmethod) date.
fromordinal
(ordinal)
1 2 3 | >>> d = date.fromordinal(736746) # 736746th day after 1. 1. 0001 >>> d datetime.date(2018, 2, 21) | 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 |
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 표현
Directive | Meaning | Example | Notes |
---|---|---|---|
%a | Weekday as locale’s abbreviated name. | Sun, Mon, …, Sat (en_US); So, Mo, …, Sa (de_DE) | (1) |
%A | Weekday as locale’s full name. | Sunday, Monday, …, Saturday (en_US); Sonntag, Montag, …, Samstag (de_DE) | (1) |
%w | Weekday as a decimal number, where 0 is Sunday and 6 is Saturday. | 0, 1, …, 6 | |
%d | Day of the month as a zero-padded decimal number. | 01, 02, …, 31 | |
%b | Month as locale’s abbreviated name. | Jan, Feb, …, Dec (en_US); Jan, Feb, …, Dez (de_DE) | (1) |
%B | Month as locale’s full name. | January, February, …, December (en_US); Januar, Februar, …, Dezember (de_DE) | (1) |
%m | Month as a zero-padded decimal number. | 01, 02, …, 12 | |
%y | Year without century as a zero-padded decimal number. | 00, 01, …, 99 | |
%Y | Year with century as a decimal number. | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (2) |
%H | Hour (24-hour clock) as a zero-padded decimal number. | 00, 01, …, 23 | |
%I | Hour (12-hour clock) as a zero-padded decimal number. | 01, 02, …, 12 | |
%p | Locale’s equivalent of either AM or PM. | AM, PM (en_US); am, pm (de_DE) | (1), (3) |
%M | Minute as a zero-padded decimal number. | 00, 01, …, 59 | |
%S | Second as a zero-padded decimal number. | 00, 01, …, 59 | (4) |
%f | Microsecond as a decimal number, zero-padded on the left. | 000000, 000001, …, 999999 | (5) |
%z | UTC offset in the form +HHMM or -HHMM (empty string if the object is naive). | (empty), +0000, -0400, +1030 | (6) |
%Z | Time zone name (empty string if the object is naive). | (empty), UTC, EST, CST | |
%j | Day of the year as a zero-padded decimal number. | 001, 002, …, 366 | |
%U | Week 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) |
%W | Week 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) |
%c | Locale’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) |
%x | Locale’s appropriate date representation. | 08/16/88 (None); 08/16/1988 (en_US); 16.08.1988 (de_DE) | (1) |
%X | Locale’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
(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
▶ 가능한 연산
Operation |
datetime2 = datetime1 + timedelta |
datetime2 = datetime1 - timedelta |
timedelta = datetime1 - datetime2 |
datetime1 < datetime2 |
▶ 사용 예시
1. date 객체와 time 객체 결합
classmethod datetime.
combine
(date, time, tzinfo=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(2018, 2, 22, 12, 0) | 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(2018, 2, 22, 10, 53, 28, 71089) >>> datetime.utcnow() datetime.datetime(2018, 2, 22, 1, 53, 31, 606943) | cs |
3. 문자열로된 날짜 -> datetime 객체로 출력
classmethod datetime.
strptime
(date_string, format)
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(2018, 2, 22, 10, 56) # 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)
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 |
'python' 카테고리의 다른 글
python csv와 excel export 하는방법 및 엑셀 export 속도 빠르게 하는방법 (0) | 2018.04.23 |
---|---|
python 인스턴스 클래스가 담겨진 list 특정 변수값으로 정렬하기 (0) | 2018.04.18 |
inconsistent use of tabs and spaces in indentation 에러 해결 (0) | 2018.03.27 |
with 문 (0) | 2018.01.15 |
python 공부하기 좋은 사이트 (0) | 2018.01.09 |