Python datetime(strftime, strptime)의 문자열과 날짜 및 시간 변환

사업

Python의 표준 라이브러리 datetime은 날짜 및 시간(날짜, 시간 및 시간)을 처리하는 데 사용할 수 있습니다. 날짜와 시간을 문자열로 변환하거나 문자열에서 변환하는 strftime() 및 strptime() 메서드는 날짜와 시간을 다양한 형식으로 조작하는 데 사용할 수 있습니다.

또한 빼기 및 더하기와 같은 연산도 수행할 수 있습니다. 예를 들어 10일 전이나 3주 후의 날짜, 50분 후의 시간을 쉽게 계산하여 얻을 수 있습니다.

먼저 datetime 모듈에서 사용할 수 있는 다음 클래스의 객체에 대해 설명합니다.

  • datetime.datetime:날짜 및 시간(날짜 및 시간)
  • datetime.date:날짜
  • datetime.time:시간
  • datetime.timedelta:시차와 경과 시간

날짜/시간 및 문자열을 서로 변환하는 strftime() 및 strptime() 메서드에 대해서도 설명합니다.

  • datetime물체
    • datetime.now():오늘 날짜, 현재 시간
    • datetime객체 생성자
    • datetime 객체를 날짜 객체로 변환
  • date물체
    • date.today():오늘 날짜
    • 날짜 객체의 생성자
  • time물체
    • 시간 객체의 생성자
  • timedelta물체
    • datetime 및 date 객체를 빼서 timedelta 객체를 생성합니다.
    • timedelta 객체의 생성자
    • timedelta 객체를 사용한 뺄셈과 덧셈
  • strftime():날짜 및 시간에서 문자열로 변환
  • strptime():문자열에서 날짜 및 시간으로 변환

또한 표준 라이브러리에 포함된 캘린더 모듈은 일반 텍스트 또는 HTML 형식으로 캘린더를 생성합니다.

날짜 시간 개체

datetime 객체는 날짜(년, 월, 일) 및 시간(시, 분, 초, 마이크로초) 정보가 모두 있는 객체입니다. 다음 속성을 사용하여 해당 정보에 액세스할 수 있습니다.

  • year
  • month
  • day
  • hour
  • minute
  • second
  • microsecond

datetime.now():오늘 날짜, 현재 시간

datetime.now()는 오늘 날짜(현재 날짜)와 현재 시간이 포함된 datetime 객체를 제공합니다.

import datetime

dt_now = datetime.datetime.now()
print(dt_now)
# 2018-02-02 18:31:13.271231

print(type(dt_now))
# <class 'datetime.datetime'>

print(dt_now.year)
# 2018

print(dt_now.hour)
# 18

datetime 객체의 생성자

임의의 날짜와 시간에 대한 datetime 객체를 생성하는 것도 가능합니다.

datetime 객체의 생성자는 다음과 같습니다.

datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

다음 값은 필수이며 나머지는 생략할 수 있습니다. 생략하면 기본값은 0입니다.

  • year
  • month
  • day
dt = datetime.datetime(2018, 2, 1, 12, 15, 30, 2000)
print(dt)
# 2018-02-01 12:15:30.002000

print(dt.minute)
# 15

print(dt.microsecond)
# 2000

dt = datetime.datetime(2018, 2, 1)
print(dt)
# 2018-02-01 00:00:00

print(dt.minute)
# 0

datetime 객체를 날짜 객체로 변환

datetime 객체는 다음에 설명하는 것처럼 date() 메서드를 사용하여 날짜 객체로 변환할 수 있습니다.

print(dt_now)
print(type(dt_now))
# 2018-02-02 18:31:13.271231
# <class 'datetime.datetime'>

print(dt_now.date())
print(type(dt_now.date()))
# 2018-02-02
# <class 'datetime.date'>

날짜 개체

날짜 객체는 날짜(년, 월, 일)에 대한 정보를 포함하는 객체입니다. 년, 월, 일 속성으로 액세스할 수 있습니다.

date.today():오늘 날짜

현재 날짜(오늘 날짜)의 날짜 객체는 date.today()로 얻을 수 있습니다.

