====== LU14a - Python und die Zeit ======
Das speichern von Zeit und Datumswerten ist in vielen Applikationen notwendig. Python bietet uns mit den Modul ''datetime'' ein eifach zu benutzendes Modul dafür. Es hat mehrere Klassen, aber die am häufigsten verwendeten sind:
''datetime'': Diese Klasse stellt einen einzelnen Zeitpunkt dar. Sie hat Attribute für Jahr, Monat, Tag, Stunde, Minute, Sekunde und Mikrosekunde.
''timedelta'': Diese Klasse stellt eine Dauer dar, die zur Durchführung von Arithmetik mit ''datetime''-Objekten verwendet werden kann.
Hier ist ein einfaches Beispiel für die Verwendung des ''datetime''-Moduls, um das aktuelle Datum und die Uhrzeit zu ermitteln:
from datetime import datetime
# Get the current date and time
now = datetime.now()
print(now)
Die Ausgabe sieht dann so aus:
2020-08-20 12:34:56.789012
===== Erstellen von datetime-Objekten =====
Mit dem Konstruktor ''datetime()'' können Sie ein ''datetime''-Objekt für ein bestimmtes Datum und eine bestimmte Uhrzeit erstellen. Der ''datetime()''-Konstruktor nimmt die folgenden Argumente entgegen:
* ''year'': Das Jahr (vierstellig)
* ''month'': Der Monat (1-12)
* ''day'': Der Tag des Monats (1-31)
* ''hour'': Die Stunde (0-23)
* ''minute'': Die Minute (0-59)
* ''second'': Die Sekunde (0-59)
* ''microsecond'': Die Mikrosekunde (0-999999)
Hier ein Beispiel für die Erstellung eines datetime-Objekts für den ''1. Januar 2020 um 12:00 Uhr'':
from datetime import datetime
dt = datetime(2020, 1, 1, 12, 0, 0)
print(dt)
Die Ausgabe sieht dann so aus:
2020-01-01 12:00:00
Sie können auch ein ''datetime''-Objekt aus einer Zeichenkette mit der Funktion ''datetime.strptime()'' erstellen.
Die Funktion ''datetime.strptime()'' nimmt zwei Argumente entgegen:
* eine Zeichenfolge, die das Datum und die Uhrzeit darstellt
* eine Formatzeichenfolge, die angibt, wie die Zeichenfolge formatiert werden soll. \\Die einzelnen Formatzeichen finden Sie unter [[https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior]] beschrieben.
Das folgenden Beispiel zeigen, wie man ein ''datetime''-Objekt aus einer Zeichenkette erstellt:
from datetime import datetime
# Parse a string into a datetime object
s = '2020-01-01 00:00:00'
dt = datetime.strptime(s, '%Y-%m-%d %H:%M:%S')
print(dt)
Die Ausgabe sieht dann so aus:
2020-01-01 00:00:00
from datetime import datetime
# Parse a string into a datetime object
user_input = '12.03.2023 16:15'
date_time = datetime.strptime(user_input, '%d.%m.%Y %H:%M')
print(date_time)
print(datetime.strftime(date_time, '%d.%m.%Y %H:%M:%S'))
Die Ausgabe sieht dann so aus:
2023-03-12 16:15:00
12.03.2023 16:15:00
Mit der Funktion ''strftime'' können wir die Darstellung des Datums und der Uhrzeit bestimmen.
Die Formatcodes sind die gleichen wie bei ''strptime''.
==== Extrahieren von Datums- und Zeitinformationen ====
Sie können das Jahr, den Monat, den Tag, die Stunde, die Minute und die Sekunde aus einem ''datetime''-Objekt mithilfe seiner Attribute extrahieren. Zum Beispiel:
from datetime import datetime
dt = datetime(2020, 1, 1, 12, 0, 0)
year = dt.year
month = dt.month
day = dt.day
hour = dt.hour
minute = dt.minute
second = dt.second
==== Datetime in formatierten String umwandeln ====
=== Verwenden von strftime ===
Sie können die Funktion ''strftime'' verwenden, um das Format anzugeben, in dem Sie das Datum und die Uhrzeit umwandeln möchten. Um zum Beispiel das Datum und die Uhrzeit in folgendem Format zu drucken: ''TT.MM.JJJJ HH:MM:SS'', können Sie den folgenden Code verwenden:
dt = datetime(2020, 1, 1, 13, 23, 30)
formatted_time = dt.strftime('%d.%m.%Y %H:%M:%S')
print(formatted_time)
01.01.2020 13:23:30
Hier ist die Liste einiger gängiger Formatcodes, die Sie mit ''strftime'' verwenden können:
* ''%Y'': 4-Stellen Jahr (z.B. 2021)
* ''%m'': 2-Stellen Monat (z.B. 01 for January)
* ''%d'': 2-Stellen Tag des Monats (z.B. 09)
* ''%H'': Stunde, im 24-Stunden Format (z.B. 13 for 1:00 PM)
* ''%M'': Minute (z.B. 59)
* ''%S'': Sekunde(z.B. 59)
Eine vollständige Liste der Formatcodes, die Sie mit ''strftime'' verwenden können, finden Sie in der Dokumentation: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
=== Verwenden des f-String ===
f-Strings können auch verwendet werden, um Datums- und Zeitangaben zu formatieren. Hierbei wird das Datumsobjekt direkt in den String eingebettet, gefolgt von einem Doppelpunkt und dem gewünschten Formatierungscode.
from datetime import datetime
dt = datetime(2020, 1, 1, 13, 23, 30)
formatted_time = f'{dt:%d.%m.%Y %H:%M:%S}'
print(formatted_time)
# ODER
print(f'{dt:%d.%m.%Y %H:%M:%S}')
01.01.2020 13:23:30
**Formatierung mit einem f-String**
formatted_time = f"{dt:%d.%m.%Y %H:%M:%S}"
In dieser Zeile wird ein f-String verwendet, um das ''datetime''-Objekt ''dt'' in einen formatierten String zu konvertieren. Innerhalb der geschweiften Klammern ''{}'' wird das ''datetime''-Objekt ''dt'' platziert, gefolgt von einem Formatierungsmuster, das durch einen **Doppelpunkt** eingeleitet wird. ''%d.%m.%Y %H:%M:%S'' legt das Format des Datums und der Uhrzeit fest.
===== Erstellen von timedelta-Objekten =====
Die Klasse ''timedelta'' aus dem ''datetime''-Modul stellt eine Dauer dar, die zur Durchführung von Berechnungen mit ''datetime''-Objekten verwendet werden kann. Sie können ''timedelta''-Objekte verwenden, um eine Dauer zu einem ''datetime''-Objekt zu addieren oder von diesem zu subtrahieren, um ein neues datetime-Objekt zu erhalten.
Hier ein Beispiel für die Verwendung eines ''timedelta''-Objekts, um einen Tag zu einem ''datetime''-Objekt hinzuzufügen:
from datetime import datetime, timedelta
# Create a datetime object for January 1, 2020
dt = datetime(2020, 1, 1)
# Create a timedelta object representing one day
one_day = timedelta(days=1)
# Add the timedelta to the datetime object
dt_plus_one_day = dt + one_day
print(dt_plus_one_day)
Die Ausgabe sieht dann so aus:
2020-01-02 00:00:00
Sie können ein ''Timedelta''-Objekt erstellen, indem Sie den Konstruktor ''timedelta()'' aufrufen und ihm Argumente für die Dauer, die Sie darstellen möchten, übergeben. Der ''timedelta()''-Konstruktor hat die folgenden Argumente:
* ''days'': Die Anzahl der Tage in der Dauer.
* ''hours'': Die Anzahl der Stunden in der Dauer.
* ''minutes'': Die Anzahl der Minuten in der Dauer.
* ''seconds'': Die Anzahl der Sekunden in der Dauer.
* ''microseconds'': Die Anzahl der Mikrosekunden in der Zeitdauer.
Das folgende Beispiel zeigt, wie ein ''Timedelta''-Objekt erstellt wird, das einen Tag, zwei Stunden und 30 Minuten darstellt:
from datetime import timedelta
duration = timedelta(days=1, hours=2, minutes=30)
print(duration)
Die Ausgabe sieht dann so aus:
1 day, 2:30:00
==== Extrahieren von Timedelta-Informationen ====
Sie können ''Tage'', ''Sekunden'' und ''Mikrosekunden'' aus einem ''timedelta''-Objekt mithilfe seiner Attribute extrahieren. Zum Beispiel:
from datetime import timedelta
duration = timedelta(days=1, hours=2, minutes=30)
day = duration.days
second = duration.seconds
microsenconds = duration.microseconds
# Minuten und Stunden müssen folglich berechnet werden:
minutes = durations.seconds / 60
hours = durations.seconds / 3600
===== Rechnen mit timedelta-Objekten =====
Sie können mit ''timedelta''-Objekten arithmetische Berechnungen durchführen, um Zeitdauern zu addieren oder zu subtrahieren. Zum Beispiel:
from datetime import timedelta
# Create two timedelta objects
duration1 = timedelta(days=1, hours=2, minutes=30)
duration2 = timedelta(days=2, hours=1, minutes=15)
# Add the durations
total_duration = duration1 + duration2
print(total_duration)
# Subtract the durations
difference = duration1 - duration2
print(difference)
Die Ausgabe sieht dann so aus:
3 days, 3:45:00
-1 day, 1:15:00
Sie können ein Timedelta-Objekt auch mit einem Skalar (einer Ganzzahl oder einem Float) multiplizieren oder dividieren. Zum Beispiel:
from datetime import timedelta
# Create two timedelta objects
td1 = timedelta(days=1, hours=2, minutes=30)
td2 = timedelta(days=2, hours=1, minutes=45)
# Multiply a timedelta by a scalar
td_scaled = td1 * 2
print(td_scaled)
# Divide a timedelta by a scalar
td_divided = td1 / 2
print(td_divided)
Die Ausgabe sieht dann so aus:
2 days, 5:00:00
12:45:00
===== Rechnen mit timedelta und datetime =====
==== Hinzufügen und Subtrahieren von Timedelta-Objekten zu Datetime-Objekten====
Sie können ein ''Timedelta''-Objekt zu einem ''Datetime''-Objekt addieren oder davon subtrahieren, indem Sie die Operatoren + und - verwenden. Zum Beispiel:
from datetime import datetime, timedelta
# Create a datetime object for the current date and time
now = datetime.now()
# Create a timedelta object representing a duration of 1 day, 2 hours, and 30 minutes
td = timedelta(days=1, hours=2, minutes=30)
# Add the timedelta to the datetime object
later = now + td
print(later)
# Subtract the timedelta from the datetime object
earlier = now - td
print(earlier)
Die Ausgabe sieht dann so aus:
2020-08-21 15:34:56.789012
2020-08-19 09:34:56.789012
==== Messung der Dauer zwischen zwei datetime-Objekten ====
Sie können ein ''timedelta''-Objekt verwenden, um die Dauer zwischen zwei ''datetime''-Objekten zu messen, indem Sie ein ''datetime''-Objekt vom anderen subtrahieren. Zum Beispiel:
from datetime import datetime
# Create two datetime objects
dt1 = datetime(2020, 1, 1, 12, 0, 0)
dt2 = datetime(2020, 1, 2, 12, 0, 0)
# Subtract the two datetime objects to get a timedelta object
duration = dt2 - dt1
print(duration)
Die Ausgabe sieht dann so aus:
1 day, 0:00:00
start = datetime(2020, 1, 1, 12, 15, 17)
end = datetime(2020, 1, 2, 12, 8, 20)
# Subtract the two datetime objects to get a timedelta object
duration = end - start
duration_seconds = duration.total_seconds()
print(f'In Sekunden: {duration_seconds}')
print(f'In Minuten: {duration_seconds / 60}')
print(f'In Stunden: {duration_seconds / 60 / 60}')
print(f'In Tagen: {duration_seconds / 60 / 60 / 24}')
Die Ausgabe sieht dann so aus:
In Sekunden: 85983.0
In Minuten: 1433.05
In Stunden: 23.884166666666665
In Tagen: 0.995173611111111
----
[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi