Wenn ich den Begriff kennen würde, würde ich ihn googlen.

Du hast eine Idee für ein Projekt?
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Ähm, warum `timedelta()`? Du musst den Startzeitpunkt vom Endzeitpunkt abziehen. Und vielleicht vorher noch prüfen ob der Startzeitpunkt nicht nach dem Endzeitpunkt liegt. Benutzereingaben sollte man möglichst nicht trauen. Die geben sonst was ein. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import time
import datetime

def main():
    auftraggeber = input('Auftraggeber (h/r/b) : ')
    if auftraggeber == 'h': auftraggeber = 'Hofmeister'
    if auftraggeber == 'r': auftraggeber = 'Röck'
    if auftraggeber == 'b': auftraggeber = 'Binsch'
    kommission = input('Kommission : ')
    if kommission == 'rekla':
        rekla_kommissionen = input('Kommissionen : ')
    else:
        rekla_kommissionen = ''
    ort = input('Ort : ')
    chef = input('Chef : ')
    rekla = input('Reklamation (ja/ ) : ')
    if rekla == 'ja':
        grund = input('Kommission, Begründung der Reklamationen : ')
    else:
        grund = ''
    start = input('Arbeitsbeginn : ')
    time_start= time.strptime(start, "%H:%M")
    ende = input('Arbeitsende : ')
    time_ende = time.strptime(ende, "%H:%M")
    #zeit = input('Arbeitszeit : ')
    zeit = time_ende - time_start
    pause = input('Pause : ')
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
        f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
        f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
        f'Du hast {zeit} Stunden gearbeitet\n\n'
    )
    rekla_eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
        f'Du hast {zeit} Stunden gearbeitet\nReklamationen: {grund}\n\n'
    )
    list_eintrag = [kommission, ort, zeitpunkt, zeit, pause, chef]
    rekla_tag_eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} Reklamationen im {ort} erledigen.\n'
        f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
        f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
        f'Du hast {zeit} Stunden gearbeitet,'
        f' du warst wieder bei Kommission {rekla_kommissionen}\n'
        f'Reklamationen: {grund}\n\n'
    )
    test = input('Korrekte Eingaben? (JA) : ')
    if test == 'JA':
        if kommission == 'rekla':
            with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
                file.write(rekla_tag_eintrag)
        else:
            with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
                file.write(eintrag)
        with open('Arbeitsstunden.csv', 'a', encoding='utf-8') as csv_file:
            writer = csv.writer(csv_file, delimiter=';')
            writer.writerow(list_eintrag)
        if rekla == 'ja':
            with open('Reklamationen.txt', 'a', encoding='utf-8') as file:
                file.write(rekla_eintrag)
    else:
        exit()

if __name__ == '__main__':
    main()

### Kommentare ###
# Verschiedene Touren

folgender Fehler:
Arbeitsende : 18:00
Traceback (most recent call last):
File "./arbeit.py", line 71, in <module>
main()
File "./arbeit.py", line 28, in main
zeit = time_ende - time_start
TypeError: unsupported operand type(s) for -: 'time.struct_time' and 'time.struct_time'


wenn ich time mir datetime ersetzte dann kommt folgender fehler:
Arbeitsbeginn : 6:00
Traceback (most recent call last):
File "./arbeit.py", line 71, in <module>
main()
File "./arbeit.py", line 24, in main
time_start= datetime.strptime(start, "%H:%M")
AttributeError: module 'datetime' has no attribute 'strptime'

aber eigentlich muss es mit timeobjekten auch funktionieren hab ja kein datum zum rechnen wie kann ich jetzt mit zwei timeobjekten rechnen ?!
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt wild zu Raten, solltest Du einfach man in die Dokumentation schauen, wie man strptime bei datetime aufruft. Und nein, Zeitdifferenzen brauchen immer datetime-Objekte, time-Objekte reichen nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Zum Rechnen mit Zeitangaben ist das `datetime`-Modul da, mit den Sachen die `time` anbietet, geht das nur bedingt. `time` ist grösstenteils einfach nur eine recht dünne Schicht über die Funktionen die C-Programmierern zur Verfügung stehen. Wenn da zusammengesetzte Werte zurückgegeben werden, dann sind das reine Datenobjekte ohne weiteres verhahlten. Soweit ich das sehe alles `collections.namedtuple()`, welche die C-Strukturen abbilden.

