Konverzia dátumov a časov do a z reťazcov v jazyku Python datetime (strftime, strptime)

obchodné

Na spracovanie dátumov a časov (dátumov, časov a časov) možno použiť štandardnú knižnicu Datetime jazyka Python. Metódy strftime() a strptime(), ktoré konvertujú dátumy a časy na reťazce a z reťazcov, možno použiť na manipuláciu s dátumami a časmi v rôznych formátoch.

Môže tiež vykonávať operácie, ako je odčítanie a sčítanie. Môžete napríklad ľahko vypočítať a získať dátum spred 10 dní alebo za 3 týždne, alebo čas za 50 minút.

Najprv si popíšeme nasledujúce triedy objektov, ktoré sú k dispozícii v module datetime.

  • datetime.datetime:Dátum a čas (dátum a čas)
  • datetime.date:Dátum
  • datetime.time:Čas
  • datetime.timedelta:Časový rozdiel a uplynulý čas

Vysvetlené sú aj metódy strftime() a strptime(), ktoré navzájom konvertujú date\time a string.

  • datetimeobjekt
    • datetime.now():Dnešný dátum, aktuálny čas
    • datetimeKonštruktor objektu
    • Konverzia objektu datetime na objekt date
  • dateobjekt
    • date.today():Dnešný dátum
    • Konštruktor pre objekt date
  • timeobjekt
    • Konštruktor pre objekt času
  • timedeltaobjekt
    • Odčítaním objektov datetime a date vytvoríte objekty timedelta.
    • Konštruktor pre objekt timedelta
    • Odčítanie a sčítanie pomocou objektov timedelta
  • strftime():Prevod dátumu a času na reťazec
  • strptime():Prevod z reťazca na dátum a čas

Súčasťou štandardnej knižnice je aj modul kalendára, ktorý generuje kalendáre v textovom alebo HTML formáte.

objekt datetime

Objekt datetime je objekt, ktorý obsahuje informácie o dátume (rok, mesiac, deň) a čase (hodina, minúta, sekunda, mikrosekunda). K týmto informáciám môžete pristupovať pomocou nasledujúcich atribútov.

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

datetime.now(): Dnešný dátum, aktuálny čas

datetime.now() vám poskytne objekt datetime s dnešným dátumom (aktuálny dátum) a aktuálnym časom.

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

Konštruktor pre objekt datetime

Je tiež možné generovať objekty datetime pre ľubovoľné dátumy a časy.

Konštruktor pre objekt datetime je nasledujúci.

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

Nasledujúce hodnoty sú povinné a ostatné je možné vynechať. Ak sú vynechané, predvolená hodnota 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

Konverzia objektu datetime na objekt date

Objekt datetime možno previesť na objekt date pomocou metódy date(), ako je opísané ďalej.

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

dátum objektu

Objekt dátumu je objekt, ktorý obsahuje informácie o dátume (rok, mesiac, deň). Prístup k nemu je možný pomocou atribútov rok, mesiac a deň.

date.today(): Dnešný dátum

Objekt dátumu aktuálneho dátumu (dnešný dátum) možno získať pomocou 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

Konštruktor pre objekt date

Konštruktor pre objekt date je nasledujúci

date(year, month, day)

Všetky sú povinné a nemožno ich vynechať.

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

print(d.month)
# 2

časový objekt

Objekt času je objekt, ktorý obsahuje informácie o čase (hodiny, minúty, sekundy a mikrosekundy). Prístup k nemu je možný pomocou atribútov hodina, minúta, sekunda a mikrosekunda.

Konštruktor pre objekt času

Konštruktor časového objektu je nasledujúci.

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

Všetky sú nepovinné, a ak sú vynechané, sú nastavené 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

objekt timedelta

Objekt timedelta je objekt, ktorý predstavuje časový rozdiel medzi dvoma dátumami a časmi alebo uplynulý čas. Obsahuje informácie v dňoch, sekundách a mikrosekundách a možno k nemu pristupovať pomocou atribútov days, seconds a microseconds. Pomocou metódy total_seconds() je možné získať aj celkový počet sekúnd.

Odčítanie objektov datetime a date na vytvorenie objektu timedelta.

