Pretvaranje datuma i vremena u i iz nizova u Pythonu datetime (strftime, strptime)

Poslovanje

Pythonova standardna knjižnica datetime može se koristiti za obradu datuma i vremena (datuma, vremena i vremena). Metode strftime() i strptime(), koje pretvaraju datume i vrijeme u nizove i iz njih, mogu se koristiti za manipuliranje datumima i vremenom u različitim formatima.

Također može izvoditi operacije kao što su oduzimanje i zbrajanje. Na primjer, možete jednostavno izračunati i dobiti datum prije 10 dana ili 3 tjedna od sada, ili vrijeme za 50 minuta.

Prvo ćemo opisati sljedeće klase objekata dostupnih u modulu datetime.

  • datetime.datetime:Datum i vrijeme (datum i vrijeme)
  • datetime.date:Datum
  • datetime.time:Vrijeme
  • datetime.timedelta:Vremenska razlika i proteklo vrijeme

Također su objašnjene metode strftime() i strptime(), koje međusobno pretvaraju datum/vrijeme i niz.

  • datetimeobjekt
    • datetime.now():Današnji datum, trenutno vrijeme
    • datetimeKonstruktor objekata
    • Pretvaranje objekta datuma i vremena u objekt datuma
  • dateobjekt
    • date.today():Današnji datum
    • Konstruktor za objekt datuma
  • timeobjekt
    • Konstruktor za vremenski objekt
  • timedeltaobjekt
    • Oduzmite objekte datuma i vremena da biste stvorili objekte timedelta.
    • Konstruktor za timedelta objekt
    • Oduzimanje i zbrajanje korištenjem timedelta objekata
  • strftime():Pretvorba iz datuma i vremena u niz
  • strptime():Pretvorba iz niza u datum i vrijeme

U standardnu ​​biblioteku također je uključen i kalendarski modul koji generira kalendare u običnom tekstu ili HTML formatu.

objekt datuma i vremena

Objekt datetime je objekt koji ima podatke o datumu (godina, mjesec, dan) i vremenu (sat, minuta, sekunda, mikrosekunda). Tim informacijama možete pristupiti sa sljedećim atributima.

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

datetime.now():Današnji datum, trenutno vrijeme

datetime.now() će vam dati objekt datetime s današnjim datumom (trenutni datum) i trenutnim vremenom.

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

Konstruktor za objekt datuma i vremena

Također je moguće generirati objekte datuma i vremena za proizvoljne datume i vremena.

Konstruktor za objekt datetime je sljedeći.

datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

Sljedeće vrijednosti su obavezne, a druge se mogu izostaviti. Ako se izostavi, zadana vrijednost je 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

Pretvaranje objekta datuma i vremena u objekt datuma

Objekt datetime može se pretvoriti u objekt datuma metodom date(), kao što je opisano u nastavku.

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

objekt datuma

Objekt datuma je objekt koji sadrži informacije o datumu (godina, mjesec, dan). Može se pristupiti atributima godina, mjesec i dan.

date.today():Današnji datum

Objekt datuma trenutnog datuma (današnji datum) može se dobiti pomoću 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

Konstruktor za objekt datuma

Konstruktor za objekt datuma je sljedeći

date(year, month, day)

Sve su obavezne i ne mogu se izostaviti.

d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01

print(d.month)
# 2

vremenski objekt

Objekt vremena je objekt koji sadrži informacije o vremenu (sati, minute, sekunde i mikrosekunde). Može se pristupiti pomoću atributa sat, minuta, sekunda i mikrosekunda.

Konstruktor za vremenski objekt

Konstruktor vremenskog objekta je sljedeći.

time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

Svi su izborni, a ako su izostavljeni, postavljaju se na 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 objekt

Timedelta objekt je objekt koji predstavlja vremensku razliku između dva datuma i vremena, odnosno proteklo vrijeme. Ima informacije u danima, sekundama i mikrosekundama, a može mu se pristupiti pomoću atributa dani, sekunde i mikrosekunde. Također je moguće dobiti ukupan broj sekundi pomoću total_seconds() metode.

Oduzmite objekte datetime i date da biste stvorili timedelta objekt.

