Uhrzeit angeben und umrechnen

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.
Antworten
no_idea
User
Beiträge: 6
Registriert: Freitag 25. Oktober 2013, 16:50

Liebe Pythonfreunde,

ich habe mir vor fünf Tagen ein Buch über Pythonprogrammieren für Anfänger gekauft und bin seit drei Tagen mit meinen ersten Programmierversuchen beschäftigt.
Ich habe ein kleines Programm geschrieben, dass mir mit Angabe von einer Startuhrzeit und Geschwindigkeit ausrechnet, wann ich wieder zurück bin. Allerdings muss man für das Programm alle Eingaben in Industriestunden angeben. :lol: (nicht toll, aber geht)

Wie kann ich das optimieren?

Ich würde mich sehr über ein paar Tipps und Ideen freuen. :)

Code: Alles auswählen

print ('Wann kommst Du vom Joggen zurück:')
print ('''Rechne alle Zeiten mit folgender Formel in Industriestunden um: Ih = std + min/60 + sec/3600) -Danke für die Mitarbeit.:) (Das Programm wird noch optimiert.)''')
start_Ih = float(input('Gib die Startzeit in Ih an:'))
v1 = float(input ('Gib die erste Durchschnittsgeschwindigkeit in Ih ein:'))
weg1 = float(input ('Gebe die gelaufenen Kilometer ein:'))
v2 = float (input ('Gebe die zweite Durchschnittsgeschwindigkeit als Ih ein:'))
weg2 = float (input ('Gebe die gelaufenen Kilometer ein:'))
dauer1_Ih = float (v1 * weg1)
dauer2_Ih = float (v2 * weg2)
ges_dauer = float (dauer1_Ih + dauer2_Ih)
ankunft = start_Ih + ges_dauer
print ('Du bist um', ankunft, 'Uhr (Ih) wieder zurück.')
Gruß, No_idea
Zuletzt geändert von Anonymous am Sonntag 27. Oktober 2013, 17:59, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@no_idea: Eine Verbesserung wäre offensichtlich dass Du den Benutzer „normale” Zeitangaben machen lässt und das Programm die nötigen Rechnungen durchführt. Entweder lässt Du den Benutzer Stunden und Minuten getrennt eingeben, oder als eine Zeichenkette mit Trennzeichen und splittest die dann auf. Spätestens bei diesen Umrechnungen würde es sich auch anbieten nicht alles in einem Block runterzuschreiben, sondern sinnvoll auf Funktionen aufzuteilen die man dann einzeln und unabhängig vom Rest testen kann.

Du verwendest zu oft die `float()`-Funktion. Überleg mal wo Du sie tatsächlich brauchst und wo sie keinen Effekt hat und damit überflüssig ist.

Es gibt für meinen Geschmack zu viele benannte Zwischenergebnisse. Und die Namen sind teilweise nicht treffend. `weg` ist eigentlich eine `entfernung`. `ankunft` ist eine `ankunfstzeit`. Und Abkürzungen sollte man vermeiden wenn sie nicht allgemein bekannt sind. `ges_dauer` ist nicht so klar wie `gesamt_dauer`. Selbst wenn Abkürzungen in gewissen Bereichen bekannt sind, kann man überlegen sie nicht zu verwenden. Mit `geschwindigkeit` können mehr Leute etwas anfangen als mit `v`.

Die Leerzeichen bei Funktionsaufrufen sind uneinheitlich und auch zum Grossteil ungewöhnlich gesetzt. Zwischen Funktionsname und öffnender Klammer kommt eigentlich kein Leerzeichen.
Benutzeravatar
Foobar
User
Beiträge: 8
Registriert: Sonntag 2. September 2012, 10:02
Wohnort: Hessen

Hallo no_idea - Herzlich willkommen im Forum! 8)

Ein kleiner Tipp zu beginn:
Wenn du deinen Python Quellcode mit [*Code=python] und [*/Code] (ohne die Sternchen) umschließt, können wir deinen Quellcode viel bequemer lesen :)