d_today = datetime.date.today()
print(d_today)
# 2018-02-02

print(type(d_today))
# <class 'datetime.date'>

print(d_today.year)
# 2018

날짜 객체의 생성자

날짜 개체의 생성자는 다음과 같습니다.

date(year, month, day)

모두 필수이며 생략할 수 없습니다.

d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01

print(d.month)
# 2

시간 개체

time 객체는 시간(시, 분, 초, 마이크로초)에 대한 정보를 담고 있는 객체입니다. 시, 분, 초 및 마이크로초 속성을 사용하여 액세스할 수 있습니다.

시간 객체의 생성자

time 객체의 생성자는 다음과 같다.

time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

모두 선택 사항이며 생략하면 0으로 설정됩니다.

t = datetime.time(12, 15, 30, 2000)
print(t)
# 12:15:30.002000

print(type(t))
# <class 'datetime.time'>

print(t.hour)
# 12

t = datetime.time()
print(t)
# 00:00:00

타임델타 객체

timedelta 객체는 두 날짜와 시간의 시차 또는 경과 시간을 나타내는 객체입니다. 여기에는 일, 초 및 마이크로초 단위의 정보가 있으며 일, 초 및 마이크로초 속성으로 액세스할 수 있습니다. total_seconds() 메서드를 사용하여 총 시간(초)을 얻을 수도 있습니다.

datetime 및 date 객체를 빼서 timedelta 객체를 생성합니다.

datetime 객체를 서로 빼면 timedelta 객체가 생성됩니다.

td = dt_now - dt
print(td)
# 1 day, 18:31:13.271231

print(type(td))
# <class 'datetime.timedelta'>

print(td.days)
# 1

print(td.seconds)
# 66673

print(td.microseconds)
# 271231

print(td.total_seconds())
# 153073.271231

날짜 개체를 서로 빼면 유사하게 timedelta 개체가 생성됩니다.

timedelta 객체의 생성자

timedelta 객체의 생성자는 다음과 같습니다.

timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

모두 선택 사항이며 생략하면 0으로 설정됩니다.

timedelta 개체에는 다음 정보만 포함됩니다.

  • 일 수:days
  • 초 수:seconds
  • 마이크로초 카운트:microseconds

예를 들어 다음 두 개는 같음

  • weeks=1
  • days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00

print(td_1w.days)
# 7

timedelta 객체를 사용한 뺄셈과 덧셈

timedelta 개체는 datetime 및 date 개체와 함께 사용하여 빼기 및 더하기와 같은 작업을 수행할 수 있습니다. 예를 들어 1주일 전이나 10일 후의 날짜, 50분 후의 시간을 쉽게 계산하여 얻을 수 있습니다.

d_1w = d_today - td_1w
print(d_1w)
# 2018-01-26

td_10d = datetime.timedelta(days=10)
print(td_10d)
# 10 days, 0:00:00

dt_10d = dt_now + td_10d
print(dt_10d)
# 2018-02-12 18:31:13.271231

td_50m = datetime.timedelta(minutes=50)
print(td_50m)
# 0:50:00

print(td_50m.seconds)
# 3000

dt_50m = dt_now + td_50m
print(dt_50m)
# 2018-02-02 19:21:13.271231

또한 특정 날짜까지의 일 수를 계산하는 데 사용할 수도 있습니다.

d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00

print(td.days)
# 903

strftime():날짜 및 시간에서 문자열로 변환

datetime 및 date 객체의 strftime() 메서드는 날짜 및 시간(날짜 및 시간) 정보를 모든 형식 형식의 문자열로 변환하는 데 사용할 수 있습니다.

서식 코드

사용 가능한 서식 코드는 아래 공식 문서를 참조하십시오.

