datetime und timedelta

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

datetime und timedelta

Beitragvon psyalex » Dienstag 3. Februar 2009, 19:21

Hi, ich hab mal ne Frage zum datetime Modul:

Wie kann ich denn eine datetime Objekt (z.B. datetime.now().time()) in eine timedelta Objekt umwandel mit dem ich dann z.B. Differenzen bilden kann? Da muss es doch einen einfacheren Weg geben als das datetime Objekt in Stunden, Minuten und Sekunden umzuwandeln, oder?

Vielen Dank schon mal,
Alex.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Beitragvon sea-live » Dienstag 3. Februar 2009, 19:28

für timedelta sollte doch clock() ausreichen oder wilste mit dem datum rechnen

wenn ja welche time differenzes min solens denn sein !

Code: Alles auswählen

import time

# Zwei Zeitangaben erzeugen
millenium = 2000, 1, 1, 0, 0, 0, 0, 0, 0
damals = time.mktime(millenium)
print "Zeit 1:", time.localtime(damals)

jetzt = 2003, 2, 4, 0, 0, 0, 0, 0, 0
heute = time.mktime(jetzt)
print "Zeit 2:", time.localtime(heute)

# Differenz berechnen
print "Differenz:"
print

diff_sek = heute - damals
print diff_sek, "Sekunden"

diff_min = diff_sek/60
print diff_min, "Minuten"

diff_std = diff_min/60
print diff_std, "Stunden"

diff_tag = diff_std/24
print diff_tag, "Tage"
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Dienstag 3. Februar 2009, 19:38

datetime.datetime (und damit auch datetime.date und datetime.time) unterstützen Rechenoperationen, da brauchst du also nichts rumrechnen.

Code: Alles auswählen

In [1]: import datetime     

In [2]: then = datetime.datetime.now()

In [3]: now = datetime.datetime.now()

In [4]: now - then
Out[4]: datetime.timedelta(0, 15, 689915)
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

Beitragvon psyalex » Dienstag 3. Februar 2009, 20:07

ich hatte das hier probiert, was aber nicht geht.

Code: Alles auswählen

then=datetime.datetime.now().time()
now=datetime.datetime.now().time()
diff=now-then


Im Beispiel geht das natürlich auch gut ohne .time() ich hatte es aber verwendet weil ich für den neueren der beiden Timestamps kein Datum habe. Tatsächlich will ich so was machen: 22:00 Uhr - jetzt. Weiß jemdand wie man die folgenden beiden Elemente zu einem Objekt zusammen bekommt?

Code: Alles auswählen

datetime.datetime.now().date()
datetime.time(hour=22)


Das würde mein Problem auch lösen.

time.clock() ist bei mir (Ubuntu) = 0.0, was meiner Meinung nach nicht dem entspricht was in der Python Dokumentation zu clock() steht.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Beitragvon hendrikS » Dienstag 3. Februar 2009, 20:31

So könnte es gehen:

Code: Alles auswählen

import datetime
a = datetime.datetime.now()
b = datetime.datetime(2009,02,03,22)
print b-a


Das Datum im datetime Object kannst Du Dir wenn nötig ueber today().year usw. holen. Vielleicht gibt es auch was eleganteres.
BlackJack

Beitragvon BlackJack » Mittwoch 4. Februar 2009, 09:36

@psyalex: Zum Kombinieren von Datum und Zeit gibt's eine (statische) `combine()`-Methode:

Code: Alles auswählen

In [185]: now = datetime.datetime.now()

In [186]: a = datetime.datetime.combine(now.date(), datetime.time(hour=22))

In [187]: a
Out[187]: datetime.datetime(2009, 2, 4, 22, 0)


Die `time.clock()`-Funktion entspricht der Dokumentation, welche an sich schon sehr schwammig formuliert ist:

Code: Alles auswählen

In [189]: time.clock?
Type:           builtin_function_or_method
Base Class:     <type 'builtin_function_or_method'>
String Form:    <built-in function clock>
Namespace:      Interactive
Docstring:
    clock() -> floating point number

    Return the CPU time or real time since the start of the process or since
    the first call to clock().  This has as much precision as the system
    records.


CPU-Zeit oder die "echte" Zeit ist ja schon ein riesiger Unterschied und ob nun vom Anfang des Prozesses oder ab dem ersten Aufruf der Funktion gezählt wird, ebenfalls.

Wenn Du 0.0 beim ersten Aufruf bekommst, kann man daran alleine noch nicht einmal sagen, welche Zeit das nun ist. Unter Linux ist's die CPU-Zeit seit Prozessstart.
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

Beitragvon psyalex » Donnerstag 5. Februar 2009, 09:16

@BlackJack: Vielen Dank! Die combine Methode ist genau das was ich brauche.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]