Die zweite Ausnahme bekommst Du weil Du versuchst `strptime()` auf dem `datetime`-Modul aufzurufen statt auf dem `datetime`-Datentypen. Im `datetime`-Modul gibt es einen Datentypen der auch `datetime` heisst – *der* hat eine statische `strptime()`-Methode.

Mit `time`-Objekten kann man nicht rechnen. Das geht nur mit `datetime`- und `timedelta`-Objekten, also mit konkreten Zeitpunkten.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import time
from datetime import datetime

def main():
    auftraggeber = input('Auftraggeber (h/r/b) : ')
    if auftraggeber == 'h': auftraggeber = 'Hofmeister'
    if auftraggeber == 'r': auftraggeber = 'Röck'
    if auftraggeber == 'b': auftraggeber = 'Binsch'
    kommission = input('Kommission : ')
    if kommission == 'rekla':
        rekla_kommissionen = input('Kommissionen : ')
    else:
        rekla_kommissionen = ''
    ort = input('Ort : ')
    chef = input('Chef : ')
    rekla = input('Reklamation (ja/ ) : ')
    if rekla == 'ja':
        grund = input('Kommission, Begründung der Reklamationen : ')
    else:
        grund = ''
    start = input('Arbeitsbeginn : ')
    time_start= datetime.strptime(start, "%H:%M")
    ende = input('Arbeitsende : ')
    time_ende = datetime.strptime(ende, "%H:%M")
    if time_ende < time_start:
        print('Value_Error')
        time.sleep(3)
        exit()
    time_zeit = time_ende - time_start
    zeit = str(time_zeit)[:-3]
    pause = input('Pause : ')
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
        f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
        f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
        f'Du hast {zeit} Stunden gearbeitet\n\n'
    )
    rekla_eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
        f'Du hast {zeit} Stunden gearbeitet\nReklamationen: {grund}\n\n'
    )
    list_eintrag = [kommission, ort, zeitpunkt, zeit, pause, chef]
    rekla_tag_eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} Reklamationen im {ort} erledigen.\n'
        f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
        f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
        f'Du hast {zeit} Stunden gearbeitet,'
        f' du warst wieder bei Kommission {rekla_kommissionen}\n'
        f'Reklamationen: {grund}\n\n'
    )
    test = input('Korrekte Eingaben? (JA) : ')
    if test == 'JA':
        if kommission == 'rekla':
            with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
                file.write(rekla_tag_eintrag)
        else:
            with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
                file.write(eintrag)
        with open('Arbeitsstunden.csv', 'a', encoding='utf-8') as csv_file:
            writer = csv.writer(csv_file, delimiter=';')
            writer.writerow(list_eintrag)
        if rekla == 'ja':
            with open('Reklamationen.txt', 'a', encoding='utf-8') as file:
                file.write(rekla_eintrag)
    else:
        exit()

if __name__ == '__main__':
    main()

### Kommentare ###
# Verschiedene Touren

gut das geht schonmal nur wie formatiere ich das ganze in folgendes Format: z.B. 10,25 d.h. 10Stunden und 15Minuten
auch das wäre gelöst habt ihr da vielleicht ne bessere methode als:
time_zeit = time_ende - time_start
zeit = str(time_zeit)[:-3]

in meiner csv Datei brauche ich zwingend 10,25 als format
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import time
from datetime import datetime

