Zeit Differenz berechnen

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.
Benutzeravatar
limepix
User
Beiträge: 37
Registriert: Dienstag 11. November 2008, 16:54

Ein freudiges Hallodri... ich bin neu hier und habe auch noch nicht
allzuviel erfahrung mit python. (programmiere allerdings seit ca 3 jahren in c++ und möchte nun umsteigen ;-) )

mein problem ist eine momentane "denkblockade"
folgendes:

ich möchte eine funktion schreiben, der ich einen Wochentag übergebe(0-6), desweiteren eine uhrzeit(0-24:0-59). diese funktion soll mir nun die zeit in sekunden vom jetzigen zeitpunkt bis zu dieser neuen uhrzeit.
folgendes beispiel:

es ist dienstag 17:00 und ich übergebe meiner funktion (0, 1500) - quasi nächsten montag um 15:00 wie muss der algorithmus aussehen, dass ich die sekunden von "jetzt" bis nächsten mo. 15:00 bekomm??

ich weiss nicht ob es in python möglichkeiten gibt sowas "einfacher" zu machen... in c++ hab ich die offis lib verwendet mit der das ziemlich einfach war und ich mir deswegen bislang keine großen gedanken machen musste...

vielen dank schon mal im vorraus :-)

mein code schaut bis jetzt wie folgt aus:

Code: Alles auswählen

def calcDifToTime(self, nextWDay, nextTime):
        difMin  = 0
        difHour = 0
        difDays = 0
        
        current = time.localtime()
        curWDay  = current[6]
        curHour = current[3]
        curMin  = current[4]        
        
        nextTime = '0' + str(nextTime)
        
        nextMin  = int(nextTime[-2:])
        nextHour = int(nextTime[:-2])
        
        if nextMin < curMin:
            difMin = nextMin + (60 - curMin)
        else:
            difMin = nextMin - curMin
            
        if nextHour < curHour:
            difHour = nextHour + (24 - curHour)
        else:
            difHour = nextHour - curHour
            if (difMin + curMin) >= 60:
                difHour -= 1
            
        if nextWDay < curWDay:
            difDays = nextWDay + (7 - curWDay)
        else:
            difDays = nextWDay - curWDay
            if (difHour + curHour) >= 24:
                difDays -= 1
        
        return (60*difMin) + (60*60*difHour) + (24*60*60*difDays)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Schau dir mal das datetime Modul an.
Benutzeravatar
limepix
User
Beiträge: 37
Registriert: Dienstag 11. November 2008, 16:54

Wer suchet der findet ...jaja... :oops:
danke schon mal... ich bin jetz zwar nich an nem python fähigen pc, aber sobald ich wieder dran bin probier ichs gleich mal ;-)

das datetime modul bzw allg zeit handling kommt erst 3 kapitel weiter in meinem buch als ich bis jetzt bin ...
da steckt das c++, wo man jeden sche*** selber machen muss dann doch noch zu tief drin ^^

danke nochmal
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

limepix hat geschrieben:das datetime modul bzw allg zeit handling kommt erst 3 kapitel weiter in meinem buch als ich bis jetzt bin ...
Hoffentlich nicht das Galileo Openbook ... :D
Benutzeravatar
limepix
User
Beiträge: 37
Registriert: Dienstag 11. November 2008, 16:54

?!?

:shock:

was ist denn an dem so schlimm??

(falls du mir damit jetz implizit mitteilen wolltest, dass es des auch kostenlos gibt - ich weiss!! ;-) die sache is nur die - ich mach neben meiner normalen tätigkeit als anwendungsentwickler noch ciscos tolle network academy und nach 10 - 11 stunden täglich vorm pc freust du dich dann mal, wenn du das was du lernen musst nich in der leuchtkiste sondern in nem buch findest... so! genug geprahlt... 8) (eigentlich hass ich bücher nämlich...)

falls es andere bücher gibt, die du besser findest, bzw die im anschluss zu dem openbook zu empfehlen sind - ich höre ?!?

ich hab des halt im internet gefunden und dort so ca die ersten 100 seiten gelesen und dachte mir, dass des für umsteiger eigentlich ganz gut is... bis jetzt wurde ich auch absolut nicht enttäuscht ;-)
BlackJack