Arbeitest du mit Python 2.x oder 3.x?
Wenn du mit Python 2.x arbeitest, empfehle ich statt der input- die raw_input-Funktion.
Für Python 3.x vergiss es einfach ganz schnell wieder und lies einfach weiter.

Vergiss bitte die Shebang-Zeile am Anfang des Programms nicht. Diese Zeile mit dem komischen Namen gibt auf Linux- und Unix-Systemen an, wo der Computer deine Python-Installation suchen soll. Die Zeile kannst du einfach kopieren und einsetzen und brauchst dir dann keine Gedanken mehr darum machen. Wichtig ist nur, dass es die ALLERERSTE Zeile in deiner Datei ist (weder Leerzeile noch Kommentarzeile davor!):

Code: Alles auswählen

#!/usr/bin/env python


Da du deine Werte direkt bei der Eingabe mit float(x) in float-Werte umwandelst, kannst du dir in den späteren Rechnungen das float(x) sparen:

Code: Alles auswählen

dauer1_Ih = v1 * weg1
dauer2_Ih = v2 * weg2
ges_dauer = dauer1_Ih + dauer2_Ih


Bei der Ausgabe in der letzten Zeile hast du eine runde Klammer gesetzt. Die musst du aber wegnehmen, sonst sagt die Zeile etwas anderes aus, als du willst. Wenn du einfach die Werte hintereinander Ausgeben willst, geht das also so:

Code: Alles auswählen

print  'Du bist um', ankunft, 'Uhr (Ih) wieder zurück.'
Nun endlich zu deinen "Industriestunden" (gibt's den Begriff wirklich? :D )
Hattest du schon etwas über Listen oder Strings/Zeichenketten? Die brauchst du, um die Industriestunden abzuschaffen ^^
Dazu lässt du einfach eine Uhrzeit als Zeichenkette eingeben (z.B. in der Form hh:mm, also meinetwegen 18:03 Uhr. Wichtig: Ohne das float(), also nur zeit = input(...) ). Aus der so eingegeben Zeichenkette müsstest du dann Stunden und Minuten extrahieren und könntest die Umrechnung in Industriestunden vom Programm machen lassen:

Code: Alles auswählen

start_zeit = input('Gib die Startzeit an (hh:mm):')
start_Ih = float(start_zeit[:2]) + float(start_zeit[3:])/60
Wenn du dem Benutzer deines Programms eine Freude machen willst, solltest du dann noch am Ende die Rückkehr Zeit auch wieder von Industriestunden auf eine normale Uhrzeit umrechnen und als Stunden und Minuten ausgeben ;)

Wie BlackJack schon sagte, solltest du dir auch von Anfang an angewöhnen, deine Variablen möglichst treffend zu benennen. Sonst bekommen wir oder andere, die deinen Quellcode lesen sollen, irgendwann Probleme, ihn nachzuvollziehen (wenn er mal komplizierter wird). z.B. 'v' ist kein guter Name, besser währe "geschwindigkeit" oder "velocity"

Gruß, Micha
no_idea
User
Beiträge: 6
Registriert: Freitag 25. Oktober 2013, 16:50

Hallo blackjack, Hallo Micha,

vielen Dank für Eure Antworten. :D

'Nun endlich zu deinen "Industriestunden" (gibt's den Begriff wirklich? )' - Ja, das heißt so. Habe ich vorher auch nicht gewusst, aber steht in wikipedia und wird wohl bei der Zeiterfassung in Firmen verwendet.

'Hattest du schon etwas über Listen oder Strings/Zeichenketten?'
-Ich habe mir gestern ein Video über Listen angesehen. Das klingt sehr sinnvoll und deshalb werde ich es auch gleich ausprobieren.

'Die brauchst du, um die Industriestunden abzuschaffen ^^
Dazu lässt du einfach eine Uhrzeit als Zeichenkette eingeben (z.B. in der Form hh:mm, also meinetwegen 18:03 Uhr. Wichtig: Ohne das float(), also nur zeit = input(...) ). Aus der so eingegeben Zeichenkette müsstest du dann Stunden und Minuten extrahieren und könntest die Umrechnung in Industriestunden vom Programm machen lassen:'