def main():
    auftraggeber = input('Auftraggeber (h/r/b) : ')
    if auftraggeber == 'h': auftraggeber = 'Hofmeister'
    if auftraggeber == 'r': auftraggeber = 'Röck'
    if auftraggeber == 'b': auftraggeber = 'Binsch'
    kommission = input('Kommission : ')
    if kommission == 'rekla':
        rekla_kommissionen = input('Kommissionen : ')
    else:
        rekla_kommissionen = ''
    ort = input('Ort : ')
    chef = input('Chef : ')
    rekla = input('Reklamation (ja/ ) : ')
    if rekla == 'ja':
        grund = input('Kommission, Begründung der Reklamationen : ')
    else:
        grund = ''
    start = input('Arbeitsbeginn : ')
    time_start = datetime.strptime(start, "%H:%M")
    ende = input('Arbeitsende : ')
    time_ende = datetime.strptime(ende, "%H:%M")
    if time_ende < time_start:
        print('Value_Error')
        time.sleep(3)
        exit()
    time_zeit = time_ende - time_start
    time_zeit = str(time_zeit)[:-3]
    #zeit = datetime.strptime(time_zeit, "%H,%M")
    pause = input('Pause : ')
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
        f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
        f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
        f'Du hast {time_zeit} Stunden gearbeitet\n\n'
    )
    rekla_eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
        f'Du hast {time_zeit} Stunden gearbeitet\nReklamationen: {grund}\n\n'
    )
    list_eintrag = [kommission, ort, zeitpunkt, zeit, pause, chef]
    rekla_tag_eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} Reklamationen im {ort} erledigen.\n'
        f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
        f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
        f'Du hast {time_zeit} Stunden gearbeitet,'
        f' du warst wieder bei Kommission {rekla_kommissionen}\n'
        f'Reklamationen: {grund}\n\n'
    )
    test = input('Korrekte Eingaben? (JA) : ')
    if test == 'JA':
        if kommission == 'rekla':
            with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
                file.write(rekla_tag_eintrag)
        else:
            with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
                file.write(eintrag)
        with open('Arbeitsstunden.csv', 'a', encoding='utf-8') as csv_file:
            writer = csv.writer(csv_file, delimiter=';')
            writer.writerow(list_eintrag)
        if rekla == 'ja':
            with open('Reklamationen.txt', 'a', encoding='utf-8') as file:
                file.write(rekla_eintrag)
    else:
        exit()

if __name__ == '__main__':
    main()

### Kommentare ###
# Verschiedene Touren

so habe ich mir das vorgestellt nur geht das natürlich nicht

und so geht's auch nicht: zeit = float(time_zeit)

wie wandle ich das timedelta objekt 10:15 in eine Dezimalzahl 10,25 um?

time_zeit = time_ende - time_start
time_zeit = str(time_zeit)[:-3]
h, m = time_zeit.split(':')
zeit = "{0},{1}".format(h,m)
schonmal ein schritt weiter nur wie rechne ich das jetzt richtig um das nach dem Komma die Dezimalzahl der Minuten steht und nicht die Minuten an sich?
Zuletzt geändert von Pad385 am Mittwoch 17. April 2019, 10:41, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das timedelta-Objekt hat Attribute. Die kannst du benutzen. Und aus den Attributen fuer Minuten und Sekunden und string-formatting zB deine gewuenschte Darstellung erzeugen.
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine etwas sinnvollere Information als `Value_Error` bei falschen Zeiten wäre gut. `exit` sollte in einem normalen Programm nicht vorkommen (außer man will einen Exitcode != 0), ein `return` reicht völlig. Vor allem das `else: exit()` ganz zu Schluß ist unsinnig.
Die String-Darstellung eines timedelta-Objekts ist meiner Meinung nach, selten zu gebrauchen. Du mußt aus time_zeit (was für ein Name) die Sekunden nehmen, und selbst in Stunden und Minuten umrechnen (divmod). Die Pause muß von der Arbeitszeit noch abgezogen werden.
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

ich habe keine Ahnung was du mit return machen willst bzw hab ich keine Ahnung was return macht ich will erstmal das das script läuft das exit am ende soll das script beenden wenn beim test = input was anderes eingegeben wird als 'JA'
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und return beendet main, und da danach nix mehr passiert beendet sich das Programm. Du erreichst also dein Ziel UND machst etwas richtig. Muss man aber natuerlich nicht tun 🤷‍♂️
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Code: Alles auswählen

    start = input('Arbeitsbeginn : ')
    time_start = datetime.strptime(start, "%H:%M")
    ende = input('Arbeitsende : ')
    time_ende = datetime.strptime(ende, "%H:%M")
    if time_ende < time_start:
        print('Value_Error')
        time.sleep(3)
        return
    pause = input('Pause : ')
    time_pause = datetime.strptime(pause, "%H:%M")
    time_zeit = time_ende - time_start - pause
    sekunden = timedelta.total_seconds(time_zeit)
    minuten = time_zeit / 60
    stunden = minuten / 60
