I programmeringsvärlden är omvandling av data från en typ till en annan en grundläggande operation. Nästan samtliga programmeringsspråk erbjuder stöd för typkonverteringar när det gäller inbyggda datatyper.
När det handlar om anpassade datatyper, som till exempel datum och tid (datetime), krävs det ofta extra moduler för att genomföra konverteringar. Moduler är särskilt nödvändiga för hantering av datetime-konverteringar eftersom det historiskt sett har varit en utmaning för programmerare att arbeta med dessa datatyper. Lyckligtvis tillhandahåller Python inbyggda verktyg för just detta ändamål.
Vi ska nu utforska hur man kan omvandla en sträng som representerar datum och tid till ett datetime-objekt i Python, genom att använda olika moduler. Men först, låt oss undersöka varför denna konvertering är nödvändig.
Varför behöver vi konvertera en datetime-sträng till ett datetime-objekt?
Arbete med datum och tider i strängformat kan vara komplicerat. Genom att konvertera dessa till datetime-objekt underlättas hanteringen avsevärt. Datum och tider som representeras som strängar betraktas som vanliga strängar och saknar särskilda metoder för datum- och tidhantering. De har endast tillgång till generella strängmetoder, vilket är otillräckligt vid arbete med datum och tider.
Tänk dig att du behöver jämföra två datum. Om dessa är lagrade som strängar kan jämförelsen bli felaktig. Men om de däremot är datetime-objekt, kan vi använda jämförelseoperatorer precis som med numeriska värden.
Detta är ett exempel på hur konvertering till datetime-format förenklar arbetet. Det finns många andra scenarion, som till exempel att lägga till eller subtrahera datum, hantera tidszoner, och där konverteringen av datetime-strängar till datetime-objekt gör vår programmerings vardag mycket smidigare.
Med detta i åtanke, låt oss undersöka olika metoder för att konvertera en datetime-sträng till ett datetime-objekt. Vi kommer att använda den inbyggda datetime-modulen samt dateutil, en tredjepartsmodul, för att åstadkomma detta. Vi börjar med datetime-modulen.
Använda datetime
Datetime är en inbyggd modul i Python som är avsedd för att hantera datum och tider. Modulen innehåller flera klasser som underlättar detta. Vi kommer att använda klassen `datetime.datetime` för konvertering.
Klassen `datetime.datetime` erbjuder flera metoder, men vi är speciellt intresserade av metoden `strptime`, vilken är konstruerad för att hjälpa oss med konverteringen. Låt oss granska denna metod i detalj.
datetime.strptime
Metoden `datetime.strptime` används för att omvandla en datetime-sträng till ett datetime-objekt. Den kräver två strängar: den första är själva datetime-strängen, och den andra anger formatet på denna sträng. Metoden returnerar ett datetime-objekt.
Här kommer ett exempel:
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))
Om du kör koden ovan får du följande utskrift:
2022-12-19 21:37:56
Vi har tagit en datetime-sträng och konverterat den till ett datetime-objekt med hjälp av metoden `datetime.strptime`. Det är viktigt att formatsträngen du anger exakt motsvarar datetime-strängens format. Om dessa inte matchar kan du få ett felmeddelande eller felaktig output.
Vi har använt vissa formatkoder för datetime-formatet. En komplett lista över formatkoder finns i Pythons dokumentation.
Metoden `datetime.strptime` returnerar hela datetime-objektet. Om du vill separera datum och tid kan du använda metoder på datetime-objektet. Här är ett exempel:
from datetime import datetime
string = "19-12-2022 09:37:56 PM"
formatting = "%d-%m-%Y %I:%M:%S %p"
## Visar datum separat
print("Date:", datetime.strptime(string, formatting).date())
## Visar tiden separat
print("Time:", datetime.strptime(string, formatting).time())
Om du kör koden ovan får du följande utskrift:
Date: 2022-12-19
Time: 21:37:56
Metoderna `date()` och `time()` returnerar respektive objekt. Dessa objekt har även sina egna metoder för hantering av datum och tid.
Vi har hittills antagit att både strängar och format är korrekta. Om dessa inte anges korrekt får vi fel. Låt oss undersöka hur vi hanterar fel. Kör följande 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))
Ovanstående kod resulterar i ett felmeddelande eftersom formatet inte matchar datetime-strängen. För att hantera den här typen av fel kan vi använda `try-except`-block i Python. Låt oss infoga det:
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)
Om du kör koden nu, får du följande felmeddelande utan att programmet kraschar:
time data '19:12:2022 09:37:56 PM' does not match format '%d-%m-%Y %I:%M:%S %p'
På liknande sätt kan vi lägga till `try-except`-block för metoden `parser.parse` som vi ska se senare. Detta hjälper oss att undvika programkrascher. Det är kanske inte direkt relaterat till detta exempel, men det är en bra påminnelse att använda detta i din kod.
Det var allt om datetime-modulen. Låt oss fortsätta med nästa modul, dateutil.
Använda dateutil
Dateutil-modulen är ett tillägg till datetime-modulen. Den förenklar hanteringen av datum och tider med många lättanvända metoder. För att installera modulen, använd följande kommando:
pip install python-dateutil
Den metod vi är intresserade av är `dateutil.parser.parse`. Låt oss se hur man konverterar en datetime-sträng till ett datetime-objekt med denna.
parser.parse
Metoden `parser.parse` tar en datetime-sträng och konverterar den till motsvarande datetime-objekt. Till skillnad från datetime-modulen behöver vi inte ange formatet. Metoden kan automatiskt tolka det givna formatet och konvertera strängen till ett datetime-objekt. Här är ett exempel:
from dateutil import parser
string = "19-12-2022 09:37:56 PM"
print(parser.parse(string))
Om du kör ovanstående kod får du följande utskrift:
2022-12-19 21:37:56
Datetime-strängen måste vara i ett format som `parser.parse`-metoden kan tolka. Om formatet inte känns igen kan det genereras ett fel. En översikt över alla format som metoden kan hantera finns i dokumentationen för `dateutil`.
Eftersom `parser.parse` returnerar ett datetime-objekt kan vi komma åt datum- och tidsobjekten separat, precis som vi gjorde med datetime-modulen. Här är ett exempel:
from dateutil import parser
string = "19-12-2022 09:37:56 PM"
print("Date:", parser.parse(string).date())
print("Time:", parser.parse(string).time())
Om du kör koden ovan får du följande resultat:
Date: 2022-12-19
Time: 21:37:56
Som du ser gör `dateutil` det enklare att arbeta med datum och tider i jämförelse med den inbyggda datetime-modulen. Mer information finns i dateutils dokumentation.
Slutsats
Vi har nu granskat hur man kan konvertera datetime-strängar till datetime-objekt med hjälp av både en inbyggd modul och en tredjepartsmodul. Det finns även en annan inbyggd modul, `time`, som också kan användas för att konvertera strängar till datetime-objekt. Metoden är liknande den vi har sett i datetime- och dateutil-modulerna. Prova gärna själv. Du kommer att upptäcka att det inte är så svårt eftersom du redan har gjort liknande saker med de andra modulerna.
Det finns givetvis fler bibliotek som kan uppnå samma sak. De moduler vi har gått igenom i denna artikel är dock standard och ofta använda. Du kan läsa mer om andra moduler och välja den som bäst passar dina behov.
Du kan också undersöka hur man beräknar tidsskillnader i Python.
Lycka till med kodningen! 🙂