Datum und Zeit sind zwei wichtige Datentypen, den ich bisher außen vorgelassen habe, da sie etwas spezieller sind als andere Datentypen sind und mehr Erklärung bedürfen.
Das aktuelle Datum ist weltweit nicht einheitlich, da das Jahr je nach Religion von unterschiedlichen Startpunkten definiert ist. Während für die Christen das Jahr 2023 nach Christi Geburt ist, ist für die Juden das Jahr 5793 seit Erschaffung der Welt. Im Hinduismus gibt es verschiedene Kalendersysteme, im Allgemeinen entspricht das Jahr 2023 aber dem Jahr 5125. Vor der Kalenderreform durch Papst Gregor XIII wurde in Deutschland der julianische Kalender benutzt, der das Jahr etwas zu lang definierte, wodurch sich etwa alle 130 Jahre der Frühlingsanfang verschoben hat, was die Festlegung des Osterfestes schwierig machte. Erst mit dem gregorianischen Kalender wurde die Länge eines Jahres auf 365,2425 Tage verbindlich festgelegt und Schalttage eingeführt (Quelle: Wikipedia). Dies ist in der ISO 8601 Norm entsprechend festgelegt.
Ebenso uneinheitlich war früher die aktuelle Uhrzeit, da jede Stadt ihre eigene Zeit hatte. Erst die Vernetzung der Städte durch die Eisenbahn machte eine einheitliche Zeit notwendig. Erst mit Einführung der Weltzeit wurde die Erdkugel in mehrere Zeitzonen entlang der Längengrade ausgehend vom Nullmeridian der durch Greenwich läuft aufgeteilt, die sog. Greenwich Mean Time(GMT) ist die Referenzzeit an der sich alle Zeitzonen orientierten. Die koordinierte Weltzeit (UTC) wurde 1972 eingeführt. In Deutschland liegt in der Zeitzone CET (Central European Time). Dies entspricht UTC+1, Wenn bei uns 12:00 Uhr ist, ist es in Greenwich erst 11:00 Uhr. Durch die Sommerzeit verschiebt sich das ganze nochmal. Die CET gilt in der gesamten Europäischen Union mit Ausnahme von Portugal (UTC+0), der kanarischen Inseln (UTC+0) und Französisch-Guayana(UTC-3).
Du siehst, die Berechnung von Datum und Zeit ist nicht gerade einfach, zum Glück bringt Python ein Modul mit, dass uns viel Arbeit erspart.
datetime
Das datetime
Modul stellt uns alles zur Verfügung, das wir für die Verarbeitung von Datum und Zeit brauchen.
from datetime import datetime
heute = datetime.now()
print(type(heute))
print(heute)
print(heute.time())
print(heute.date())
Die now()
Methode liefert uns ein datetime
Objekt mit dem aktuellen Datum und der aktuellen Zeit. Um Datum und Zeit separat verarbeiten zu können, kannst du sie mit den Methoden date()
und time()
aus heute
auslesen.
Datum und Zeit formatieren
Die Ausgabe von Datum und Zeit ist leider nicht unbedingt so, wie wir sie in der deutschen Schreibweise erwarten.
Die strfmt()
Methode am datetime Objekt macht dies sehr flexibel.
from datetime import datetime
heute = datetime.now()
print(type(heute))
print(heute.strftime('%c %X'))
print(heute.time().strftime('%X'))
print(heute.date().strftime('%x'))
print(heute.strftime('%d.%m.%y %H:%M'))
Die Bedeutung der verschiedenen Platzhalter findest du in dieser Tabelle:
Symbol | Wert |
---|---|
%d | Tag (0-31) |
%m | Monat (1 – 12) |
%Y | Jahr ( vierstellig) |
%w | Wochentag (0-7) |
%H | Stunde (0-23) |
%I | Stunde (0-12) |
%M | Minute (0-59) |
%S | Sekunde (0-59) |
%f | Mikrosekunde (000000-999999) |
%z | UTC Offset (z.B. +0100) |
%Z | Zeitzone (z.B. |
%j | Nummer des Tages im Jahr (0-366) |
Datum erzeugen.
Natürlich kannst ein datetime
Objekt auch selber erzeugen.
from datetime import datetime
datum = datetime.strptime('12.12.2002', '%d.%m.%Y')
print(f'Jahr: {datum.year}')
print(f'Monat: {datum.month}')
print(f'Tag: {datum.day}')
print(datum)
Du gibst einfach das Datum als String an und mit dem Formatmuster weiß die strptime()
Methode, wie sie das Datum parsen muss. Die Uhrzeit wird dabei immer mit Mitternacht belegt. Das Programm zeigt dir außerdem, wie du die einzelnen Werte für Jahr Monat und Tag aus dem datetime
auslesen kannst.
Zeit messen
Häufig möchtest du wissen, wie lang ein bestimmter Codeblock zum Durchlaufen benötigt. Dafür bringt Python das timeit
Modul mit.
from timeit import default_timer as timer
import time
def calc_square(numbers, verbose=False):
for n in range(1,numbers):
q= n*n
if verbose:
print(f'\n{n} ^ 2 = {q}')
time.sleep(0.1)
def calc_cube(numbers,verbose=False):
for n in range(1,numbers):
k = n*n*n
if verbose:
print(f'\n{n} ^ 3 = {k}')
time.sleep(0.1)
start = timer()
calc_square(100,True)
calc_cube(100,True)
ende = timer()
differenz = ende - start
print(f'Zeit mit print():{differenz}s')
start = timer()
calc_square(100)
calc_cube(100)
ende = timer()
differenz = ende - start
print(f'Zeit ohne print():{differenz}s')
Ich habe hier Methoden zur Berechnung von Quadrat- bzw. Kubikzahlen. Diese sollen mir einfach nur die jeweils ersten 100 Ergebnisse berechnen. Vor der Berechnung lass ich mir mit start = timer()
den aktuellen Timer geben und danach nochmal ende = timer()
. Die Differenz der beiden Werte differenz = ende - start
ist die Zeit in Sekunden, die für die Berechnungen benötigt wird. Das Konstrukt verbose=False
kennst du noch nicht. Es bedeutet, dass der Methode ein zweiter Parameter übergeben werden kann. Fehlt dieser, wird er automatisch mit False
belegt. Auf einem nicht übertakten Raspberry Pi 4B erhalte ich eine Laufzeit von 19.84151093196124s mit print()
Ausgabe und 19.28403962776065s ohne Ausgabe. Da auch das print()
etwas Rechenzeit benötigt, ist der erste Wert geringfügig höher.
Die beiden Methoden werden wir im nächsten Teil für Experimente mit Multithreading wieder benutzen.