Durchschnitt einer Zeit berechnen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Durchschnitt einer Zeit berechnen

    Servus :)

    Ich möchte die Durchschnittszeit von Zeiten mit dem Format hh:mm:ss:msmsms berechnen.
    Ich habe mehrere Zeiten, die ich aus einer Spalte einer DGV auslese und addiere (habe dazu eine Funktion geschrieben :) )
    Nun möchte ich die Durchschnittszeit von der Summe der Zeiten berechnen. Dafür will ich Summe der Zeiten geteilt durch die Anzahl rechnen.
    Doch das gestaltet sich für mich doch schwieriger als gedacht ;(
    Meine Zeit ist ein String mit bspw. "01:00:01:300" und die Anzahl der Zeiten ist zum Beispiel 3.
    Zunächst will ich den String mit der Split-Funktion in vier Double-Variablen aufteilen.

    VB.NET-Quellcode

    1. Dim part(3) as String
    2. part = sum.Split(":")
    3. Dim h, m, s, ms as Double
    4. h = part(0)
    5. m = part(1)
    6. s = part(2)
    7. ms = part(3)


    Meine Idee zur weiteren Berechnung war zunächst Modulo:

    VB.NET-Quellcode

    1. Dim x as Double
    2. x = part(0) MOD number 'Number ist die Anzahl der Zeiten

    Allerdings erhalte ich für x den Wert 0 ?( Sollte nicht x = 1, also der Rest als Ergebnis rauskommen?

    Meine nächste Idee war einfach mit Division ("/") zu arbeiten. Aber auch hier erhalte ich für x immer nur den Wert 0.
    Habe ich irgendwo einen falschen Datentypen oder habe ich einfach nur einen gewaltigen Denkfehler?

    Ratschläge und Hinweise wären echt super!
    Ein String ist Text - keine Zeit.

    Verwende die vorgesehenen Datentypen - also Date und Timespan.

    Du könntest dann ein MindestDatum fixDate festlegen, wo alle deine Zeiten drüber sein sollten.
    Das subtrahierst du von allen deinen Zeiten - so erhälst du eine List(Of Timespan).
    Von einem Timespan kannst du die Milliseconds abrufen - so erhälst du eine List(Of Integer).
    Davon ist problemlos der Mittelwert zu bilden mediumMilliseconds.
    Zum Schluss dim mediumDate = fixDate.AddMilliseconds(mediumMilliseconds)



    Ups - alles noch einfacher, weil du willst ja keine Durchschnitts-Zeit, sondern eine durchschnitts-Zeitspanne.
    Wie gesagt: Verwende den vorgesehenen Datentyp TimeSpan.
    Wandle den um in Integer, berechne den Mittelwert, und wandel letzteren zurück.

    Zur Anzeige wandle den Timespan mittels ToString-Funktion in einen String:

    VB.NET-Quellcode

    1. dim s = tsMedium.ToString("hh\:mm\:ss\:fff")

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @LizardProgrammer Handelt es sich um Zeitpunkte oder Zeitdauern?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    deutet auf ZeitDauern hin
    Jou.
    Der Mittelwert mehrerer Datümmer ist nicht definiert, denn was wäre (Weihnachten PLUS Ostern) oder gar (Weihnachten PLUS Ostern) / 2 ? :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    LizardProgrammer schrieb:

    Habe aber jetztz eine Lösung gefunden
    Lässt Du uns an Deiner Lösung teilhaben?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Achso ja :) @RodFromGermany

    Ich bin wieder zu meiner Grundidee zurückgekehrt und habe mit Division und Modulo gearbeitet.
    Ich habe meinen String mit der Gesamtzeit in vier Integer für Stunde (h), Minute (m), Sekunde (s) und Millisekunde (ms) aufgeteilt (Mid()).
    Dann bin ich immer so vorgegangen:
    ich habe eine Integer-Division gemacht (Bsp.: div = h / number) gerechnet. Anschließend habe ich den Wert einem Array zugewiesen: average(0) = Cint(Math.Truncate(div)).
    Anschließend habe ich: modulo = h Mod number gerechnet. Modulo mit 60 multlipliziert und mit m addiert. Anschließend wiederhole ich das für m,s und ms.
    @LizardProgrammer Das ist die falsche Herangehensweise.
    Mach Dir mit jeder dieser Informationen je eine TimeSpan-Instanz: msdn.microsoft.com/de-de/libra…m.timespan(v=vs.110).aspx
    Von denen mittelst Du eine der Properties, die mit Total... beginnen, das sind alles Doubles, da musst Du diejenige nehmen, die Dir genehm ist.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    LizardProgrammer schrieb:

    Ich habe mehrere Zeiten, die ich aus einer Spalte einer DGV auslese und addiere
    Ich nehme jetzt einmal an, dass du ein gebundenes DGV verwendest und die Daten in einer Tabelle abgelegt hast...
    Damit kannst du dann ganz leicht die Daten von der GUI trennen!

    VB.NET-Quellcode

    1. 'verschiedene Beispiel-Daten in die Tabelle Zeitraum eintragen
    2. Dim dts As New dtsTimeSpan
    3. dts.Zeitraum.AddZeitraumRow(New TimeSpan(1, 1, 15, 35, 234))
    4. dts.Zeitraum.AddZeitraumRow(New TimeSpan(2, 11, 44, 28, 125))
    5. dts.Zeitraum.AddZeitraumRow(New TimeSpan(3, 23, 36, 49, 987))
    6. '
    7. 'Durchschnitt aller Zeiträume berechnen
    8. Dim avgDauer = TimeSpan.FromTicks(dts.Zeitraum.Average(Function(t) t.Dauer.Ticks)).Duration
    9. Stop
    obiges Beispiel verwendet ein Dataset mit einer Tabelle Zeitraum mit der Spalte Dauer
    Wichtig ist der zugeordnete Datentyp für die Spalte Dauer -> TimeSpan!
    PS:
    Einen Zeitpunkt kannst du mit dem Datentyp DateTime und eine Zeitdauer eben nur mit dem Datentyp Timespan abbilden...
    Daher ändere bitte deinen Threadtitel z.b. in Durchschnitt aller Zeiträume berechnen um, dann ist dein Threadtitel sinngemäß...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()