Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python datetime 모듈 완벽 정리: 날짜와 시간 다루기의 모든 것

Python에서 날짜와 시간을 조작하려면 datetime 모듈을 사용합니다. 이 모듈은 날짜·시간 객체를 두 가지 유형으로 제공하는데, 바로 naive(단순형)aware(인지형)입니다.

naive 객체는 다른 날짜·시간 객체로부터 자신을 명확하게 구분할 수 있는 충분한 정보를 담고 있지 않습니다. 반면 aware 객체는 알고리즘적·정치적 시간 조정(예: 서머타임, 표준시 변경)에 관한 정보를 포함하고 있어, 특정한 시점을 정확하게 표현하는 데 사용됩니다.

이 모듈을 사용하려면 먼저 임포트해야 합니다.

import datetime

주요 상수(Constants)

번호상수 및 설명
1

datetime.MINYEAR

date 또는 datetime 객체에 사용할 수 있는 가장 작은 연도 값입니다. 값은 1입니다.

2

datetime.MAXYEAR

date 또는 datetime 객체에 사용할 수 있는 가장 큰 연도 값입니다. 값은 9999입니다.

사용 가능한 데이터 타입

번호데이터 타입 및 설명
1

date

날짜 타입 객체입니다. 그레고리력(Gregorian calendar)을 사용하며, year(연), month(월), day(일) 속성을 가집니다.

2

time

시간 객체 클래스입니다. 특정 날짜와는 독립적이며, hour(시), minute(분), second(초), microsecond(마이크로초), tzinfo 속성을 가집니다.

3

datetime

날짜와 시간을 하나로 합친 객체입니다.

4

timedelta

두 개의 date, time 또는 datetime 값 사이의 차이(기간)를 나타내는 데 사용됩니다. 내부적으로 일(days), 초(seconds), 마이크로초(microseconds) 단위로 저장됩니다.

5

tzinfo

추상 기반 클래스(Abstract Base Class)로, 시간대 정보를 담습니다. datetime과 time 클래스에서 사용됩니다.

6

timezone

tzinfo를 구현한 클래스로, UTC로부터 고정된 오프셋(offset)을 나타냅니다.

Date 객체

date 객체는 날짜를 표현합니다. 날짜는 일(day), 월(month), 연(year) 부분으로 구성되며, 그레고리력을 따릅니다. 이 달력 기준으로 1년 1월 1일이 '1일차'가 되며, 이후 순차적으로 번호가 매겨집니다.

날짜 관련 주요 메서드는 다음과 같습니다.

date.date(year, month, day)

date 타입 객체를 생성하는 생성자입니다. 세 인수 모두 필수이며 정수형이어야 합니다. 연도는 MINYEAR~MAXYEAR 범위 내에 있어야 하고, 유효하지 않은 날짜를 지정하면 ValueError가 발생합니다.

date.today()

현재 현지(local) 날짜를 반환합니다.

date.fromtimestamp(timestamp)

POSIX 타임스탬프로부터 날짜를 얻습니다. 타임스탬프 값이 범위를 벗어나면 OverflowError 또는 OSError가 발생할 수 있습니다.

date.fromordinal(ordinal)

역산 그레고리력 서수(proleptic Gregorian ordinal)로부터 날짜를 얻습니다. 즉, 1년 1월 1일을 1일차로 하는 일수 카운트에서 날짜를 구합니다.

date.toordinal()

날짜를 역산 그레고리력 서수로 변환하여 반환합니다.

date.weekday()

해당 날짜의 요일을 정수로 반환합니다. 월요일은 0, 화요일은 1이며, 일요일은 6입니다.

date.isoformat()

날짜를 ISO 8601 형식 문자열(YYYY-MM-DD)로 반환합니다.

예제 코드

import datetime as dt
new_date = dt.date(1998, 9, 5) # 1998년 9월 5일 저장
print("The Date is: " + str(new_date))
print("Ordinal value of given date: " + str(new_date.toordinal()))
print("The weekday of the given date: " + str(new_date.weekday())) # 월요일은 0
my_date = dt.date.fromordinal(732698) # 서수 값으로부터 날짜 생성
print("The Date from ordinal is: " + str(my_date))
td = my_date - new_date # timedelta 객체 생성
print('td Type: ' + str(type(td)) + '\nDifference: ' + str(td))

실행 결과