Oduzimanjem datetime objekata jedan od drugog daje timedelta objekt.

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

Oduzimanje objekata datuma jedan od drugog na sličan način daje timedelta objekt.

Konstruktor za timedelta objekt

Konstruktor objekta timedelta je sljedeći

timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

Svi su izborni, a ako su izostavljeni, postavljaju se na 0.

Imajte na umu da timedelta objekt sadrži samo sljedeće informacije.

  • nekoliko dana:days
  • broj sekundi:seconds
  • broj mikrosekundi:microseconds

Na primjer, sljedeća dva su jednaka

  • weeks=1
  • days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00

print(td_1w.days)
# 7

Oduzimanje i zbrajanje korištenjem timedelta objekata

Objekt timedelta može se koristiti s objektima datetime i date za izvođenje operacija kao što su oduzimanje i zbrajanje. Na primjer, možete jednostavno izračunati i dobiti datum prije tjedan dana ili 10 dana od sada, ili vrijeme za 50 minuta.

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

Također se može koristiti za izračunavanje broja dana do određenog datuma.

d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00

print(td.days)
# 903

strftime():Pretvorba iz datuma i vremena u niz

Metoda strftime() objekata datetime i date može se koristiti za pretvaranje podataka o datumu i vremenu (datum i vrijeme) u niz u bilo kojem formatu.

kod za formatiranje

Pogledajte službenu dokumentaciju u nastavku za dostupne kodove za formatiranje.

Glavni kodovi oblikovanja navedeni su u nastavku.

  • %d:Dan u mjesecu u decimalnom zapisu s popunjenom nulom.
  • %m:Mjesec u decimalnom zapisu s ispunjenom nulom.
  • %y:Zadnje dvije znamenke godine u decimalnom zapisu s nulom.
  • %Y:Četiri znamenke godine u decimalnom zapisu s ispunjenom nulom.
  • %H:Kada je izraženo decimalnim zapisom s popunjenom nulom (24-satni zapis)
  • %I:Kada je izraženo decimalnim zapisom s popunjenom nulom (12-satni zapis)
  • %M:Za decimalni zapis s ispunjenom nulom.
  • %S:Sekunde u decimalnim zapisima s ispunjenom nulom.
  • %f:Mikrosekunde (6 znamenki) u decimalnim zapisima s popunjenim 0.
  • %A:Naziv dana u tjednu za mjesto
  • %a:Naziv dana za mjesto (skraćeni oblik)
  • %B:Lokalni naziv mjeseca
  • %b:Lokalni naziv mjeseca (skraćeni oblik)
  • %j:Dan u godini u decimalnim zapisima s nultim popunjavanjem.
  • %U:Broj tjedna u godini u decimalnom zapisu s nultim popunjavanjem (tjedan počinje u nedjelju)
  • %W:Broj tjedna u godini u decimalnom zapisu s nultim popunjavanjem (tjedan počinje u ponedjeljak)

Sljedeći kodovi oblikovanja za nazive dana i mjeseca mogu se dobiti u različitim nizovima ovisno o mjestu.

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

Postoji i posebna metoda za nizove formata ISO 8601.

Uzorak koda

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

Ako želite dobiti broj umjesto niza, jednostavno ga pretvorite u cijeli broj pomoću int().

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

U kombinaciji s timedelta objektom, lako je stvoriti, na primjer, popis dvotjednih datuma u bilo kojem formatu.

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

Korištenje zapisa za razumijevanje popisa je pametnije.

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():Pretvorba iz niza u datum i vrijeme

datetime strptime() može se koristiti za kreiranje objekta datetime iz datumskog ili vremenskog niza. Potrebno je navesti niz za formatiranje koji odgovara izvornom nizu.

Postoji i posebna metoda za ISO 8601 nizove (Python 3.7 ili noviji).

Uzorak koda

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

Korištenjem metode strftime() na dohvaćenom objektu datetime, možete predstaviti datum i vrijeme u drugačijem formatu od izvornog niza.

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

Ako ga pretvorite u objekt datuma i vremena, također možete izvoditi operacije s timedelta objektima, tako da, na primjer, možete generirati niz datuma prije 10 dana u istom formatu.

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