Преобразование дат и времени в строки и из строк в Python datetime (strftime, strptime)

Бизнес

Стандартная библиотека datetime стандартной библиотеки Python может использоваться для обработки дат и времени (даты, времени и времени). Методы 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объект
    • Вычитание объектов 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 может быть преобразован в объект date методом 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'>

объект даты

Объект даты — это объект, содержащий информацию о дате (год, месяц, день). Доступ к нему можно получить по атрибутам year, month и day.

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

Объект timedelta — это объект, представляющий разницу во времени между двумя датами и временем, или прошедшее время. Он содержит информацию в днях, секундах и микросекундах, и доступ к нему можно получить с помощью атрибутов days, seconds и microseconds. Также можно получить общее количество секунд с помощью метода 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 для выполнения таких операций, как вычитание и сложение. Например, вы можете легко вычислить и получить дату неделю назад или 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

Если преобразовать его в объект 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
Copied title and URL