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

Du hast eine Idee für ein Projekt?
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Samstag 6. April 2019, 22:52

das mit den Reklas stimmt schon wenn alles schief geht fährt man zu einer rekla und nimmt dann eine weitere rekla auf..:/
nein wenn Kommission rekla lautet soll auch in der csv rekla stehen
das Skript funktioniert zur zeit wie es soll nur spiele ich auf den vorschlag von blackjack an mit dem datetime modul zu rechnen
Sirius3
User
Beiträge: 9902
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 7. April 2019, 08:37

Und ich spiele darauf an, dass kommission == 'rekla' und rekla == 'ja' immer konsistent sein müssen, damit die Texte, die Du erzeugst Sinn machen. Ergo, ist eine Angabe davon überflüssig.

Zeig doch mal, wie weit Du mit den Zeiten schon gekommen bist, erster Schritt wäre ja, Beginn und Ende mit datetime.datetime.strptime in ein DateTime-Objekt zu überführen.
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Mittwoch 10. April 2019, 18:09

so in etwa ?

Code: Alles auswählen

    time_ende = datetime.strptime(ende, "%H:%M")
    time_start= datetime.strptime(start, "%H:%M")
ich habs verstanden da läuft was nicht richtig..
Sirius3
User
Beiträge: 9902
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 10. April 2019, 18:40

Das ist doch schon ein guter Anfang.
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Dienstag 16. April 2019, 23:36

kp wie das gehen soll

zeit = timedelta(time_ende) - timedelta(time_start)


und

time_start= datetime.strptime(start, "%H:%M")

geht auch nicht
Benutzeravatar
__blackjack__
User
Beiträge: 3370
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 16. April 2019, 23:47

@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. :-)
“I am Dyslexic of Borg, Your Ass will be Laminated” -- unknown
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Mittwoch 17. April 2019, 09:03

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: 9902
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 17. April 2019, 09:23

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: 3370
Registriert: Samstag 2. Juni 2018, 10:21

Mittwoch 17. April 2019, 09:42

@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.
“I am Dyslexic of Borg, Your Ass will be Laminated” -- unknown
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Mittwoch 17. April 2019, 09:47

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

Mittwoch 17. April 2019, 10:22

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: 5626
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 17. April 2019, 10:40

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: 9902
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 17. April 2019, 10:50

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

Mittwoch 17. April 2019, 11:05

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: 5626
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 17. April 2019, 11:11

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 🤷‍♂️
Antworten