PHP týden První novoroční výprodej
80 % bodů zdarma díky akci Black Friday!
Pouze tento týden sleva až 80 % na e-learning týkající se PHP

Lekce 11 - Knihovna datetime pro Python

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Datum a čas v Pythonu, jsme si představili knihovny time a calendar. V tomto Python tutoriálu se podíváme na práci s modulem datetime, který se vedle modulů time a calendar používá pro práci s datem a časem a podporuje příjemnější, objektový přístup.

Datetime

Knihovnu datetime musíme vždy na začátku programu naimportovat:

import datetime

Tato knihovna nabízí více objektový přístup než ten, který jsme si ukazovali minule s time. Pracuje totiž s vlastními specializovanými datetime objekty. To nám snadno umožní od sebe jednotlivá data například odečítat nebo je navzájem porovnávat bez nutnosti zaobírání se počtem sekund od roku 1970 nebo indexy v tuple. Nyní si ukážeme, jak se tyto objekty zakládají a jak s nimi dál pracovat v jednotlivých modulech.

datetime()

Velmi významnou třídou v této knihovně je stejnojmenná třída datetime a její metoda datetime(). Tu můžeme používat pro vytváření instancí, se kterými budeme dále pracovat. Také poskytuje užitečné metody, které budeme hojně využívat.

Vytvořme si instanci data a času z určitého roku, měsíce a dne:

import datetime

# datetime.datetime(rok, měsíc, den, hodina, minuta, sekunda, mikrosekunda)
d1 = datetime.datetime(2019, 11, 24)
print(d1)

Pokud bychom chtěli používat pouze část knihovny, která se vztahuje ke třídě datetime, můžeme pozměnit import do varianty:

from datetime import datetime

d1 = datetime(2019,11,24)
print(d1)

Metody na datetime

Dále si ukážeme několik metod na třídě datetime.

now()

Metoda now() nám jednoduše umožní získat aktuální datum a čas:

import datetime

now = datetime.datetime.now()
print(now)

Tato metoda vytvoří instanci předem zmíněné třídy datetime.datetime, ve které můžeme najít aktuální informace. K jednotlivým údajům se dostaneme velmi lehce a to pomocí atributů year, month, day, hour, minute a second:

import datetime

now = datetime.datetime.now()

print("Datum:")
print("Rok: {}".format(now.year))
print("Měsíc: {}".format(now.month))
print("Den: {}".format(now.day))
print("Čas:")
print("{}:{}:{}".format(now.hour, now.minute, now.second))

weekday()

Naši partneři možná hledají právě tebe!

Metodu opět voláme na předem vytvořené instanci a zjistí nám její den v týdnu. Zkusme si ji zavolat na aktuálním datu a času, který také již umíme zjistit:

import datetime

now = datetime.datetime.now()

#Seznam dnů v týdnu s indexy
dny_v_tydnu={ 0:"pondělí", 1:"úterý", 2:"středa", 3:"čtvrtek", 4:"pátek", 5:"sobota", 6:"neděle" }

den = dny_v_tydnu[now.weekday()]
print("Den v týdnu: {}".format(den))

Opět zde musíme dát pozor na správné značení: Pondělí = 0 - Neděle = 6.

strftime()

Tato metoda nám umožní vytvořit použitelný a lehce čitelný formát data a času pro uživatele:

import datetime

now = datetime.datetime.now()

text1 = now.strftime("%H:%M:%S")
text2 = now.strftime("Hodin:%H, Minut:%M, Sekund:%S")

text3 = now.strftime("Den:%d, Měsíc:%m, Rok:%Y")

print(text1)
print(text2)
print(text3)

Při použití musíme uvnitř metody strftime() definovat, jak má náš chtěný výstup vypadat. Používá se 6 specifických znaků, které ukazují, co se má kde vypsat. Jsou to:

  • %d - den
  • %m - měsíc
  • %Y - rok
  • %H - hodina
  • %M - minuta
  • %S - sekunda
  • %a - zkratka dne v týdnu
  • %A - den v týdnu
  • %w - den v týdnu - číselná hodnota
  • %b - zkratka měsíce (ne číselná podoba)
  • %B - měsíc (celý název)

strptime()

Opačným způsobem pracuje funkce strptime(). Do té vložíme datum a čas zapsaný v textové podobě, např. vložený uživatelem. Poté musíme specifikovat, jaký formát je použit a funkce nám vrátí instanci datetime:

import datetime

#Předem zvolená informace
info = "25.5.2000 12:35"

date = datetime.datetime.strptime(info, "%d.%m.%Y %H:%M")
print(date)

V této metodě se pro nás ukrývá mnoho možností, a je pouze na nás, jaký formát pro získávání data a času si zvolíme.

Práce s daty

To, že vše ukládáme jako instance té samé třídy, nám přináší při práci s daty mnoho výhod.

Aritmetické operace

S daty můžeme provádět například základní matematické operace jako je sčítání a odčítání:

import datetime

#Založit aktuální datum
now = datetime.datetime.now()

#Založit datum v 1.1.2000
d2000 = datetime.datetime(2000, 1, 1)

d3 = now - d2000
print(d3)

V tomto případě nám datum d3 obsahuje počet dnů, hodin, minut a sekund, které uběhly od začátku 2. tisíciletí do dnešního dne. Za podobným účelem můžeme ještě využít funkci total_seconds(), která vrátí počet sekund uběhlých mezi danými dvěma intervaly.

Porovnávání

Dvě data můžeme mezi sebou i porovnávat a to obyčejnými operátory, které bychom použili při porovnávání čísel:

import datetime

# Založí aktuální datum
now = datetime.datetime.now()

# Založí datum v 1.1.2000
d2000 = datetime.datetime(2000, 1, 1)

print(now > d2000) # Vrátí True
print(now == d2000) # Vrátí False

timedelta

Pro další možnosti práce s časem je zde timedelta. Pokud od sebe dvě data například odečteme, získáme instanci třídy datetime.timedelta, což není konkrétní datum, ale interval (rozdíl) mezi nějakými dvěma daty. Tento objekt si můžeme také sami založit. Můžeme tak třeba lehce zjistit, jaký den bude za 10 dní:

import datetime

# Dnešní den
now = datetime.datetime.now()

print("Dnešní datum: {}".format(now))

# Objekt timedelta s posunem o 10 dní
td10 = datetime.timedelta(10)

d1 = now + td10
d2 = now - td10
print("Datum za 10 dní: {}".format(d1))
print("Datum před 10 dny: {}".format(d2))

Konstruktor timedelta() nemusí být vždy použit s celými dny. Pokud chceme pracovat s jinou hodnotou, máme tu možnost. Při zakládání objektu timedelta můžeme navolit mnoho parametrů:
 datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

Instance timedelta má na sobě vlastnosti jako days a další. Bohužel na sobě nemá počet let, protože rok není plnohodnotná časová jednotka a nemá pevně daný počet dní (některé roky jsou přestupné). Více o této problematice si vyzkoušíme v cvičení.

replace()

Velmi užitečná je také metoda replace(). Ta nám, podobně jako timedelta(), umožňuje měnit již vytvořené časové objekty. Zvyšme např. rok a den na objektu datetime o 1:

import datetime

# Dnešní den
now = datetime.datetime.now()

r1 = now.replace(year = now.year + 1)
d1 = now.replace(day =  now.day + 1)

print(r1.date())
print(d1.date())

Na jakýkoli časový objekt můžeme použít metodu replace(). V ní musíme specifikovat co chceme měnit (např. year = ...) a říci na jakou hodnotu se má změnit. Jde pouze o změnu hodnoty již založené proměnné.

date()

Všechny metody, které jsme si zmínili dříve, pracují s objekty datetime (datum a čas). Pokud bychom chtěli využívat pouze datum, je vhodné místo tohoto používat objekt date. Ten poté nemá informaci o datu a času, která by nám jinak mohla znepříjemňovat např. porovnávání. Objekt date získáme z objektu datetime pomocí metody date():

import datetime

#Dnešní den
now = datetime.date.today()

print("Dnešní datum: {}".format(now))

d = datetime.date(2000, 12, 24)
print("Rok: {}".format(d.year))
print("Měsíc: {}".format(d.month))
print("Den: {}".format(d.day))

Není na tom nic složitého. Jediná změna od datetime je v použití metody today(), která přímo nahrazuje now(). Veškeré metody používané výše jsou s tímto formátem naprosto kompatibilní. Pokud tedy ve svých programech nepotřebujeme časové informace, můžeme se jich poměrně lehce zbavit.

V příští lekci, Vlastnosti v Pythonu, se budeme zabývat vlastnostmi v Pythonu.


 

 

Aktivity (7)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!