-Dann werde ich mich jetzt mal ransetzen und mein Programm versuchen zu optimieren. :)
Echt super, dass Ihr euch die Mühe gemacht habt, mir ein paar Tipps und Bsp. zu geben.

Bis bald, no_idea
BlackJack

@no_idea: Wobei in dem Wikipediaartikel keine einzige Quelle angegeben ist und auch dort auf der Diskussionsseite die Frage gestellt wird ob der Artikel ernst gemeint ist. Und irgendwo ist der Begriff auch unnötig, denn ich habe schon oft gesehen das Stunden zum Beispiel als 1,5 h angegeben wurden, da ist die Einheit aber ganz normal Stunden (h) und nicht Industriestunden (Ih). Die Einheit umzubenennen macht also keinen Sinn, weil es keinen Mehrwert bringt. 1,5 h hat genau die gleiche Bedeutung wie 1,5 Ih. Was soll das also‽ Da 1,5 Ih dermassen ungebräuchlich ist, sehe ich da eher sogar noch die Gefahr, dass jemand ratlos davor sitzt und rätselt was denn jetzt bitte Stromstunden im Kontext von Lauftraining sein sollen. :-)

Noch eine Anmerkung zum Quelltext: Wenn man anfängt Namen durchzunummerieren, dann ist das oft ein Zeichen das etwas falsch läuft und man eigentlich eine Datenstruktur für die Werte verwenden möchte. Meistens eine Liste. In diesem Fall braucht man vielleicht auch nur eine Schleife in der der Benutzer beliebig viele Strecken und Geschwindigkeiten eingeben kann. Man kann dann einen speziellen Wert oder das „Dateiende” als Abbruchkriterium verwenden und dann das Ergebnis ausgeben.
no_idea
User
Beiträge: 6
Registriert: Freitag 25. Oktober 2013, 16:50

'Dazu lässt du einfach eine Uhrzeit als Zeichenkette eingeben (z.B. in der Form hh:mm, also meinetwegen 18:03 Uhr. Wichtig: Ohne das float(), also nur zeit = input(...) ). Aus der so eingegeben Zeichenkette müsstest du dann Stunden und Minuten extrahieren und könntest die Umrechnung in Industriestunden vom Programm machen lassen:'

Wenn ich jetzt eingebe:
startzeit = input ('Gib die Startzeit ein (hh:mm):'), dann schreibe ich z.B. 06:50 Uhr rein.

Wie extrahiere ich denn die Stundenangabe und die Minutenangabe?

start_h = float (startzeit[?:]) + float (startzeit[:?])/60

Was muss ich hier im Programm bei ? schreiben, damit es erkennt, dass ich die Stunden und Minuten von der oberen Eingabe separat haben möchte???

@BlackJack
Wenn ich 06:50 Uhr angebe, ist das eine Mischung aus verschiedenen Einheiten (Stunden und Minuten) und bezieht sich auf den Tagesverlauf. Die Angabe 04:03 min (Minuten und Sekunden) ist keine Uhrzeit und ist nicht abhängig vom Tagesverlauf. Und wenn ich 06:50 Uhr + 00:20 min (gesamtdauer) rechne, zeigt er mir 06:70 Uhr an, anstatt 07:10 Uhr. Deshalb sollte ich die Uhrzeiten und Geschwindigkeiten in (Industrie)stunden umwandeln, so dass immer mit der gleichen Einheit gerechnet wird.
Bei 1,5 h gibt man ja keine Uhrzeit sondern nur die Zeit an. 30 min sind 0,5 h aber 50 min sind 0,83 h.
Ich weiß nicht, ob ich das jetzt richtig erklärt habe, warum ich diese Umrechnung benötige? :?

Was ist eine Shebang-Zeile??? -Das habe ich noch nicht gelesen. :oops:
Gruß, no_idea
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