so nur was bringt mir das ich habe doch jetzt trotzdem nur die stunden und Minuten nur halt getrennt also wie mache ich jetzt aus der variable Minuten eine Dezimalzahl mit stunden und Minuten im moment bekomme ich ja dann am ende bei wert 10:45 das Ergebnis 10,45
wenn ich
Minuten = time_zeit / 60 / 60
stunden = minuten / 60
und das ganze zusammensetzte kommt ja z.B. 10,0,75 raus
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Dann rechne das aus den Gesamtsekunden aus. Die einfach mal (60 * 60) rechnen, als Zeichenkette mit zwei Nachkommastellen formatieren (`format()`) und da dann den Dezimalpunkt durch ein Dezimalkomma ersetzen und Du hast was Du brauchst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import time
from datetime import datetime, timedelta

def main():
    auftraggeber = input('Auftraggeber (h/r/b) : ')
    if auftraggeber == 'h': auftraggeber = 'Hofmeister'
    if auftraggeber == 'r': auftraggeber = 'Röck'
    if auftraggeber == 'b': auftraggeber = 'Binsch'
    kommission = input('Kommission : ')
    if kommission == 'rekla':
        rekla_kommissionen = input('Kommissionen : ')
    else:
        rekla_kommissionen = ''
    ort = input('Ort : ')
    chef = input('Chef : ')
    rekla = input('Reklamation (ja/ ) : ')
    if rekla == 'ja':
        grund = input('Kommission, Begründung der Reklamationen : ')
    else:
        grund = ''
    start = input('Arbeitsbeginn : ')
    obj_start = datetime.strptime(start, "%H:%M")
    ende = input('Arbeitsende : ')
    obj_ende = datetime.strptime(ende, "%H:%M")
    if obj_ende < obj_start:
        print('Value_Error')
        time.sleep(3)
        return
    pause = input('Pause : ')
    obj_pause = datetime.strptime(pause, "%H:%M")
    obj_zeit = obj_ende - obj_start - obj_pause
    sekunden = timedelta.total_seconds(obj_zeit)
    zeit = sekunden / 60 / 60
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    str_zeit = str(obj_zeit)[:-3]
kannst mir noch sagen wieso er in obj_zeit ein fehler ausgibt?
Arbeitsbeginn : 6:15
Arbeitsende : 18:00
Pause : 1:00
Traceback (most recent call last):
File "./arbeit.py", line 78, in <module>
main()
File "./arbeit.py", line 33, in main
obj_zeit = obj_ende - obj_start - obj_pause
TypeError: unsupported operand type(s) for -: 'datetime.timedelta' and 'datetime.datetime'
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Na da steht doch da: Du versucht von einem `timedelta`-Objekt ein `datetime`-Objekt abzuziehen, was verständlicherweise nicht geht. Was soll denn dabei heraus kommen? Wenn Du zum Beispiel von 10 Stunden und 45 Minuten den 01.01.1900 um 1 Uhr nachts abziehst, was sollte da ein sinnvolles Ergebnis sein?

Überlege mal was von diesen Werten ein Zeitpunkt und was eine Zeitspanne ist, und vergleiche das mit den tatsächlichen Datentypen die Du für die Werte verwendest.

Warum hast Du vor einige Namen diesen sinnfreien `obj_*`-Präfix gesetzt? In Python ist *alles* was man an einen Namen binden kann ein Objekt. Das müsstest Du dann also bei jedem Namen davor setzten. Oder eben bei keinem, denn dieser Präfix bietet absolut keinen Mehrwert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import time
from datetime import datetime, timedelta