Das Buch ist von Leuten geschrieben, die wohl Ahnung von C++ haben und dachten sie könnten auf der Grundlage ein Python-Buch schreiben. Schmeiss mal die Forensuche zu dem Thema Openbook an.

IMHO suchst Du kein Buch für den Anschluss an das Buch sondern eines als sofortigen Ersatz.

Das Tutorial in der Dokumentation sollte man mal durch gearbeitet haben. Und "Dive Into Python" ist für Leute mit Programmiererfahrung ganz gut.
Qubit
User
Beiträge: 128
Registriert: Dienstag 7. Oktober 2008, 09:07

BlackJack hat geschrieben: IMHO suchst Du kein Buch für den Anschluss an das Buch sondern eines als sofortigen Ersatz.
Warum schreibst du nicht mal eins und zeigst speziell den "Umsteigern" mit OOP Erfahrungen, was Vererbung und Kapselung, Klassen, Instanzen, Konstruktoren, Destruktoren, Setter&Getter, Interfaces, usw., all dieser Kram, den die Leute vor allem an der Uni mit Java eingetrichtert bekommen haben, unter Python bedeutet? Es ist für mich ganz "generisch", dass erst einmal Anschluss an schon bekannte Konzepte gesucht wird ;-)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Konstruktoren/Destruktoren - __init__ ist soetwas wie ein Konstruktor(ein richtiger wäre __new__ aber sollte man nicht anfassen es sei denn man weiß was man tut) destruktoren verwendet man so nicht
Setter & Getter - siehe Doku zu property
Interfaces - Überflüssig, Python hat Mehrfachvererbung (und duck typing)
Instanzen - Zahlen, Strings usw. sind z.B. Instanzen von int, str usw. arbeitet man die ganze Zeit mit
Vererbung - "class Foo(object): pass" und schon hat man von object geerbt.
Klassen - "class Foo(object): pass" und schon hat man eine Klasse
Kapselung - Wofür sollte die nützlich sein? Mach einen Unterstrich vor den Namen und dann weiß schon jeder dass man es nicht anfassen sollte

Sonst noch irgendwelche Fragen? :lol:
Qubit
User
Beiträge: 128
Registriert: Dienstag 7. Oktober 2008, 09:07

DasIch hat geschrieben: Sonst noch irgendwelche Fragen? :lol:
Hehe..
Was ist das allgemeine Konzept eines "Objekts" in Python?
Und warum ist

class C(A,B):pass

nicht gleich

class C(B,A):pass

;-)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Qubit hat geschrieben:Warum schreibst du nicht mal eins und zeigst speziell den "Umsteigern" mit OOP Erfahrungen, was Vererbung und Kapselung, Klassen, Instanzen, Konstruktoren, Destruktoren, Setter&Getter, Interfaces, usw., all dieser Kram, den die Leute vor allem an der Uni mit Java eingetrichtert bekommen haben, unter Python bedeutet?
Ich schreibe so eines. Ist bisher allerdings noch in der Planungsphase.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Qubit hat geschrieben:Und warum ist

class C(A,B):pass

nicht gleich

class C(B,A):pass
Weil die "Lookup"-Reihenfolge von Attributen in Elternklassen sequentiell ist. Schau dir mal die Artikel zum C3 MRO an, dort werden auch noch kompliziertere Fälle behandelt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
limepix
User
Beiträge: 37
Registriert: Dienstag 11. November 2008, 16:54

ich will eure tolle diskussion jetz echt nicht unterbrechen... denke auch nicht das ein "5-beitrag" newbie hier an board sagen kann "schluss jetz!", aber ursprünglich ging es hier in diesem thread um die berechnung von einem zeitdelta... wie genau das funktioniert is mir immer noch nicht ganz klar, aber es is früh, viertel vor neun und ich bin wieder in der lage zu "denken", hol mir nen kaffee und in ner stunde werd ich für diejenigen die sich fürs eigentliche thema interessieren eine lösung reinstellen ;-) ...

