Jak przekonwertować ciąg znaków na datę i godzinę w Pythonie

Photo of author

By maciekx

W dziedzinie programowania, transformacja danych z jednego formatu na inny stanowi fundamentalny element. Praktycznie każdy język programowania umożliwia konwersję typów dla standardowych rodzajów danych.

W przypadku niestandardowych typów danych, jak np. daty i godziny, często wymagane są dodatkowe narzędzia. Moduły dedykowane konwersji dat i godzin są szczególnie ważne, ponieważ operacje na nich bywają problematyczne. Na szczęście, Python oferuje wbudowane biblioteki ułatwiające pracę z datami i godzinami.

W tym artykule zgłębimy proces przekształcania łańcucha tekstowego reprezentującego datę i godzinę w obiekt typu datetime w Pythonie, wykorzystując różne moduły. Zanim jednak przejdziemy do szczegółów, warto zrozumieć motywację stojącą za tą konwersją.

Dlaczego konwertujemy łańcuch daty i godziny na obiekt datetime?

Praca z datami w formie tekstowej może być niewygodna. Przekształcenie ich na obiekty datetime znacząco usprawnia te operacje. Daty zapisane jako łańcuchy tekstowe zachowują się jak zwykłe ciągi znaków, nie oferując specjalistycznych metod do manipulacji datami. Zamiast tego, dysponujemy jedynie ogólnymi metodami operacji na łańcuchach, które są nieprzydatne w kontekście dat.

Rozważmy sytuację, w której musimy porównać dwie daty. W przypadku łańcuchów tekstowych porównanie może nie dać oczekiwanych rezultatów. Natomiast obiekty datetime umożliwiają porównywanie dat za pomocą standardowych operatorów, tak jak w przypadku liczb.

To tylko jeden z przykładów ilustrujących, jak konwersja do formatu datetime ułatwia pracę. Dodawanie i odejmowanie dat, obsługa stref czasowych i wiele innych operacji stają się znacznie prostsze, gdy korzystamy z obiektów datetime zamiast łańcuchów tekstowych.

Mając to na uwadze, przeanalizujmy różne metody konwersji łańcucha daty i godziny na obiekt datetime. Wykorzystamy wbudowany moduł datetime oraz zewnętrzny moduł dateutil. Zacznijmy od omówienia modułu datetime.

Wykorzystanie modułu datetime

Moduł datetime, stanowiący integralną część Pythona, jest przeznaczony do pracy z datami i godzinami. Zawiera liczne klasy, które wspomagają manipulację datami i godzinami. W kontekście konwersji wykorzystamy klasę datetime.datetime.

Klasa datetime.datetime udostępnia wiele metod. W naszym przypadku kluczowa będzie metoda strptime, która umożliwia konwersję. Przyjrzyjmy się jej bliżej.

datetime.strptime

Metoda datetime.strptime służy do transformacji łańcucha tekstowego reprezentującego datę i godzinę w obiekt datetime. Pobiera ona dwa argumenty – łańcuch daty i godziny oraz format tego łańcucha. W rezultacie zwraca obiekt datetime.

Oto przykład:

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

Po uruchomieniu powyższego kodu, uzyskamy następujący wynik:

2022-12-19 21:37:56

Za pomocą metody datetime.strptime przekształciliśmy łańcuch tekstowy daty i godziny w obiekt datetime. Istotne jest, aby format przekazany do metody dokładnie odpowiadał formatowi łańcucha daty i godziny. W przypadku niezgodności, może dojść do błędu lub uzyskania nieprawidłowego wyniku.

W powyższym przykładzie użyliśmy kodów formatujących dla daty i godziny. Pełną listę kodów formatów można znaleźć w dokumentacji.

Metoda datetime.strptime zwraca pełną datę i godzinę. Jeśli potrzebujemy uzyskać datę i godzinę osobno, możemy wykorzystać metody date i time obiektu datetime. Zobaczmy, jak to zrobić:

from datetime import datetime

string = "19-12-2022 09:37:56 PM"
formatting = "%d-%m-%Y %I:%M:%S %p"

## Pobieranie daty
print("Date:", datetime.strptime(string, formatting).date())

## Pobieranie godziny
print("Time:", datetime.strptime(string, formatting).time())

