기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

[python] 날짜와 시간 다루기: datetime 패키지

날짜와 시간 다루기: datetime 패키지

내용

datetime 패키지는 4개의 클래스로 구성됩니다.

표 1. datetime패키지의 클래스
클래스내용
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)

다음의 속성을 사용하여 결과를 분리하여 나타낼 수 있습니다.

표 2. datetime 클래스의 속성과 메서드
속성내용메서드내용
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() 메서드를 적용하여 문자열로 전환을 위한 객체의 호출을 위해 다음의 기호를 사용합니다(참조).

표 3. 날짜와 시간을 호출 기호
속성내용
%Y, %y4자리 연도 숫자, 2자리 연도
%m2자리 월 숫자
%d2자리 일 숫자
%H24시간 형식 2자리 시간 숫자
%M2자리 분 숫자
%S2자리 초 숫자
%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)
표 4. data 클래스 메서드
메서드내용
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

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...