no_idea hat geschrieben:startzeit = input ('Gib die Startzeit ein (hh:mm):'), dann schreibe ich z.B. 06:50 Uhr rein.

Wie extrahiere ich denn die Stundenangabe und die Minutenangabe?
Strings haben eine Methode um sie aufzuteilen.

Code: Alles auswählen

>>> '13:37'.split(':')
['13', '37']
Du musst nur berücksichtigen, dass die einzelnen Elemente der Liste immer noch Strings sind und erst in eine Zahl konvertiert werden müssen bevor man damit rechnen kann.
BlackJack

@no_idea: Foobar hat doch konkrete Zahlen bei der Slice-Notation angegeben. Du solltest das vielleicht auch in der Dokumentation/dem Tutorial in der Dokumentation nachlesen. Und nicht zuletzt kann man das interaktiv einfach mal ausprobieren.

Code: Alles auswählen

In [11]: '06:50'[0:]
Out[11]: '06:50'

In [12]: '06:50'[1:]
Out[12]: '6:50'

In [13]: '06:50'[2:]
Out[13]: ':50'

In [14]: '06:50'[3:]
Out[14]: '50'

In [15]: '06:50'[4:]
Out[15]: '0'

In [16]: '06:50'[:1]
Out[16]: '0'

In [17]: '06:50'[:2]
Out[17]: '06'

In [18]: '06:50'[:3]
Out[18]: '06:'

In [19]: '06:50'[:4]
Out[19]: '06:5'

In [20]: '06:50'[:5]
Out[20]: '06:50'
Wobei das IMHO nicht robust genug ist. Es gibt sicher Leute die da statt 06:50 nur 6:50 eingeben und (IMHO zu Recht) erwarten dass das auch funktioniert. Siehe /me's Beitrag.

Mir ist klar warum die Umrechnung nötig beziehungsweise praktisch ist. Was mir nicht klar ist wozu Industriestunden gut sind, wo das doch exakt das gleiche ist wie Stunden. Wenn mir jemand sagt rechne eine Stunde und dreissig Minuten in Stunden als Dezimalbruch um, dann ist die Antwort 1,5 h. Also *Stunden*. Nicht *Industriestunden*. Wenn jemand sagt rechne eine Stunde und dreissig Minuten in Industriestunden um dann ist die Antwort anscheinend 1,5 Ih. Also genau der gleiche Wert nur eine andere Bezeichnung für die Einheit. Wozu brauche ich diese Einheit wenn der Umrechnungsfaktor zwischen Stunden und Industriestunden *immer* 1 ist, also jede Angabe in Stunden exakt den gleichen Wert hat wie die äquivalente Angabe in Industriestunden. Welchen Sinn und Nutzen hat der Begriff Industriestunden dann wenn man doch synonym den Begriff Stunden verwenden kann, den soweit ich das sehe deutlich mehr Leute kennen und dessen Einheitskürzel man nicht als Stromstunden fehlinterpretieren kann.

Wenn Du bei der Rechnung 06:50 Uhr + 00:30 h:min den Wert 06:70 Uhr heraus bekommst, dann hast Du falsch gerechnet. ;-)

Und eine Geschwindigkeit kann man weder in Stunden noch in Industriestunden umrechnen. Das ist eine zusammegesetzte Einheit aus Zeit und Länge.

Eine Shebang-Zeile ist die erste Zeile in einem Skript die mit den beiden Zeichen # und ! anfängt. Diese Zeichenkombination hat die Bezeichnung Shebang. Danach folgt die Befehlszeile mit der man die Quelltextdatei als Programm ausführen kann. So funktioniert das Ausführen von beliebigen Textdateien als Programme unter Unix, und damit zum Beispiel auch Linux und MacOS. Selbst unter Windows kann das nützlich sein, weil Windows selbst das zwar nicht auswertet, es aber andere Programme gibt die das tun.

