날짜와 시간 다루기: datetime 패키지
내용
datetime 패키지는 4개의 클래스로 구성됩니다.
클래스 | 내용 |
---|---|
datetime() | 날짜와 시간을 저장 |
date() | 날짜만 저장 |
time() | 시간만 저장 |
timedelta() | 시간 구간의 정보를 저장 |
import datetime as dt
datetime 클래스
datetime 클래스는 인스턴스 생성없이 적용할 수 있는 클래스메서드(Classmethod)입니다. 이 클래스는 년, 월, 일, 시, 분, 초, 마이크로초등의 인수를 전달할 수 있으며 모두 정수입니다.
dt.datetime(2024, 10, 25, 13, 20)
datetime.datetime(2024, 10, 25, 13, 20)
이 클래스의 메소드 now()
는 실행시의 날짜와 시간을 반환합니다.
a=dt.datetime.now() a
datetime.datetime(2024, 10, 25, 18, 2, 12, 658796)
다음의 속성을 사용하여 결과를 분리하여 나타낼 수 있습니다.
속성 | 내용 | 메서드 | 내용 |
---|---|---|---|
year | 연도 반환 | weekday() | 요일반환(0 ~ 6 &rarrr; 월 ~ 금) |
month | 월 반환 | strftime() | 문자열 반환 |
day | 일 반환 | date() | 날짜정보만 가지는 date 클래스 객체 반환 |
hour, minute | 시, 분 반환 | time() | 시간 정보만 time 클래스 객체 반환 |
second, microsecond | 초, 마이크로 초 반환 | strptime() | 문자열을 datetime 객체로 전환 |
a.year, a.month, a.day
(2024, 10, 25)
a.hour, a.minute, a.second, a.microsecond
(18, 2, 12, 658796)
a.weekday()
4
a.date()
datetime.date(2024, 10, 25)
strftime() 메서드를 적용하여 문자열로 전환을 위한 객체의 호출을 위해 다음의 기호를 사용합니다(참조).
속성 | 내용 |
---|---|
%Y, %y | 4자리 연도 숫자, 2자리 연도 |
%m | 2자리 월 숫자 |
%d | 2자리 일 숫자 |
%H | 24시간 형식 2자리 시간 숫자 |
%M | 2자리 분 숫자 |
%S | 2자리 초 숫자 |
%A | 영어로 된 요일 문자열 |
%B | 영어로 된 월 문자열 |
print(a.strftime("%Y-%m-%d")) print(a.strftime("%y-%m-%d"))
2024-10-25 24-10-25
a.strftime("%B, %A")
'October, Friday'
반대로 문자열을 datetime 클래스 객체로 만들기 위해 strptime()
메서드를 사용합니다.
x="2024-10-21" type(x), x
(str, '2024-10-21')
y=dt.datetime.strptime(x, "%Y-%m-%d") y, type(y)
(datetime.datetime(2024, 10, 21, 0, 0), datetime.datetime)
date 클래스
date 클래스는 날짜 객체를 생성하며 인수로 정수인 year, month, day를 전달합니다.
datetime.date(year, month, day)
이 클래스로 나타낼 수 있는 최대와 최소의 날짜는 속성 max
, min
를 사용하여 확인할 수 있습니다.
mx=dt.date.max mn=dt.date.min print(f"최소: {mn}, 최대: {mx}")
최소: 0001-01-01, 최대: 9999-12-31
메서드 today()
는 현재 날짜를 나타냅니다
dt.date.today()
datetime.date(2024, 10, 25)
위와 같이 현재의 시간은 time.time()
함수로 확인할 수 있습니다. 이 함수는 1970년 1월 1일 0시 0분 0초로부터 현재의 시간을 초로 전환하여 반환합니다.
import time preSec=time.time() preSec
1729854897.0117917
위 결과는 date 클래스의 메서드 fromtimestamp()
로 정상적인 날짜로 환원할 수 있습니다. 즉, 이 메서드의 인수는 기준일로부터 계산되는 초(second)입니다.
dt.date.fromtimestamp(preSec)
datetime.date(2024, 10, 25)
메서드 date.fromordinal()
는 fromtimestamp()와 유사하지만 기준이 1년 1월 1일이고 전달해주는 정수는 day이다. 즉, fromordinal() 함수는 일기준이 된다.
dt.date.fromtimestamp(100)
datetime.date(1970, 1, 1)
dt.date.fromordinal(100)
datetime.date(1, 4, 10)
data 클래스 속성으로 표 2에서 나타낸 year, month, day를 사용할 수 있습니다.
d=dt.date(2010, 7, 10) d.year, d.month, d.day
(2010, 7, 10)
메서드 | 내용 |
---|---|
replce(year, month, day) | 전달한 인수값이 객체에 대응되는 부분을 치환 |
timetuple() | 객체의 모든 정보를 반환 |
toordinal() | 1년 1월 1일 을 기준으로 객체의 날짜까지 경과한 일수를 반환 |
weekday() | 요일을 정수로 반환, 0 ~ 6 → 월 ~ 일 |
isoweekday() | 요일을 정수로 반환, 1 ~ 7 → 월 ~ 일 |
isocalendar() | 객체의 년, 경과한 주(week)수, 요일(isoweekday()와 같음)을 반환 |
isoformat(), __str__() | 'YYYY-MM-DD' 형식의 문자열로 반화 |
ctime() | 문자열로 반환(위와 다른 형식) |
strftime(형식), __format__(형식) | 형식과 같이 문자열로 반환 |
d=dt.date(2023, 12, 2) d
datetime.date(2023, 12, 2)
d1=d.replace(year=2024) d1
datetime.date(2024, 12, 2)
d1.timetuple()
time.struct_time(tm_year=2024, tm_mon=12, tm_mday=2, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=337, tm_isdst=-1)
d1.timetuple()[0]
2024
d.toordinal()
738856
d.weekday(), d.isoweekday()
(5, 6)
a=d.isoformat() a
'2023-12-02'
type(a)
str
dt.datetime.strptime(a, '%Y-%m-%d')
datetime.datetime(2023, 12, 2, 0, 0)
d.__str__()
'2023-12-02'
d.ctime()
'Sat Dec 2 00:00:00 2023'
d.strftime("%y/%m/%d")
'23/12/02'
d.__format__("%y/%m/%d")
'23/12/02'
timedelta 클래스
위의 소개한 datetime, date 클래스를 사용하여 같은 형태의 객체들 사이의 연산이 가능합니다.
d=dt.datetime(2023, 12, 2) d1=dt.datetime(2024, 2, 7) d-d1
datetime.timedelta(days=-67)
d=dt.date(2023, 12, 2) d1=dt.date(2024, 2, 7) d-d1
datetime.timedelta(days=-67)
d=dt.datetime(2023, 12, 2) d1=dt.date(2024, 2, 7) d-d1
TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'datetime.date'
위 결과와 같이 두 datatime 또는 date 객체들 사이의 차이를 나타내는 자료형은 timedelta입니다. 역으로 두 객체와 datetime.timedelta()
클래스로 생성한 객체와의 연산이 가능합니다.
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
d=dt.date(2023, 12, 2) timeD=d-dt.timedelta(days=3) timeD
datetime.date(2023, 11, 29)
위 timedelta()의 인수들에서 month와 year는 없습니다. 즉, 이들에 의한 계산은 이루어지지 않습니다.
timeD=d-dt.timedelta(weeks=3) timeD
datetime.date(2023, 11, 11)
timeD=d-dt.timedelta(months=3) timeD
TypeError: 'months' is an invalid keyword argument for __new__()"
이 클래스에 전달한 인수값은 다음과 같이 날짜, 초, 마이크로초로 환산하여 반환합니다.
- 1usec=1000 msec
- 1 min = 60 sec
- 1 hr= 3600 sec
- 1 week = 7days
a=dt.timedelta(seconds=10) b=dt.timedelta(minutes=5) c=dt.timedelta(hours=5) d=dt.timedelta(days=3) e=dt.timedelta(weeks=3) print(f"sec to sec: {a}\nmin to sec: {b}\nhour to sec: {c}\ndya to day : {d}\nweek to day: {e}")
sec to sec: 0:00:10 min to sec: 0:05:00 hour to sec: 5:00:00 dya to day : 3 days, 0:00:00 week to day: 21 days, 0:00:00
위 객체들의 자료형은 모두 timedelta입니다.
a, b, c, d, e
(datetime.timedelta(seconds=10), datetime.timedelta(seconds=300), datetime.timedelta(seconds=18000), datetime.timedelta(days=3), datetime.timedelta(days=21))
위 결과와 같이 timedelta 객체(인스턴스)는 .day, .second, .microsecond
속성을 소유합니다.
d=dt.timedelta(days=3, seconds=45, microseconds=2) d
datetime.timedelta(days=3, seconds=45, microseconds=2)
d.day, d.second, d.microsecond
(3, 45, 2)
timedelta 객체는 +, - 연산 뿐만 아니라 *, / 연산도 가능합니다.
d=dt.datetime.now() d
datetime.datetime(2024, 10, 26, 9, 45, 15, 418320)
d_del=dt.timedelta(days=5) d1=d+d_del d1
datetime.datetime(2024, 10, 31, 9, 45, 15, 418320)
d1.day
31
d2=d-2*d_del d2
datetime.datetime(2024, 10, 16, 9, 45, 15, 418320)
d_del/2
datetime.timedelta(days=2, seconds=43200)
d3=d+d_del/2 d3
datetime.datetime(2024, 10, 28, 21, 45, 15, 418320)
str()
과 repr()
함수를 적용하여 문자열로 형변환할 수 있습니다. repr()의 경우는 객체에 정보를 포함합니다.
d4=str(d3) d4, type(d4)
('2024-10-28 21:45:15.418320', str)
d5=repr(d3) d5, type(d5)
('datetime.datetime(2024, 10, 28, 21, 45, 15, 418320)', str)
timedelta() 클래스의 메서드 total_seconds()
를 적용하여 전달한 모든 인수를 초로 환산할 수 있습니다.
dt.timedelta(days=365).total_seconds()
31536000.0
댓글
댓글 쓰기