Zeit-ausrechner

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
ge0matrix
User
Beiträge: 9
Registriert: Sonntag 13. Januar 2008, 16:14

Hallo allesammt!

ich bin neu hier im Forum, wollte aber trotzdem mal mein kleines Programm zeigen und ggf. Verbesserungsvorschlaege einnehmen. Also ohne weitere Verzoegerung, hier mein Code: (Dokumentation auf Englisch)

Code: Alles auswählen

year_start = day_start = day_target = month_target = month_start = year_target = 0
full_year_flag = False
#inputs
while day_start < 1 or day_start > 31:
  day_start = input("insert beginning day ")
while month_start > 12 or month_start < 1:
   month_start = input("insert beginning month ")
while year_start <= 0:
  year_start = input("insert beginning year ")
while day_target < 1 or day_target > 31:
  day_target = input("insert target day ")
while month_target > 12 or month_target < 1:
  month_target = input("insert target month ")
while year_target <= year_start: #backward time count doesn't make sense, obviously. 
                                 #Same year counts won't work with the algorithm.   
   year_target = input("insert target year ") #problem occurs when you try to count
                                              #time less than a year.
#year, month converter algorithm
if month_target > month_start:
  years_distance = year_target - year_start  # +(month_target-month_start)/12.0+(<something with days>), so the 
                                             # years won't round up
  months_distance = 12 * years_distance + month_target - month_start #but then this has to change (would get 
                                                                     #simpler in fact)
elif month_target < month_start:
  years_distance = (year_target - year_start) - 1 
  months_distance = (years_distance * 12) + (12 + (month_target - month_start))  
elif month_target == month_start:
  if day_target > day_start: 
     years_distance = year_target - year_start
  elif day_target < day_start: 
     years_distance = (year_target - year_start) - 1
     if day_target >= day_start:
       months_distance = (12 * years_distance) + 1
     elif day_target < day_start:
       months_distance = 12 * years_distance
  elif day_target == day_start:
     year_distance = year_target - year_start
     months_distance = years_distance * 12
     full_year_flag = True #full_year_flag exists to 1) add more precission in this 
                           #case 2) test purposes 3) convince about the corectness
                          #of the algorithm 
#days converter algorithm (can get the +5 days accuracy with a month list implemented)
if day_target > day_start: 
    days_distance = (months_distance * 30.42) + (day_target - day_start)
elif day_target == day_start: 
    days_distance = months_distance * 30.42
elif day_target < day_start: 
    days_distance = (months_distance * 30.42) + (30.42 + (day_target - day_start))
#because days have greater precission than rounded years or months, I convert
#them backwards to years and months
months_distance_unrounded = days_distance / 30.42
years_distance_unrounded = days_distance / 365.25
#simple secs/hours/mins, can get more accurate, but for it to have any 
#meaning, the day algorithm has to improve 
hours_distance = days_distance * 24
mins_distance = days_distance * 24 * 60
secs_distance = days_distance * 24 * 60 * 60
if full_year_flag: #for testing, put the second print tag inside the 
                         #if-check, insert two dates with same month and 
                         #day and compare the printed results
    print "excactly ",years_distance, "years", years_distance * 12, "in months, ", years_distance * 365.25, "in days, ", years_distance * 365.35 * 24, "in hours, ",years_distance * 365.25 * 24 * 60, "in minutes and ", years_distance * 365.25 * 24 * 3600, " in seconds"   
print "from begining to target date so much time has passed: ",years_distance, "  in years, ", months_distance, "in months, ", days_distance, "in days, ", hours_distance, "in hours, ",mins_distance, "in minutes and ", secs_distance, " in seconds"   
print "Approximations: Years and months obviously rounded. Days, hours, secs and mins: up to 5 days (worst case)" 
print "In unrounded years, this time would be ", years_distance_unrounded, "and in unrounded months ", months_distance_unrounded
Zuletzt geändert von ge0matrix am Montag 14. Januar 2008, 02:36, insgesamt 3-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo ge0matrix, willkommen im Forum,

da ich jetzt gerade keine Zeit habe dein Programm genauer zu untersuchen: in Python gibt es die Konstanten ``True`` und ``False``, guck doch mal wozu man die verwenden kann ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ge0matrix
User
Beiträge: 9
Registriert: Sonntag 13. Januar 2008, 16:14

Leonidas hat geschrieben:Hallo ge0matrix, willkommen im Forum,

da ich jetzt gerade keine Zeit habe dein Programm genauer zu untersuchen: in Python gibt es die Konstanten ``True`` und ``False``, guck doch mal wozu man die verwenden kann ;)
haha danke, das weiss ich schon, habe es aber auch eben bemerkt dass ich true und false als Strings eingesetzt habe. Ich habe den Code ziemlich schnell geschrieben, deshalb erkennt man auch keine python-uebliche OO.

Allerdings geht es mir mehr um den Algorithmus der Zeit erfassung selbst, der ist naemloch ein bisschen "schlampig" aufgeschrieben worden, darum wollte ich mal fragen ob jemand da was besseres gemacht hat.

