Пераўтварэнне даты і часу ў радкі і з іх у 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Канструктар аб’ектаў
    • Пераўтварэнне аб’екта даты і часу ў аб’ект даты
  • dateаб’ект
    • date.today():Сённяшняя дата
    • Канструктар для аб’екта даты
  • timeаб’ект
    • Канструктар для аб’екта часу
  • timedeltaаб’ект
    • Адніміце аб’екты даты і часу, каб стварыць аб’екты timedelta.
    • Канструктар для аб’екта timedelta
    • Адніманне і складанне з выкарыстаннем аб’ектаў timedelta
  • strftime():Пераўтварэнне з даты і часу ў радок
  • strptime():Пераўтварэнне з радка ў дату і час

Таксама ў стандартную бібліятэку ўваходзіць каляндарны модуль, які генеруе календары ў фармаце звычайнага тэксту або HTML.

аб’ект даты і часу

Аб’ект даты і часу – гэта аб’ект, які мае інфармацыю пра дату (год, месяц, дзень) і час (гадзіна, хвіліна, секунда, мікрасекунды). Вы можаце атрымаць доступ да гэтай інфармацыі з наступнымі атрыбутамі.

  • 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(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

Пераўтварэнне аб’екта даты і часу ў аб’ект даты

Аб’ект даты і часу можна пераўтварыць у аб’ект даты метадам 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(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

Аб’ект timedelta – гэта аб’ект, які ўяўляе розніцу ў часе паміж дзвюма датамі і часам або час, які прайшоў. Ён змяшчае інфармацыю ў днях, секундах і мікрасекундах, і да яго можна атрымаць доступ з дапамогай атрыбутаў дні, секунды і мікрасекунды. Таксама можна атрымаць агульную колькасць секунд з дапамогай метаду total_seconds().

Адніміце аб’екты даты і часу, каб стварыць аб’ект timedelta.

Аднімаючы адзін ад аднаго аб’екты даты і часу, атрымліваецца аб’ект 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 для выканання такіх аперацый, як адніманне і складанне. Напрыклад, вы можаце лёгка разлічыць і атрымаць дату тыдзень таму або праз 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():Пераўтварэнне з даты і часу ў радок

Метад strftime() аб’ектаў datetime і date можна выкарыстоўваць для пераўтварэння інфармацыі аб даце і часе (дата і час) у радок у любым фармаце.

код фарматавання

Даступныя коды фарматавання можна знайсці ў афіцыйнай дакументацыі ніжэй.

Асноўныя коды фарматавання пералічаны ніжэй.

  • %d:Дзень месяца ў дзесятковым запісе з запаўненнем нуля.
  • %m:Месяц у дзесятковым запісе з запаўненнем нуля.
  • %y:Дзве апошнія лічбы года ў дзесятковым запісе з нулявым запаўненнем.
  • %Y:Чатыры лічбы года ў дзесятковым запісе з запаўненнем нуля.
  • %H:Калі выражаны ў дзесятковым запісе з нулявым запісам (24-гадзінны запіс)
  • %I:Калі выражаны ў дзесятковым запісе з запаўненнем нуля (12-гадзінны запіс)
  • %M:Для дзесятковага запісу з запаўненнем нуля.
  • %S:Секунды ў дзесятковым запісе з запаўненнем нуля.
  • %f:Мікрасекунды (6 лічбаў) у дзесятковым запісе з 0 запоўненым.
  • %A:Назва дня тыдня для мясцовасці
  • %a:Назва дня для мясцовасці (скарочаная форма)
  • %B:Лакальная назва месяца
  • %b:Назва месяца (скарочаная форма)
  • %j:Дзень года ў дзесятковым запісе з запаўненнем нуля.
  • %U:Нумар тыдня года ў дзесятковым запісе з нулявым запаўненнем (тыдзень пачынаецца ў нядзелю)
  • %W:Нумар тыдня года ў дзесятковым запісе з нулявым запаўненнем (тыдзень пачынаецца ў панядзелак)

Наступныя коды фарматавання для назваў дзён і месяцаў можна атрымаць у розных радках у залежнасці ад лакалі.

  • %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'>

Выкарыстоўваючы метад strftime() для атрыманага аб’екта datetime, вы можаце прадставіць дату і час у іншым фармаце, чым зыходны радок.

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

Калі вы пераўтворыце яго ў аб’ект даты і часу, вы таксама можаце выконваць аперацыі з аб’ектамі 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
Copied title and URL