staging.inyokaproject.org

Uhrzeit aus Zeitstempel ermitteln

Status: Gelöst | Ubuntu-Version: Kubuntu 20.04 (Focal Fossa)
Antworten |

michahe

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 874

Hallo,

Ihr hattet mir Vorschläge zum Umgang mit Zeitdifferenzen <class 'datetime.timedelta'> gegeben; perfekt!

Nun benötige ich so etwas für Zeitstempel; ich habe:

start:     2022-01-23 11:32:54+00:00
start type: <class 'datetime.datetime'>

und benötige nur die Uhrzeit, aber als Zahlwert, also für das Beispiel 0,481180555555556 (12:00:00 == 0,5). Irgend etwas habe ich bei PYTHON-Zeiten noch nicht begriffen ...

Bearbeitet von sebix:

Bitte wähle in Zukunft einen aussagekräftigen Titel!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Meinst du sowas?

1
2
3
4
5
6
7
#!/usr/bin/env python3
import datetime

d = datetime.datetime.now()
SECONDS_PER_DAY = 24 * 3600
part_of_day = (d.hour * 3600 + d.minute * 60 + d.second) / SECONDS_PER_DAY
print(part_of_day)

schragge

Anmeldungsdatum:
27. Januar 2022

Beiträge: 181

Oder auch

1
2
3
4
5
6
7
8
#!/usr/bin/python3
import datetime

now = datetime.datetime.now()
today = datetime.date.today()
start = datetime.datetime.combine(today, datetime.time())
delta = now - start
print(delta.total_seconds() / 86400)

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 874

Ich bitte um Entschuldigung, ich hatte die Vervollständigung des Titels vergessen: Richtig wäre Uhrzeit aus Zeitstempel ermitteln. Ich habe:

start:     2022-01-23 11:32:54+00:00
start type: <class 'datetime.datetime'>

Nun ist das Ziel, aus der Variable start die Uhrzeit als Zahlwert 0,481180555555556 zu ermitteln. Letztlich muss ich die Minuten für die Variable start (hier 32) und eine Variable ende jeweils auf 00 / 15 / 30 / 45 / 60 auf- bzw. abrunden.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

michahe schrieb:

Nun ist das Ziel, aus der Variable start die Uhrzeit als Zahlwert 0,481180555555556 zu ermitteln.

Mein Ansatz liefert dir die gewünschte Fließkommazahl:

1
2
3
4
5
6
>>> import datetime
>>> d = datetime.datetime.fromisoformat('2022-01-23 11:32:54+00:00')
>>> SECONDS_PER_DAY = 24 * 3600
>>> part_of_day = (d.hour * 3600 + d.minute * 60 + d.second) / SECONDS_PER_DAY
>>> part_of_day
0.48118055555555556

Letztlich muss ich die Minuten für die Variable start (hier 32) und eine Variable ende jeweils auf 00 / 15 / 30 / 45 / 60 auf- bzw. abrunden.

Nach welchen Regeln soll da bei der Endzeit auf- bzw. abgerundet werden?

schragge

Anmeldungsdatum:
27. Januar 2022

Beiträge: 181

Ich würde sowas versuchen

1
2
3
4
5
6
7
8
9
#!/usr/bin/python3
import datetime
timestamp = datetime.datetime.fromisoformat('2022-01-23 11:32:54+00:00')
start = timestamp.replace(hour=0, minute=0, second=0, microsecond=0)
delta = timestamp - start
# precise
print(delta.total_seconds() / 86400)
# rounded to 1/4 h
print(round(delta.total_seconds()/900) / 96)

Zeit in Sekunden durch 900 gibt Zeit in Viertelstunden, es wird auf ganze Viertelstunde gerundet, dann geteilt durch 96, um den normierten Wert von 0 bis 1 zu bekommen.

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 874

Vielen Dank, aber beide Vorschläge produzieren hier Fehler; offenbar weil das Zeitformat nicht stimmt. Ich doch schon eine Variable start:

start:     2022-01-23 11:32:54+00:00
start type: <class 'datetime.datetime'>

Immerhin schaffe ich es, das auf die Uhrzeit zu reduzieren:

1
2
3
4
import datetime
time = time_start.time()
print(time)
print(f"typ time: {type(time)}")

Jetzt habe ich die Variable time:

11:32:54
typ time: <class 'datetime.time'>

aber keinen Dezmalwert, mit dem ich rechnen kann. UPdate: Jetzt habe ich diese funktionierende Lösung, ich zerlge in Stunden, Minuten, Sekunden:

1
2
3
4
5
6
7
hh = time.hour
mm = time.minute
ss = time.second
print(hh)
print(mm)
print(ss)
print (ss * 10)   # Rechnen mit den Werten ist möglich

liefert:

11
32
54
540

schragge

Anmeldungsdatum:
27. Januar 2022

Beiträge: 181

Warte mal. datetime.time und datetime.datetime sind zwei unterschiedliche Formate. Du kannst sie nicht frei miteinander mischen.

Vielleicht kannst du etwas ausführlicher berschreiben, wo kommen deine Daten her, und was willst du mit denen machen?

michahe schrieb:

Vielen Dank, aber beide Vorschläge produzieren hier Fehler

Was waren die Fehlermeldungen?

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 874

Danke schragge,

Warte mal. datetime.time und datetime.datetime sind zwei unterschiedliche Formate. Du kannst sie nicht frei miteinander mischen.

Genau das ist ja mein Problem: Welche Formate, wie umwandeln? Wenn ich mit

1
type(variable_name)

eine Klasse ermittelt habe, wie gehe ich dann weiter vor?

Was waren die Fehlermeldungen?

Ich muss doch meine Variable start verwenden, also habe ich verschiedenste Varianten von

start:     2022-01-23 11:32:54+00:00
start type: <class 'datetime.datetime'>

z.B. (frei nach nach Codezeile 2 von seahawk1986):

1
2
qq = datetime.datetime.start
print(qq)

typischerweise mit Fehler wie

AttributeError: type object 'datetime.datetime' has no attribute 'time_start'

Meine Lösung funktiert jetzt einschließlich Auf- / Abrunden:

1
2
3
4
5
6
time = start.time()
# ...
mm = time.minute
ss = time.second
anfang = 15 * (    int((start.time().minute + start.time().second / 60) / 15) ))   # auf ganze 15 Minuten abgerundet
ende   = 15 * (1 + int((start.time().minute + start.time().second / 60) / 15) ))   # auf ganze 15 Minuten aufgerundet
Antworten |