Po uruchomieniu tego kodu, otrzymamy następujące wyniki:

Date: 2022-12-19
Time: 21:37:56

Metody date i time zwracają odpowiednio obiekty daty i godziny, które posiadają własne dedykowane metody.

W powyższych przykładach zadbaliśmy o to, aby podawane łańcuchy i formaty były poprawne. W przypadku ich nieprawidłowości pojawią się błędy. Zobaczmy, jak sobie z nimi radzić. Uruchom następujący kod:

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

Ten kod wygeneruje błąd, ponieważ format nie pasuje do ciągu daty i godziny. Aby obsłużyć takie błędy, możemy użyć bloku try-except w Pythonie. Zmodyfikujmy kod:

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)

Teraz, po ponownym uruchomieniu kodu, zobaczymy komunikat o błędzie bez przerywania działania programu:

time data '19:12:2022 09:37:56 PM' does not match format '%d-%m-%Y %I:%M:%S %p'

Podobne podejście z try-except możemy zastosować dla nadchodzącej metody parser.parse. Pozwala to uniknąć awarii programu. Chociaż nie jest to bezpośrednio związane z tematem tego artykułu, warto o tym pamiętać podczas pisania kodu.

To wszystko w kontekście modułu datetime. Przejdźmy teraz do omówienia modułu dateutil.

Wykorzystanie modułu dateutil

Moduł dateutil oferuje rozszerzenia dla modułu datetime, czyniąc pracę z datami i godzinami bardziej komfortową dzięki wielu intuicyjnym metodom. Zainstalujmy go, korzystając z poniższego polecenia:

pip install python-dateutil

W tym przypadku interesuje nas metoda dateutil.parser.parse. Przeanalizujmy, jak za jej pomocą przekonwertować łańcuch daty i godziny na obiekt datetime.

parser.parse

Metoda parser.parse przyjmuje łańcuch daty i godziny, a następnie konwertuje go do formatu obiektu datetime. Nie wymaga podawania żadnego formatowania, ponieważ automatycznie rozpoznaje format łańcucha i dokonuje odpowiedniej konwersji. Zobaczmy na przykładzie:

from dateutil import parser

string = "19-12-2022 09:37:56 PM"
print(parser.parse(string))

Po uruchomieniu powyższego kodu otrzymamy następujący wynik:

2022-12-19 21:37:56

Łańcuch daty i godziny musi być w formacie rozpoznawalnym przez metodę parser.parse. W przeciwnym razie zostanie zgłoszony błąd. Możesz sprawdzić dokumentację, aby zapoznać się z formatami łańcuchów obsługiwanymi przez tę metodę.

Ponieważ metoda parser.parse zwraca obiekt datetime, możemy oddzielnie uzyskać dostęp do daty i godziny, tak jak w przypadku modułu datetime. Spójrzmy na kod:

from dateutil import parser

string = "19-12-2022 09:37:56 PM"
print("Date:", parser.parse(string).date())
print("Time:", parser.parse(string).time())

Po uruchomieniu powyższego kodu zobaczymy następujący wynik:

Date: 2022-12-19
Time: 21:37:56

Jak widać, dateutil znacznie upraszcza pracę z datami i godzinami. Zachęcamy do zapoznania się z dokumentacją modułu, aby poznać wszystkie jego możliwości.

Podsumowanie

Wykorzystaliśmy wbudowany moduł datetime oraz zewnętrzny moduł dateutil do konwersji łańcucha tekstowego daty i godziny na obiekt datetime. Istnieje również wbudowany moduł time, za pomocą którego również można dokonać tej konwersji, podobnie jak w przypadku modułów datetime i dateutil. Zachęcamy do samodzielnego spróbowania – nie powinno to sprawić trudności, biorąc pod uwagę doświadczenie zdobyte z poprzednimi modułami.

Istnieje wiele bibliotek umożliwiających osiągnięcie tego samego celu. Moduły, które wykorzystaliśmy w tym artykule, są powszechnie stosowane i stanowią standard w branży. Zachęcamy do poszukiwania innych rozwiązań i wyboru tego, które najlepiej odpowiada Twoim potrzebom.

Warto również zgłębić temat obliczania różnic czasowych w Pythonie.

Miłego kodowania! 🙂


newsblog.pl