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

Бизнес

Стандартната библиотека datetime на Python може да се използва за обработка на дати и времена (дати, времена и часове). Методите strftime() и strptime(), които преобразуват дати и времена във и от низове, могат да се използват за обработка на дати и времена в различни формати.

Той може да извършва и операции като изваждане и събиране. Например можете лесно да изчислите и получите датата преди 10 дни или след 3 седмици, или часа след 50 минути.

Първо ще опишем следните класове обекти, налични в модула datetime.

  • datetime.datetime:Дата и час (дата и час)
  • datetime.date:Дата
  • datetime.time:Време
  • datetime.timedelta:Времева разлика и изминало време

Обяснени са и методите strftime() и strptime(), които преобразуват date\time и string един в друг.

  • datetimeобект
    • datetime.now():Днешна дата, текущо време
    • datetimeКонструктор на обект
    • Конвертиране на обект datetime в обект date
  • dateобект
    • date.today():Днешната дата
    • Конструктор за обекта date
  • timeобект
    • Конструктор за обекта 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 в обект date

Обектът 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'>

обект дата

Обектът за дата е обект, който съдържа информация за дадена дата (година, месец, ден). Достъпът до него се осъществява чрез атрибутите година, месец и ден.

date.today(): Днешната дата

Обектът date на текущата дата (днешната дата) може да бъде получен с 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 е следният

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 е обект, който представлява разликата във времето между две дати и часове или изминалото време. Той съдържа информация в дни, секунди и микросекунди и може да бъде достъпен чрез атрибутите дни, секунди и микросекунди. Възможно е също така да се получи общият брой секунди, като се използва методът 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