def main():
    auftraggeber = input('Auftraggeber (h/r/b) : ')
    if auftraggeber == 'h': auftraggeber = 'Hofmeister'
    if auftraggeber == 'r': auftraggeber = 'Röck'
    if auftraggeber == 'b': auftraggeber = 'Binsch'
    kommission = input('Kommission : ')
    if kommission == 'rekla':
        rekla_kommissionen = input('Kommissionen : ')
    else:
        rekla_kommissionen = ''
    ort = input('Ort : ')
    chef = input('Chef : ')
    rekla = input('Reklamation (ja/ ) : ')
    if rekla == 'ja':
        grund = input('Kommission, Begründung der Reklamationen : ')
    else:
        grund = ''
    start = input('Arbeitsbeginn : ')
    timeobj_start = datetime.strptime(start, "%H:%M")
    ende = input('Arbeitsende : ')
    timeobj_ende = datetime.strptime(ende, "%H:%M")
    if timeobj_ende < timeobj_start:
        print('Value_Error')
        time.sleep(3)
        return
    pause = input('Pause : ')
    timeobj_pause = datetime.strptime(pause, "%H:%M")
    timeobj_zeit = timeobj_ende - timeobj_start - timeobj_pause
    sekunden = timedelta.total_seconds(timeobj_zeit)
    zeit = sekunden / 60 / 60
    format_zeit = '{%H,%M}'.format(zeit)
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    str_zeit = str(timeobj_zeit)[:-3]

aber
start = input('Arbeitsbeginn : ')
timeobj_start = datetime.strptime(start, "%H:%M")
ende = input('Arbeitsende : ')
timeobj_ende = datetime.strptime(ende, "%H:%M")
pause = input('Pause : ')
timeobj_pause = datetime.strptime(pause, "%H:%M")

sind doch alles die gleichen Objekte?! check ich nicht da steht überall datetime ich habe ja mit keinen der werte gerechnet und ausgerechnet wurden die auch nicht
start ist ein zeitpunkt genau wie ende und pause ist eine Zeitspanne

das mit dem timeeobj habe ich gemacht weil Sirius in einem vorherigen beitrag über die namensvergebung geplänkert hat :)
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Das `obj` da nun innerhalb des Namens zu schreiben macht es nicht sinnvoller…

Ja, die haben alle den gleichen Typ. Sollten sie das denn? Die Frage impliziert ja im Grunde schon ein: Nein, sollten sie nicht. Denn eines von den dreien ist anders als die anderen beiden. Nochmal welcher von diesen Werten ist in der Realität ein Zeipunkt und welcher ist eine Zeitspanne?

Und natürlich rechnest Du mit denen – genau in der Zeile in der ein Problem damit auftritt, steht ganz offensichtlich eine Rechnung an der alle drei Werte als Operanden beteiligt sind.

Wenn der Benutzer bei der ersten Frage einen anderen Buchstaben als 'h', 'r', oder 'b' eingibt, hast Du ein Problem. Die ``if``\s und die Namen im Code sind auch nicht gerade praktisch. Da würde man eher eine Datenstruktur verwenden, zum Beispiel ein Wörterbuch, und das am Anfang als Konstante definieren. Daraus kann man dann auch den Prompt für die Frage generieren, so dass man nicht 'h', 'r', und 'b' dort und bei den ``if``-Bedingungen stehen haben muss.

Da steht mittlerweile auch schon viel zu viel in der einen Funktion. Benutzerinteraktion und Programmlogik sollte man vielleicht auch langsam mal trennen. Dann kann man die Funktion die aus Start, Ende, und Pause die Zeit in Stunden berechnet, zum Beispiel auch einfacher testen.

Was man vielleicht auch abfangen möchte sind Benutzer die Pausen eingeben die länger als die Arbeitszeit sind. Wie gesagt, Benutzer geben absichtlich oder aus versehen die abenteuerlichsten Sachen ein. Und wenn der Benutzer etwas eingibt was sich nicht als Stunde:Minute parsen lässt, sollte das Programm besser auch nicht einfach so abbrechen. Auch hier würde sich eine Funktion anbieten in der der Benutzer eine Uhrzeit/Zeitspanne in Stunden und Minuten eingeben kann, weil man die drei mal braucht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

start ist ein Zeitpunkt ende ist ein Zeitpunkt und pause ist eine Zeitspanne wobei bei start, ende und pause werden doch genau die gleichen eingaben gefordert nämlich %H:%M und es wird in ein datetimeobjekt geschrieben also sind die doch alle gleich also wieso kann man dann damit nicht rechnen?!

