Перетворення дат і часу в і з рядків у 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

Об’єкт 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 виглядає наступним чином

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().

Відніміть об’єкти 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