Odčítaním objektov datetime od seba získate objekt 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

Odčítaním dátumových objektov od seba navzájom sa podobne získa objekt timedelta.

Konštruktor pre objekt timedelta

Konštruktor objektu timedelta je nasledujúci

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

Všetky sú nepovinné, a ak sú vynechané, sú nastavené na 0.

Všimnite si, že objekt timedelta obsahuje iba tieto informácie.

  • niekoľko dní: days
  • počet sekúnd: seconds
  • počet mikrosekúnd: microseconds

Napríklad tieto dve sú rovnaké

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

print(td_1w.days)
# 7

Odčítanie a sčítanie pomocou objektov timedelta

Objekt timedelta možno použiť s objektmi datetime a date na vykonávanie operácií, ako je odčítanie a sčítanie. Môžete napríklad jednoducho vypočítať a získať dátum spred jedného týždňa alebo za 10 dní, alebo čas za 50 minút.

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

Môže sa použiť aj na výpočet počtu dní do určitého dátumu.

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

print(td.days)
# 903

strftime(): Prevod dátumu a času na reťazec

Metódu strftime() objektov datetime a date možno použiť na prevod informácií o dátume a čase (dátum a čas) na reťazec v ľubovoľnom formáte.

formátovací kód

Dostupné kódy formátovania nájdete v oficiálnej dokumentácii nižšie.

Hlavné kódy formátovania sú uvedené nižšie.

  • %d:Deň mesiaca v desatinnom zápise s vyplnenou nulou.
  • %m:Mesiac v desatinnom zápise s vyplnenou nulou.
  • %y:Posledné dve číslice roku v desatinnom zápise s nulou.
  • %Y:Štyri číslice roku v desatinnom zápise s vyplnenou nulou.
  • %H:Pri vyjadrení v desatinnom zápise s vyplnenou nulou (24-hodinový zápis)
  • %I:Pri vyjadrení v desatinnom zápise s vyplnenou nulou (12-hodinový zápis)
  • %M:Pre desatinný zápis s vyplnenou nulou.
  • %S:Sekundy v desatinnom zápise s vyplnenou nulou.
  • %f:Mikrosekundy (6 číslic) v desatinnom zápise s vyplnenou 0.
  • %A:Názov dňa v týždni pre lokalitu
  • %a:Názov dňa pre lokalitu (skrátená forma)
  • %B:Názov mesiaca lokality
  • %b:Názov mesiaca lokality (skrátená forma)
  • %j:Deň v roku v desatinnom zápise s nulovou výplňou.
  • %U:Číslo týždňa v roku v desatinnom zápise s nulovou výplňou (týždeň začína v nedeľu)
  • %W:Číslo týždňa v roku v desatinnom zápise s nulovou výplňou (týždeň začína v pondelok)

Nasledujúce formátovacie kódy pre názvy dní a mesiacov možno získať v rôznych reťazcoch v závislosti od lokality.

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

Existuje aj špeciálna metóda pre reťazce vo formáte ISO 8601.

Vzorový kód

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

Ak chcete namiesto reťazca získať číslo, stačí ho previesť na celé číslo pomocou funkcie int().

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

V kombinácii s objektom timedelta je možné ľahko vytvoriť napríklad zoznam dvojtýždňových dátumov v ľubovoľnom formáte.

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

Použitie zápisu s porozumením zoznamu je rozumnejšie.

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(): Prevod z reťazca na dátum a čas

datetime strptime() možno použiť na vytvorenie objektu datetime z reťazca dátumu alebo času. Je potrebné zadať formátovací reťazec zodpovedajúci pôvodnému reťazcu.

Existuje aj špeciálna metóda pre reťazce ISO 8601 (Python 3.7 alebo novší).

Vzorový kód

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

Pomocou metódy strftime() na získanom objekte datetime môžete reprezentovať dátum a čas v inom formáte ako pôvodný reťazec.

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

Ak ho prevediete na objekt datetime, môžete vykonávať operácie aj s objektmi timedelta, takže môžete napríklad vygenerovať reťazec dátumu spred 10 dní v rovnakom formáte.

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