das der benutzer noch falsche angaben machen kann ist mal nebenhingestellt die paar zeilen schreibe ich am ende
das programm soll nicht kommerziell verwendet werden zumindest erstmal noch bin in angestellter das ändert sich aber irgendwann in der zukunft aber bis dahin bleibt das program nur auf meinem rechner
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil es sinnlos ist damit zu rechnen. Was ist denn deiner Meinung nach 10:00 - 9:00? Das sind nunmal ZeitPUNKTE, und zwischen zweien davon gibt es einen ZeitUNTERSCHIED (oder Spanne, eben timedelta). Und aus einem ZeitPUNKT und einem ZeitUNTERSCHIED kann man einen weiteren ZeitPUNKT berechnen. 10:00 + 1h == 11:00. Aber 13:00 - 14:00 waere dann was nach deiner Logik? -1:00 morgens? Das gibt's vielleicht in Hogwarts. In der echten Welt eher nicht so. Und selbst wenn du das nicht einsehen magst, so ist's halt gegeben. Was genau also bringt es, sich darueber zu aergern? Wenn du aus einer Eingabe von 1:00 eine Zeitspanne machen willst, dann subtrahier halt halt 1:00 - 0:00, und du hast dein 1h-timedelta.
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Das der Benutzer Zeitpunkte und -spannen im selben Format eingibt, ändert nichts daran, dass das konzeptionell verschiedene Dinge sind. Und das man die auch so behandeln muss wenn man damit rechnen will. Wie schon gesagt, was soll denn 4 Stunden und 25 Minuten minus den 01.01.1900 um 1 Uhr für ein Ergebnis ergeben? Das macht einfach keinen Sinn. Und darum geht das nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

okay verstanden aber wie soll ich das dann machen, so wie deets sagt?

meinst du so umschreiben?

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import time
from datetime import datetime, timedelta

def read():
    #pattern = {'h': 'Hofmeister', 'r': 'Röck', 'b': 'Binsch'}
    auftraggeber = input('Auftraggeber (h/r/b) : ')
    if auftraggeber == 'h': auftraggeber = 'Hofmeister'
    if auftraggeber == 'r': auftraggeber = 'Röck'
    if auftraggeber == 'b': auftraggeber = 'Binsch'
    kommission = input('Kommission : ')
    if kommission == 'rekla':
        rekla_kommissionen = input('Kommissionen : ')
    else:
        rekla_kommissionen = ''
    ort = input('Ort : ')
    chef = input('Chef : ')
    rekla = input('Reklamation (ja/ ) : ')
    start = input('Arbeitsbeginn : ')
    ende = input('Arbeitsende : ')
    pause = input('Pause : ')

def write():
       if time_ende < timeobj_start:
    print('Value_Error, Zeitangaben')
       time.sleep(3)
       return
    if rekla == 'ja':
        grund = input('Kommission, Begründung der Reklamationen : ')
    else:
        grund = ''
    timeobj_start = datetime.strptime(start, "%H:%M")
    time_ende = datetime.strptime(ende, "%H:%M")
    time_pause = datetime.strptime(pause, "%H:%M")
    time_zeit = time_ende - time_start - time_pause
    sekunden = timedelta.total_seconds(time_zeit)
    zeit = sekunden / 60 / 60
    format_zeit = '{%H,%M}'.format(zeit)
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    str_zeit = str(time_zeit)[:-3]
    eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
        f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
        f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
        f'Du hast {str_zeit} Stunden gearbeitet\n\n'
    )
    rekla_eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
        f'Du hast {str_zeit} Stunden gearbeitet\nReklamationen: {grund}\n\n'
    )
    list_eintrag = [kommission, ort, zeitpunkt, zeit, pause, chef]
    rekla_tag_eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} Reklamationen im {ort} erledigen.\n'
        f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
        f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
        f'Du hast {str_zeit} Stunden gearbeitet,'
        f' du warst wieder bei Kommission {rekla_kommissionen}\n'
        f'Reklamationen: {grund}\n\n'
    )
    test = input('Korrekte Eingaben? (JA) : ')
    if test == 'JA':
        if kommission == 'rekla':
            with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
                file.write(rekla_tag_eintrag)
        else:
            with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
                file.write(eintrag)
        with open('Arbeitsstunden.csv', 'a', encoding='utf-8') as csv_file:
            writer = csv.writer(csv_file, delimiter=';')
            writer.writerow(list_eintrag)
        if rekla == 'ja':
            with open('Reklamationen.txt', 'a', encoding='utf-8') as file:
                file.write(rekla_eintrag)
    else:
        return
    
Antworten