Für eine nützliche Ausgabe müsste man übrigens nicht nur die Uhrzeit oder relative Dauer zu Mitternacht vom aktuellen Tag sondern auch die Tage mit einbeziehen. Zumindest wenn es länger als einen Tag dauert oder mindestens eine Tagesgrenze überschreitet.
no_idea
User
Beiträge: 6
Registriert: Freitag 25. Oktober 2013, 16:50

puh, ich glaube, dass ich noch nicht genug Kenntnisse habe, um dieses tolle Programm zu schreiben: :?

@BlackJack
Danke für das Bsp mit dem splitten, aber das ist ja total umständlich. -Ehrlich gesagt, verstehe ich das nicht wirklich.
Vielleicht ist diese Uhrzeitumrechnerei einfach zu kompliziert für einen Anfänger?! :cry:

Ich habe mal eine neue Version geschrieben, aber nach der Eingabe aller Parameter macht das Programm nichts. Also die Sachen sollen ja alle in die Funktion eingesetzt werden und ausgerechnet wie in der Funktion definiert.
Warum tut das Programm nichts? :K

Code: Alles auswählen

print ('Wann kommst Du vom Joggen zurück:')
a = int (input('Gib die Startstunde an:'))
b = int (input('Gib die Startminuten an:'))
c = int (input('gib die Minutenzahl der Geschwindigkeit an:'))
d = int (input('Gib die Sekundenzahl der Geschwindigkeit an:'))
e = float (input('Gib die gelaufenen Kilometer an:'))
def dauer(a, b, c, d, e):    
    start = float (a + b/60)
    zeit = (c/60 + d/3600) * e 
    ankunft = start + zeit
    print ankunftszeit = ankunft/24
Gruß, no_idea
Zuletzt geändert von Anonymous am Dienstag 29. Oktober 2013, 17:48, insgesamt 1-mal geändert.
Grund: Code in Python-Code-Tags gesetzt.
BlackJack

@no_idea: Was ist denn an meinem Beispiel umständlich? Ich habe Dir doch damit nur gezeigt was verschiedene Zahlen in der Slicing-Notation bewirken und wie man selber heraus finden kann welche davon die richtige Variante ist, wenn die Eingabe im Format wie '06:50' ist. Vielleicht „liest” Du das Beispiel falsch: Das hinter ``In […]:`` ist das was ich eingegeben habe und das hinter ``Out […]:`` ist das Ergebnis davon. Die ``In``/``Out`` habe ich nicht eingetippt, das sind die Prompts von der Python-Shell (IPython) die ich verwende.

Die Werte sollen in die Funktion eingesetzt werden? Wo werden sie das denn? Das musst *Du* machen. Funktionen die nur definiert werden, werden dadurch nicht automatisch auch *aufgerufen*. Das wäre furchtbar unpraktisch.

An der Stelle würde ich die Funktion erst einmal weg lassen und den Quelltext linear runterschreiben, wie Du das vorher auch gemacht hast. Wenn das funktioniert, kann man eine Funktion heraus ziehen. Und dann auch eine „echte” Funktion schreiben, also eine die Eingabewerte bekommt, etwas ausrechnet, und das Ergebnis dann zum Aufrufer zurück gibt, damit *der* das dann ausgeben kann.

Die Namen `a` bis `e` sind nicht gut. Namen sollten dem Leser verraten was der Wert, der sich dahinter verbirgt im Kontext des Programms bedeutet. Und diese Buchstaben tun das nicht.

Die Ausgaben bei `c` und `d` machen keinen Sinn. Wie gesagt: Eine Geschwindigkeit setzt sich auch Länge und Zeit zusammen. Eine übliche Angabe für Fortbewegung wäre in Kilometer pro Stunde (km/h). In Basiseinheiten wäre das eigentlich Meter pro Sekunde (m/s), aber unter km/h-Angaben können sich die meisten Leute wahrscheinlich besser etwas vorstellen und wenn Du die Zeiten sowieso schon in Stunden annimmst macht es die Rechnung einfacher.
Antworten