(trotzdem zu eurer diskussion - ich hab angefangen mit dem programmieren vor ca 6 jahren - seit ca 3 nun oop ...
ich hab des ein oder andere buch gelesen was allgemeine konzepte von oop beschreibt, völlig unabhängig von der verwendeten sprache - das sollte man sich sowieso mal reinziehn um allein des logische verständnis für so etwas zu haben / zu entwickeln... berufsbedingt musste ich dann c++ lernen und hab dazu mehrere bücher gelesen - ich konnte von keinem einzigen sagen, dass man danach c++ "kann". allerdings in der summe und dem dann angesammelten wissen kann man sich so seine eigene "meinung" bilden... das kommt dann schon ganz von selber - wenn du so eine sprache dann jeden tag benutzt, zusätzlich noch code von anderen leuten liest, hast dus dann nach ner bestimmten zeit denk ich mal ganz gut raus...
ich denke auch nicht wie in den anderen threads schon gesagt, dass man ein buch als "schlecht" abstempeln kann - jedoch sollte man zu solch komplexen themen wie "programmierung" sich nicht auf ein einzelnes buch verlassen und das was da drin steht auf biegen und brechen bis an sein lebensende verwenden, sondern grad bei so modernen, sich weiterentwickelnden sprachen wie python sich immer nach "neuem" umschaun und vllt auch das ein oder andere buch "mehr" lesen (bzw. ein hoch aufs internet - es gibt so viel freien code den man im netz findet wo man super ideen herbekommt). ich habe mir das buch gekauft um syntaxmäßig mal bisschen reinzukommen und ein paar ideen zu sammeln(ich wollte wissen wie schaut n FOR oder n WHILE aus... ;-) ))
BlackJack

Ich denke schon das man ein Buch als schlecht abstempeln kann (übrigens auch ohne selbst ein besseres schreiben zu wollen).

Neben den allgemeinen Konzepten die in vielen Sprachen einer Familie ähnlich bis gleich sind gibt es so etwas wie idiomatische Verwendung, die man nicht einfach von einer Sprache auf eine andere übertragen kann. Genau das tut das OpenBook aber. Gerade C++ Umsteigern sollte man früh nahebringen, das RAII in Python nicht "geht" und das `__del__()` unbrauchbar ist. Da zeigt das OpenBook eine Technik die überhaupt nicht zuverlässig funktioniert und hat dazu keine einzige Warnung. Nicht mal das was in der Python-Dokumentation steht.

Das Buch macht auf mich den Eindruck die Autoren kennen eine statisch typisierte Sprache wie C++, C#, oder Java, haben das Tutorial in der Dokumentation absolviert und dann ein Python-Buch geschrieben. Sie waren jung und brauchten das Geld. ;-)

@limepix: Für einen "Rundgang" durch die Sprache ist das Tutorial in der Python-Dokumentation IMHO ausreichend.
Benutzeravatar
limepix
User
Beiträge: 37
Registriert: Dienstag 11. November 2008, 16:54

wie gesagt, genau deswegen meine ich, dass man sich nicht nur auf ein buch verlassen soll. ich bin mir sicher das etwaige probleme in anderen büchern angesprochen werden... soweit bin ich nur noch nicht ;-)
klar... theoretisch reicht ne kleine "minireferenz" mit dem ein oder anderen beispiel... vorausgesetzt du hast schon mal programmiert und kein problem mit "anderer" syntax ...

so gut nun mit dem buch hin und her :-) (da gibts andere threads wo sich der ein oder andere mehr noch drüber ausgelasen haben ^^)

zu meinem problem - ich hab´s nun folgendermaßen gelöst:
(verbesserungsvorschläge?? ansonsten bekommens unsre azubis als lösungsbsp für deren aufgabe...)

Code: Alles auswählen

    def calcDifToTime(self, nextDay, nextTime):
        current = time.localtime()
        curWDay  = current[6]
        curHour = current[3]
        curMin  = current[4]
        
        nextTime = '0' + str(nextTime)
        
        nextMin  = int(nextTime[-2:])
        nextHour = int(nextTime[:-2])
        
        difMin = 60 - curMin      
        difHour = 23 - curHour
        difDays = 6 - curWDay
        
        difMin += nextMin
        difHour += nextHour
        difDays += nextDay
        
        difSecs = (60*difMin) + (60*60*difHour) + (24*60*60*difDays)
        
        if difSecs > 604800:
            return difSecs - 604800
        else:
            return difSecs
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Also bevor du das als Muster-Lösung weitergibst, solltest du wirklich die Module der Stdlib benutzen ... Python = Batteries included
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``datetime`` wurde schon vorgeschlagen, PEP8 auch.