Noch ein Thema waere diese getlocal time funktion, ich koennte die gut in das Programm integrieren um z.B. schneller die Zeit vom Geburtsdatum oder sonnst einem Datum bis jetzt ausrechnen. Allerdings weiss ich nicht so genau wie man das Datum aus dem Objekt rauskriegt und sie den Variablen zuordnet.

EIn letztes Thema waere die Moeglichkeit, das jeweils gewuenschte Datum in einem String abzugeben, und dann die Daten des Strings den entsprechenden Variablen zuzuweisen, nur weiss ich auch nicht wie das funktionieren koennte. :roll:
ge0matrix
User
Beiträge: 9
Registriert: Sonntag 13. Januar 2008, 16:14

ach ja, 30.44 sind einfach nur die Durchschnittstage jedes Monats (365.25/12=~30.4375 eben)
lunar

PEP 8 existiert.

Was den Algorithmus angeht, dateutil.relativedelta existiert ebenfalls!

Edit: Und man nimmt nicht input zum Einlesen von Konsoleneingaben. Dafür gibt es raw_input!
Zuletzt geändert von lunar am Sonntag 13. Januar 2008, 16:56, insgesamt 2-mal geändert.
BlackJack

Die Zeilen sind deutlich zu lang. Die Namen bestehen hauptsächlich aus Abkürzungen und enthalten Grossbuchstaben. Alles ist auf Modulebene statt in Funktionen.

Last but not least, zum Rechnen mit Daten/Zeiten gibt's das `datetime`-Modul.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Saluttii

ich hab mir den code jetzt nicht so genau angesehen, da ich auch nicht (ohne den Code zu lesen weiss was er tut). Jedoch würde ich mir mal das datetime Modul anschauen
ge0matrix
User
Beiträge: 9
Registriert: Sonntag 13. Januar 2008, 16:14

BlackJack hat geschrieben:Die Zeilen sind deutlich zu lang.
Du meinst die print ausgaben sind zu lang?
Lunar hat geschrieben:Edit: Und man nimmt nicht input zum Einlesen von Konsoleneingaben. Dafür gibt es raw_input!
aber ich wollte ja Zahlen haben, da hab ich mir gedacht gleich input einzugeben um mich nicht mit integer conversions zu beschaeftigen.
lunar

ge0matrix hat geschrieben:
BlackJack hat geschrieben:Die Zeilen sind deutlich zu lang.
Du meinst die print ausgaben sind zu lang?
Nein, er meint, dass man generell keine Code-Zeilen mit mehr als 79 Zeichen verwendet! Bitte, bitte, lies doch mal PEP 8 und versuche mal zumindest einige Dinge daraus umzusetzen (Tipp: Leerzeichen um Operatoren). Lass dich dabei auch nicht von gewissen Autonomen abhalten ;)

ge0matrix hat geschrieben:aber ich wollte ja Zahlen haben, da hab ich mir gedacht gleich input einzugeben um mich nicht mit integer conversions zu beschaeftigen.
input führt die Eingabe als Python-Code aus! Denk mal eine Minute nach, dann erkennst du selbst, warum man das nicht nutzen sollte!
ge0matrix
User
Beiträge: 9
Registriert: Sonntag 13. Januar 2008, 16:14

alles klar, hab's mal ein bisschen aufgePEPt :D

Morgen mach ich mal die EOL auf 79 und tu raw_inputs rein, obwohl ich mein input praktisch finde (solange der user kein mist baut) :D
lunar

ge0matrix hat geschrieben:[...] ich mein input praktisch finde (solange der user kein mist baut) :D
"input" ist nicht praktisch! input garantiert keinesfalls, dass du int zurückerhältst, da der Code interpretiert wird. Es kann durchaus passieren, dass der User einen Wert eingibt, der als gültiger Python-Code gilt, aber keinen int zurückgibt (z.B. wenn der User einen im Namespace existierenden Namen eingibt). Du hast folglich absolut überhaupt gar keine Kontrolle über die Rückgabe von input, was bedeutet, dass du im schlimmsten Fall völlig unsinnige, absolut unverständliche Fehler an irgendwelchen Ecken deines Codes hast.

Bei einer Kombination aus raw_input und int schreibst du nur unwesentlich mehr Code, der allerdings garantiert gut zu debuggen ist.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Tipp: Schreib doch im ersten Post dazu, was genau das Programm macht bzw. welche Aufgabe es hat ("Zeit ausrechnen" ist etwas ungenau). Ist mir bisher nämlich auch unklar.
ge0matrix
User
Beiträge: 9
Registriert: Sonntag 13. Januar 2008, 16:14

Y0Gi hat geschrieben:Tipp: Schreib doch im ersten Post dazu, was genau das Programm macht bzw. welche Aufgabe es hat ("Zeit ausrechnen" ist etwas ungenau). Ist mir bisher nämlich auch unklar.
also was das proggy macht, steht eigenltich ganz am Ende, in der Ausgabe.

Es rechnet einfach aus, wieviel Zeit (in (ungerundeten) Jahren, Monaten, Tagen, Stunden, Minuten und Sekunden und in gerundeten Jahren und Monaten) von einem eingegeben Datum bis zu einem anderen eingegebenen Datum verlaufen ist.

Es gibt eben noch eine kleine Aproximation, die nicht beheben werden kann, ohne ein Kalender einzubauen.
Antworten