Datum und Zeit mit Python verarbeiten

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.

1Python Programmierkurs
2Python: Methoden
3Kontrollstrukturen
4Strings in Python
5Container
6Objekte in Python
7Module
8Exceptions in Python
9Typkonvertierung
10Python und Dateien
11Datum und Zeit mit Python verarbeiten
12Multithreading
13Netzwerk in Python
14Logging in Python
15GPIO
16Automatische Tests
17Datenbanken mit Python
18Python: Generatoren und List Comprehension
19Python: Webseiten mit Flask
20Python virtuelle Umgebungen
21Interrupts & Signale
22NumPy
23Matplotlib
24match
25Reguläre Ausdrücke
26lambda Funktionen
27__getattr__()

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

Karte mit Zeitzonen Stand 2015, CC-BY-SA Tobias Jung
Datum und Zeit
Zeitzonen Stand 2015, Bild CC-BY-SA Tobias Jung

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:

SymbolWert
%dTag (0-31)
%mMonat (1 – 12)
%YJahr ( vierstellig)
%wWochentag (0-7)
%HStunde (0-23)
%IStunde (0-12)
%MMinute (0-59)
%SSekunde (0-59)
%fMikrosekunde (000000-999999)
%zUTC Offset (z.B. +0100)
%ZZeitzone (z.B.
%jNummer 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.

Schreibe einen Kommentar

Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Olli Graf - raspithek.de
WordPress Cookie Hinweis von Real Cookie Banner