Změna datového typu na jiný je klíčová operace ve všech programovacích jazycích. Téměř všechny jazyky umožňují konverzi mezi standardními datovými typy.
U uživatelsky definovaných typů, jako je datum a čas, jsou zapotřebí dodatečné moduly. Tyto moduly jsou nezbytné především pro manipulaci s datem a časem, neboť práce s nimi nikdy nebyla pro programátory triviální. Naštěstí Python obsahuje integrované moduly pro práci s datem a časem.
V tomto článku si ukážeme, jak v Pythonu převést textový řetězec reprezentující datum a čas na objekt typu datetime pomocí různých modulů. Než se do toho pustíme, podívejme se, proč je taková konverze vlastně potřebná.
Proč je nutné převádět řetězec datetime na objekt datetime?
Práce s daty, pokud jsou uložena jako textové řetězce, je komplikovaná. Převedením na formát datetime se s nimi mnohem snadněji pracuje. Data v řetězcích se chovají jako běžné texty, nemají žádné speciální metody pro manipulaci s daty, pouze obecné řetězcové operace, které při práci s daty nejsou užitečné.
Představme si, že chceme porovnat dvě data. Pokud jsou uložena jako řetězce, nemůžeme je přímo srovnat. Avšak pokud jsou převedena na objekty datetime, můžeme používat standardní operátory porovnávání jako u čísel.
To je jen jeden z příkladů, kdy převod na objekt datetime zjednodušuje práci. Existuje mnoho dalších situací, jako je sčítání, odečítání dat, zpracování časových pásem, kde se převod řetězce datetime na objekt datetime ukazuje jako nesmírně užitečný.
Nyní se podíváme na různé způsoby, jak převést řetězec s datem a časem na objekt datetime. Využijeme k tomu vestavěný modul datetime a externí knihovnu dateutil. Začneme s modulem datetime.
Použití modulu datetime
Datetime je vestavěný modul v Pythonu, určený pro práci s daty a časy. Obsahuje několik tříd usnadňujících manipulaci s daty a časem. Pro konverzi použijeme třídu datetime.datetime.
Třída datetime.datetime má mnoho metod. Nás bude zajímat metoda strptime, která je klíčová pro konverzi. Pojďme se na ni blíže podívat.
datetime.strptime
Metoda datetime.strptime se používá pro převod řetězce reprezentujícího datum a čas na objekt datetime. Vyžaduje dva argumenty: řetězec s datem a časem a formát tohoto řetězce. Výsledkem je objekt datetime.
Uveďme si příklad:
from datetime import datetime string = "19-12-2022 09:37:56 PM" formatting = "%d-%m-%Y %I:%M:%S %p" print(datetime.strptime(string, formatting))
Spuštěním tohoto kódu získáte následující výstup:
2022-12-19 21:37:56
Vzali jsme textový řetězec reprezentující datum a čas a převedli ho na objekt datetime pomocí metody datetime.strptime. Je klíčové, aby formátovací řetězec přesně odpovídal formátu vstupního řetězce. Pokud se neshodují, může dojít k chybě nebo nesprávnému výsledku.
Použili jsme specifické formátovací kódy pro datum a čas. Všechny dostupné formátovací kódy naleznete v dokumentaci.
Metoda datetime.strptime vrací kompletní datum a čas. Pokud potřebujete získat datum a čas odděleně, můžete použít metody date() a time() objektu datetime. Podívejme se na příklad:
from datetime import datetime string = "19-12-2022 09:37:56 PM" formatting = "%d-%m-%Y %I:%M:%S %p" ## získání data samostatně print("Datum:", datetime.strptime(string, formatting).date()) ## získání času samostatně print("Čas:", datetime.strptime(string, formatting).time())
Po spuštění tohoto kódu získáte následující výstup:
Datum: 2022-12-19 Čas: 21:37:56
Metody date() a time() vrací příslušné objekty typu date a time. I tyto objekty mají své vlastní metody pro manipulaci s daty a časy.
Ve výše uvedených příkladech jsme poskytli správné formátovací řetězce. Pokud bychom je nezadali správně, dojde k chybě. Podívejme se, jak se s takovými chybami vypořádat. Spusťte následující kód:
from datetime import datetime string = "19:12:2022 09:37:56 PM" formatting = "%d-%m-%Y %I:%M:%S %p" print(datetime.strptime(string, formatting))
Tento kód vyvolá chybu, protože formát vstupního řetězce se neshoduje s formátovacím řetězcem. Pro ošetření těchto chyb můžeme použít blok try-except. Upravíme kód následovně:
from datetime import datetime try: string = "19:12:2022 09:37:56 PM" formatting = "%d-%m-%Y %I:%M:%S %p" print(datetime.strptime(string, formatting)) except ValueError as error: print(error)
Nyní se po spuštění kódu zobrazí chybová zpráva bez přerušení běhu programu:
time data '19:12:2022 09:37:56 PM' does not match format '%d-%m-%Y %I:%M:%S %p'
Podobně můžeme použít try-except i u metody parser.parse, kterou si ukážeme dále. Pomůže nám to vyhnout se přerušení běhu programu v důsledku chyby. I když to není specificky součástí tohoto návodu, je dobré si to pamatovat pro váš vlastní kód.
To je vše k modulu datetime. Nyní se podíváme na modul dateutil.
Použití modulu dateutil
Modul dateutil je rozšířením modulu datetime. Usnadňuje práci s daty a časy pomocí mnoha metod. Nejprve modul nainstalujeme pomocí příkazu:
pip install python-dateutil
Nás bude zajímat metoda dateutil.parser.parse. Podívejme se, jak s ní převést řetězec datetime na objekt datetime.
parser.parse
Metoda parser.parse přijme řetězec s datem a časem a automaticky jej převede na objekt datetime. U této metody nemusíme specifikovat formát. Metoda sama rozpozná formát vstupního řetězce a provede konverzi. Podívejme se na příklad:
from dateutil import parser string = "19-12-2022 09:37:56 PM" print(parser.parse(string))
Po spuštění kódu získáme následující výstup:
2022-12-19 21:37:56
Řetězec s datem a časem musí být v jednom z formátů, které metoda parser.parse rozpozná. Pokud formát neodpovídá žádnému z akceptovaných formátů, dojde k chybě. Seznam podporovaných formátů můžete najít v dokumentaci.
Protože metoda parser.parse vrací objekt datetime, můžeme stejně jako u modulu datetime přistupovat k datu a času odděleně pomocí metod date() a time(). Uveďme si příklad:
from dateutil import parser string = "19-12-2022 09:37:56 PM" print("Datum:", parser.parse(string).date()) print("Čas:", parser.parse(string).time())
Po spuštění kódu se zobrazí následující výstup:
Datum: 2022-12-19 Čas: 21:37:56
Jak vidíte, dateutil usnadňuje práci s datem a časem. Další informace o tomto modulu naleznete v dokumentaci.
Závěr
Pro převod řetězce s datem a časem na objekt datetime jsme použili vestavěný modul datetime a externí knihovnu dateutil. Existuje i další vestavěný modul, time, pomocí kterého můžeme dosáhnout stejného výsledku. Zkuste si to sami. Nemělo by to být těžké, protože už máte zkušenosti s moduly datetime a dateutil.
Existuje i několik dalších knihoven, pomocí kterých lze dosáhnout stejného cíle. Moduly, které jsme použili v tomto návodu, jsou standardní a široce používané. Můžete si prozkoumat i další možnosti a vybrat si tu, která vám nejvíce vyhovuje.
Doporučujeme vám také prozkoumat, jak v Pythonu vypočítat časový rozdíl.
Veselé kódování 🙂