Конвертовање датума и времена у и из стрингова у Питхон датетиме (стрфтиме, стрптиме)

Бусинесс

Питхонова стандардна библиотека датум и време се може користити за обраду датума и времена (датума, времена и времена). Методе стрфтиме() и стрптиме(), које претварају датуме и времена у низове и из њих, могу се користити за манипулацију датумима и временом у различитим форматима.

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

Прво ћемо описати следеће класе објеката доступних у модулу датетиме.

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

Методе стрфтиме() и стрптиме(), које међусобно конвертују датум/време и стринг, такође су објашњене.

  • datetimeобјекат
    • datetime.now():Данашњи датум, тренутно време
    • datetimeКонструктор објеката
    • Конвертовање објекта датума и времена у објекат датума
  • dateобјекат
    • date.today():Данашњи датум
    • Конструктор за објекат датума
  • timeобјекат
    • Конструктор за временски објекат
  • timedeltaобјекат
    • Одузмите објекте датума и времена да бисте креирали објекте тимеделта.
    • Конструктор за тимеделта објекат
    • Одузимање и сабирање коришћењем тимеделта објеката
  • strftime():Конверзија из датума и времена у стринг
  • strptime():Конверзија из стринга у датум и време

У стандардну библиотеку је такође укључен модул календара, који генерише календаре у обичном тексту или ХТМЛ формату.

датетиме објекат

Објекат датетиме је објекат који има информације о датуму (година, месец, дан) и времену (сат, минут, секунда, микросекунда). Тим информацијама можете приступити помоћу следећих атрибута.

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

datetime.now():Данашњи датум, тренутно време

датетиме.нов() ће вам дати објекат датетиме са данашњим датумом (тренутни датум) и тренутним временом.

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

Конвертовање објекта датума и времена у објекат датума

Објекат датетиме се може конвертовати у објекат датума методом дате(), као што је описано у наставку.

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():Данашњи датум

Објекат датума тренутног датума (данашњи датум) се може добити помоћу дате.тодаи().

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

тимеделта објекат

Објекат тимеделта је објекат који представља временску разлику између два датума и времена, или протекло време. Има информације у данима, секундама и микросекундама и може му се приступити помоћу атрибута дани, секунде и микросекунде. Такође је могуће добити укупан број секунди помоћу тотал_сецондс() методе.

Одузмите објекте датума и времена да бисте креирали објекат тимеделта.

Одузимање објеката датума и времена један од другог даје тимеделта објекат.

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(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

Сви су опциони, а ако су изостављени, постављају се на 0.

Имајте на уму да објекат тимеделта садржи само следеће информације.

  • неколико дана: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

Одузимање и сабирање коришћењем тимеделта објеката

Објекат тимеделта се може користити са објектима датетиме и дате за обављање операција као што су одузимање и сабирање. На пример, можете лако израчунати и добити датум пре недељу дана или 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():Конверзија из датума и времена у стринг

Метод стрфтиме() за објекте датетиме и дате може се користити за претварање информација о датуму и времену (датум и време) у стринг у било ком формату формата.

код за форматирање

Погледајте званичну документацију у наставку за доступне кодове за форматирање.

Главни кодови за форматирање су наведени у наставку.

  • %d:Дан у месецу у децималном запису са попуњеном нулом.
  • %m:Месец у децималним записима са попуњеном нулом.
  • %y:Последње две цифре године у децималном запису са нулом.
  • %Y:Четири цифре године у децималном запису са попуњеном нулом.
  • %H:Када се изрази у децималним записима са попуњеном нулом (24-часовни запис)
  • %I:Када се изрази у децималним записима са попуњеном нулом (12-часовни запис)
  • %M:За децимални запис са попуњеном нулом.
  • %S:Секунде у децималним записима са попуњеном нулом.
  • %f:Микросекунде (6 цифара) у децималним записима са 0 попуњеним.
  • %A:Назив дана у недељи за локалитет
  • %a:Назив дана за локал (скраћени облик)
  • %B:Локални назив месеца
  • %b:Локални назив месеца (скраћени облик)
  • %j:Дан у години у децималним записима са нултим попуњавањем.
  • %U:Број недеље у години у децималним записима са нултим попуњавањем (седмица почиње у недељу)
  • %W:Број недеље у години у децималним записима са нултим попуњавањем (седмица почиње у понедељак)

Следећи кодови за форматирање за називе дана и месеца могу се добити у различитим стринговима у зависности од локалитета.

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

Постоји и посебна метода за низове формата ИСО 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

Ако желите да добијете број уместо стринга, само га конвертујте у цео број помоћу инт().

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

У комбинацији са објектом тимеделта, лако је креирати, на пример, листу двонедељних датума у ​​било ком формату.

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():Конверзија из стринга у датум и време

датетиме стрптиме() се може користити за креирање објекта датетиме од стринга датума или времена. Неопходно је навести стринг за форматирање који одговара оригиналном низу.

Постоји и наменски метод за ИСО 8601 низове (Питхон 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'>

Коришћењем методе стрфтиме() на преузетом објекту датетиме, можете представити датум и време у другачијем формату од оригиналног стринга.

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

Ако га конвертујете у објекат датума и времена, такође можете да изводите операције са објектима тимеделта, тако да, на пример, можете да генеришете низ датума пре 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