The Date is: 1998-09-05
Ordinal value of given date: 729637
The weekday of the given date: 5
The Date from ordinal is: 2007-01-22
td Type: <class 'datetime.timedelta'>
Difference: 3061 days, 0:00:00

Time 객체

time 객체는 현지 시간을 표현합니다. 시간은 hour(시), minute(분), second(초), microsecond(마이크로초), tzinfo 부분으로 구성됩니다. 유효 범위는 각각 hour는 0~23, minute과 second는 0~59, microsecond는 0~999999입니다.

시간 관련 주요 메서드는 다음과 같습니다.

time.fromisoformat(time_string)

ISO 8601 형식 문자열로부터 시간을 얻습니다. time.isoformat() 메서드가 출력하는 형식이라면 어떤 것이든 입력으로 받을 수 있습니다.

time.replace(hour=..., minute=..., second=..., microsecond=..., tzinfo=..., fold=0)

인수로 전달된 값들로 새로운 time 객체를 만들어 반환합니다. 인수를 전달하지 않으면 원래 객체와 동일한 값을 가진 시간 객체를 반환합니다.

time.tzname()

시간대 이름을 반환합니다. tzinfo가 None이면 None을 반환합니다.

Datetime 객체

datetime 객체는 날짜와 시간을 모두 담고 있습니다. date 객체처럼 그레고리력을 지원하며, time 객체처럼 하루를 정확히 3600×24초로 처리합니다.

date와 time의 모든 관련 메서드를 지원하며, datetime만의 메서드도 존재합니다.

datetime.now(tz=None)

현재 날짜와 시간을 가져옵니다. tz가 없거나 None이면 today() 메서드와 같은 결과를 반환합니다.

datetime.utcnow()

현재 UTC 기준 날짜와 시간 정보를 가져옵니다.

또한 strftime()strptime()이라는 두 메서드가 있습니다. 이들은 date, time 객체뿐 아니라 datetime 객체에도 적용할 수 있습니다.

strftime(format[, t])

strftime()은 gmtime()이나 localtime()이 반환한 시간을 나타내는 튜플 또는 struct_time을, format 인수로 지정한 문자열로 변환합니다. t가 제공되지 않으면 localtime()이 반환한 현재 시간이 사용됩니다. format은 반드시 문자열이어야 하며, t의 어떤 필드라도 허용 범위를 벗어나면 ValueError가 발생합니다.

strptime(string, format)

strptime()은 지정된 형식에 따라 시간을 나타내는 문자열을 파싱합니다. 반환값은 gmtime()이나 localtime()이 반환하는 것과 같은 struct_time입니다. format 매개변수는 strftime()에서 사용하는 것과 동일한 지시자(directive)를 사용하며, 기본값은 ctime() 출력 형식과 일치하는 "%a %b %d %H:%M:%S %Y"입니다.

이 두 메서드에서 사용되는 주요 지시자는 아래와 같습니다.

번호지시자 및 설명
1

%A

요일의 전체 이름 (예: Monday)

2

%B

월의 전체 이름 (예: January)

3

%d

일 (01~31)

4

%S

초 (00~61)

5

%G

ISO 주 번호에 해당하는 4자리 연도

6

%m

월 (01~12)

7

%M

분 (00~59)

8

%T

현재 시간, %H:%M:%S와 동일

9

%W

올해의 주 번호. 첫 번째 월요일을 첫째 주의 시작으로 계산

10

%w

요일을 십진수로 표현 (일요일=0)

11

%Y

세기를 포함한 연도 (예: 2024)

12

%Z 또는 %z

시간대 이름 또는 약어 / UTC 오프셋

예제 코드

import datetime as dt
my_date1 = dt.datetime(2015, 1, 4) # 2015년 1월 4일 저장
print(my_date1)
print('The Weekday of that day was: ' + my_date1.strftime('%A'))
my_date2 = dt.datetime.strptime('August-15-2017', '%B-%d-%Y') # 2017년 8월 15일 저장
print(my_date2)
print('The Weekday of that day was: ' + my_date2.strftime('%A'))
print('The difference between two days: ' + str(abs(my_date1 - my_date2)))

실행 결과

2015-01-04 00:00:00
The Weekday of that day was: Sunday
2017-08-15 00:00:00
The Weekday of that day was: Tuesday
The difference between two days: 954 days, 0:00:00