주요 서식 코드는 다음과 같습니다.

  • %d:0이 채워진 10진수 표기법의 날짜입니다.
  • %m:0으로 채워진 10진수 표기법의 월.
  • %y:0으로 채워진 10진수 표기법으로 된 연도의 마지막 두 자리.
  • %Y:0으로 채워진 10진수 표기법의 연도 네 자리.
  • %H:0이 채워진 10진수 표기법으로 표시되는 경우(24시간 표기법)
  • %I:0으로 채워진 10진수 표기법으로 표현하는 경우(12시간 표기법)
  • %M:0으로 채워진 10진수 표기법의 경우.
  • %S:0으로 채워진 10진수 표기법의 초입니다.
  • %f:0이 채워진 10진수 표기법의 마이크로초(6자리)입니다.
  • %A:로케일의 요일 이름
  • %a:로케일의 요일 이름(약어)
  • %B:로케일 월 이름
  • %b:로케일 월 이름(약어)
  • %j:0으로 채워진 10진수 표기법의 날짜입니다.
  • %U:0으로 채워진 십진 표기법의 주 번호(주는 일요일에 시작)
  • %W:0으로 채워진 십진 표기법의 주 번호(주는 월요일에 시작)

날짜 및 월 이름에 대한 다음 형식화 코드는 로케일에 따라 다른 문자열로 얻을 수 있습니다.

  • %A
  • %a
  • %B
  • %b

ISO 8601 형식 문자열에 대한 전용 방법도 있습니다.

샘플 코드

print(dt_now.strftime('%Y-%m-%d %H:%M:%S'))
# 2018-02-02 18:31:13

print(d_today.strftime('%y%m%d'))
# 180202

print(d_today.strftime('%A, %B %d, %Y'))
# Friday, February 02, 2018

print('Day number (how many days in a year / January 1 is 001):', d_today.strftime('%j'))
print('Week number (the week starts on Sunday / New Year's Day is 00):', d_today.strftime('%U'))
print('Week number (the week begins on Monday / New Year's Day is 00):', d_today.strftime('%W'))
# Day number (how many days in a year / January 1 is 001): 033
# Week number (the week starts on Sunday / New Year's Day is 00): 04
# Week number (the week begins on Monday / New Year's Day is 00): 05

문자열 대신 숫자를 얻으려면 int()를 사용하여 정수로 변환하면 됩니다.

week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>

timedelta 개체와 함께 사용하면 예를 들어 격주 날짜 목록을 모든 형식으로 쉽게 만들 수 있습니다.

d = datetime.date(2018, 2, 1)
td = datetime.timedelta(weeks=2)
n = 8
f = '%Y-%m-%d'

l = []

for i in range(n):
    l.append((d + i * td).strftime(f))

print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']

print('\n'.join(l))
# 2018-02-01
# 2018-02-15
# 2018-03-01
# 2018-03-15
# 2018-03-29
# 2018-04-12
# 2018-04-26
# 2018-05-10

목록 이해 표기법을 사용하는 것이 더 똑똑합니다.

l = [(d + i * td).strftime(f) for i in range(n)]
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']

strptime():문자열에서 날짜 및 시간으로 변환

datetime strptime()을 사용하여 날짜 또는 시간 문자열에서 datetime 객체를 생성할 수 있습니다. 원래 문자열에 해당하는 형식화 문자열을 지정해야 합니다.

ISO 8601 문자열(Python 3.7 이상) 전용 메서드도 있습니다.

샘플 코드

date_str = '2018-2-1 12:30'
date_dt = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M')
print(date_dt)
# 2018-02-01 12:30:00

print(type(date_dt))
# <class 'datetime.datetime'>

검색된 datetime 객체에 strftime() 메서드를 사용하면 원래 문자열과 다른 형식으로 날짜와 시간을 나타낼 수 있습니다.

print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30

이를 datetime 객체로 변환하면 timedelta 객체로 작업을 수행할 수도 있으므로 예를 들어 10일 전 날짜 문자열을 동일한 형식으로 생성할 수 있습니다.

date_str = '2018-2-1'
date_format = '%Y-%m-%d'
td_10_d = datetime.timedelta(days=10)

date_dt = datetime.datetime.strptime(date_str, date_format)
date_dt_new = date_dt - td_10_d
date_str_new = date_dt_new.strftime(date_format)

print(date_str_new)
# 2018-01-22