Wenn die Parameter feststehen müssen könnte man das so lösen:

Code: Alles auswählen

import datetime

def diff_to_time(weekday, hours):
    hour, minute = divmod(hours, 100)
    now = datetime.datetime.now()
    day_now = now.weekday()
    forward = weekday - day_now
    if forward <= 0:
        forward += 7
    future_day = now + datetime.timedelta(days=forward)
    point_in_time = datetime.datetime(future_day.year, future_day.month,
            future_day.day, hour, minute)
    delta =  point_in_time - now
    return delta.days * 60 * 60 * 24 + delta.seconds

print diff_to_time(0, 1500)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@cofi: Das wird dadurch nicht unbedingt kürzer und übersichtlicher. Es sei denn, es wäre okay einen Generator für die folgenden Tage zu basteln, der dann maximal 7 mal aktiviert wird. Oder ich habe mich einfach zu dumm angestellt das mit `datetime` zu lösen.

@limepix: Du könntest im Style Guide ein wenig lesen.

Warum ist das eine Methode und keine Funktion?

Statt Indizes würde ich bei `current` die Attribute verwenden. Ist IMHO lesbarer. Also zum Beispiel ``current.tm_wday`` statt ``current[6]``.

Die Argumente würde ich ändern. Beim ersten den Namen in `weekday` oder `next_weekday` und aus dem zweiten Argument würde ich zwei machen: `next_hour` und `next_minutes`.

Irgendwo müsste dann ja trotzdem der Code zum Aufteilen so einer Zahl in Stunden und Minuten erfolgen und den würde ich nicht über den Umweg über Zeichenketten machen. ``next_hour, next_minutes = divmod(next_time, 100)`` wäre einfacher und direkter.

Kann man das ``if``/``else`` am Ende nicht eventuell mit dem Modulo-Operator erschlagen?
BlackJack

@Leonidas: Wenn der gewünschte Wochentag der heutige ist, die Zeit aber noch in der Zukunft liegt, schlägst Du trotzdem eine Woche drauf. Den Fehler hatte ich bei meinem Versuch auch gemacht. :-)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:@Leonidas: Wenn der gewünschte Wochentag der heutige ist, die Zeit aber noch in der Zukunft liegt, schlägst Du trotzdem eine Woche drauf. Den Fehler hatte ich bei meinem Versuch auch gemacht. :-)
Ich weiß. Ich habe da nicht genau verstanden was der OP meinte. Ich denke dass es am schlauesten wäre wenn der Wochentag dem heutigen entspricht zu prüfen ob die Uhrzeit größer oder kleiner der aktuellen Uhrzeit ist und dann ggf eine Woche auzuschlagen. Aber ich wusste nicht genau was der OP da für ein Verhalten haben will (und seinen Code habe ich erst recht nicht nachzuvollziehen versucht).

Also etwa so:

Code: Alles auswählen

import datetime

def diff_to_time(weekday, hours):
    hour, minute = divmod(hours, 100)
    now = datetime.datetime.now()
    day_now = now.weekday()
    if weekday == day_now:
        today_at_time = datetime.datetime(now.year, now.month, now.day,
            hour, minute)
        if now < today_at_time:
            forward = 0
    else:
        forward = weekday - day_now
        if forward < 0:
            forward += 7
    future_day = now + datetime.timedelta(days=forward)
    point_in_time = datetime.datetime(future_day.year, future_day.month,
            future_day.day, hour, minute)
    delta =  point_in_time - now
    return delta.days * 60 * 60 * 24 + delta.seconds

print diff_to_time(2, 1500)
Aber man merkt schon, dass wenn der 1. Parameter nicht so blöd wäre, die Funktion eleganter wäre, weil man dann nicht raten müsste was gemeint ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Ich denke mal die Motivation wird so etwas sein wie "Jeden Dienstag um 15⁰⁰ Uhr kommt der Eiswagen, wie lange muss ich bis dahin noch warten?"

Ich denke der Code mit `datetime` ist nicht wesentlich kürzer und eleganter als es "per Hand" zu machen.
Antworten