Převod dat a časů na řetězce a z řetězců v jazyce Python datetime (strftime, strptime)

Podnikání

Ke zpracování dat a časů (datumů, časů a časů) lze použít standardní knihovnu datetime jazyka Python. Metody strftime() a strptime(), které převádějí data a časy na řetězce a z řetězců, lze použít k manipulaci s daty a časy v různých formátech.

Umí také provádět operace, jako je odčítání a sčítání. Můžete například snadno vypočítat a získat datum před 10 dny nebo za 3 týdny nebo čas za 50 minut.

Nejprve popíšeme následující třídy objektů dostupných v modulu datetime.

  • datetime.datetime:Datum a čas (datum a čas)
  • datetime.date:Datum
  • datetime.time:Čas
  • datetime.timedelta:Časový rozdíl a uplynulý čas

Vysvětleny jsou také metody strftime() a strptime(), které vzájemně převádějí data\time a řetězce.

  • datetimeobjekt
    • datetime.now():Dnešní datum, aktuální čas
    • datetimeKonstruktor objektu
    • Převod objektu datetime na objekt date
  • dateobjekt
    • date.today():Dnešní datum
    • Konstruktor objektu date
  • timeobjekt
    • Konstruktor objektu time
  • timedeltaobjekt
    • Odečtením objektů datetime a date vytvoříte objekty timedelta.
    • Konstruktor objektu timedelta
    • Odčítání a sčítání pomocí objektů timedelta
  • strftime():Převod data a času na řetězec
  • strptime():Převod z řetězce na datum a čas

Součástí standardní knihovny je také modul kalendáře, který generuje kalendáře ve formátu prostého textu nebo HTML.

objekt datetime

Objekt datetime je objekt, který obsahuje informace o datu (rok, měsíc, den) a čase (hodina, minuta, sekunda, mikrosekunda). K těmto informacím můžete přistupovat pomocí následujících atributů.

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

datetime.now(): Dnešní datum, aktuální čas

datetime.now() vám poskytne objekt datetime s dnešním datem (aktuálním datem) a aktuálním časem.

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 pro objekt datetime

Je také možné generovat objekty datetime pro libovolná data a časy.

Konstruktor objektu datetime je následující.

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

Následující hodnoty jsou povinné a ostatní lze vynechat. Pokud jsou vynechány, je výchozí hodnotou 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

Převod objektu datetime na objekt date

Objekt datetime lze převést na objekt date pomocí metody date(), jak je popsáno dále.

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 datum

Objekt datum je objekt, který obsahuje informace o datu (rok, měsíc, den). Lze k němu přistupovat pomocí atributů rok, měsíc a den.

date.today(): Dnešní datum

Objekt data aktuálního data (dnešní datum) lze získat pomocí funkce 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 objektu date

Konstruktor objektu date je následující

date(year, month, day)

Všechny jsou povinné a nelze je vynechat.

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

print(d.month)
# 2

časový objekt

Objekt času je objekt, který obsahuje informace o čase (hodiny, minuty, sekundy a mikrosekundy). Lze k němu přistupovat pomocí atributů hodina, minuta, sekunda a mikrosekunda.

Konstruktor objektu time

Konstruktor objektu time je následující.

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

Všechny jsou nepovinné, a pokud jsou vynechány, jsou nastaveny 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, který představuje časový rozdíl mezi dvěma daty a časy nebo uplynulý čas. Obsahuje informace ve dnech, sekundách a mikrosekundách a lze k němu přistupovat pomocí atributů days, seconds a microseconds. Pomocí metody total_seconds() lze také získat celkový počet sekund.

Odečtením objektů datetime a date vytvoříte objekt timedelta.

Odečtením objektů datetime od sebe získáte 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

Odečtením datových objektů od sebe navzájem se obdobně získá objekt timedelta.

Konstruktor objektu timedelta

Konstruktor objektu timedelta je následující

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

Všechny jsou nepovinné, a pokud jsou vynechány, jsou nastaveny na 0.

Všimněte si, že objekt timedelta obsahuje pouze následující informace.

  • několik dní: days
  • počet sekund: seconds
  • počet mikrosekund: microseconds

Například následující dvě jsou si rovny

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

print(td_1w.days)
# 7

Odčítání a sčítání pomocí objektů timedelta

Objekt timedelta lze použít s objekty datetime a date k provádění operací, jako je odečítání a sčítání. Můžete například snadno vypočítat a získat datum před týdnem nebo za 10 dní nebo čas za 50 minut.

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

Lze jej také použít k výpočtu počtu dní do určitého data.

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

print(td.days)
# 903

strftime(): Převod data a času na řetězec

Metodu strftime() objektů datetime a date lze použít k převodu informací o datu a čase (datum a čas) na řetězec v libovolném formátu.

formátovací kód

Dostupné formátovací kódy naleznete v oficiální dokumentaci níže.

Hlavní formátovací kódy jsou uvedeny níže.

  • %d:Den měsíce v desítkové soustavě s vyplněnou nulou.
  • %m:Měsíc v desítkové soustavě s vyplněnou nulou.
  • %y:Poslední dvě číslice roku v desetinném zápisu s nulou.
  • %Y:Čtyři číslice roku v desítkové soustavě s vyplněnou nulou.
  • %H:Při vyjádření v desetinném zápisu s vyplněnou nulou (24hodinový zápis)
  • %I:Při vyjádření v desetinném zápisu s vyplněnou nulou (12hodinový zápis)
  • %M:Pro desetinný zápis s vyplněnou nulou.
  • %S:Sekundy v desítkové soustavě s vyplněnou nulou.
  • %f:Mikrosekundy (6 číslic) v desítkové soustavě s vyplněnou 0.
  • %A:Název dne v týdnu pro danou lokalitu
  • %a:Název dne pro lokalitu (zkrácená forma)
  • %B:Název měsíce lokality
  • %b:Název měsíce lokality (zkrácená forma)
  • %j:Den v roce v desítkové soustavě s nulovou výplní.
  • %U:Číslo týdne v roce v desítkové soustavě s nulovou výplní (týden začíná v neděli).
  • %W:Číslo týdne v roce v desítkové soustavě s nulovou výplní (týden začíná v pondělí).

Následující formátovací kódy pro názvy dnů a měsíců lze získat v různých řetězcích v závislosti na místním prostředí.

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

K dispozici je také speciální metoda pro řetězce ve formátu 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

Pokud chcete místo řetězce získat číslo, stačí jej převést na celé číslo pomocí funkce int().

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

V kombinaci s objektem timedelta lze snadno vytvořit například seznam dvoutýdenních dat v libovolném formátu.

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žití zápisu s porozuměním seznamu je chytřejší.

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(): Převod z řetězce na datum a čas

datetime strptime() lze použít k vytvoření objektu datetime z řetězce data nebo času. Je nutné zadat formátovací řetězec odpovídající původnímu řetězci.

Existuje také speciální metoda pro řetězce ISO 8601 (Python 3.7 nebo novější).

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

Pomocí metody strftime() na načteném objektu datetime můžete reprezentovat datum a čas v jiném formátu než původní řetězec.

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

Pokud jej převedete na objekt datetime, můžete také provádět operace s objekty timedelta, takže můžete například vygenerovat řetězec data před 10 dny ve stejném formátu.

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