Arbeiten mit hh:mm-Spalten, die Mitternacht durchlaufen, um verstrichene Zeiten zu bestimmen.Ich dachte, das wäre ein einfaches Problem, und hier bin ich, ein paar Stunden später, nicht weiter vorne. Ich habe zwei Spalten in einer sehr großen Tabelle. Einer ist eine Uhrzeit im Format hh:mm. Die andere ist eine Reihe von Messungen. Alle Messungen werden über einen Zeitraum von 24 Stunden (oder etwas weniger) durchgeführt und die Zeit als hh:mm aufgezeichnet. Was ich wirklich brauche, ist eine verstrichene Zeit seit der ersten Messung. Das Problem ist, dass sich alles auf 00:00 Uhr bezieht und die Berechnungen an diesem Punkt völlig verrückt werden, da es nicht weiß, dass es der nächste Tag ist, und der Datensatz viel zu groß ist, als dass ich den Tag manuell hinzufügen könnte. Alle Gedanken werden dankbar geschätzt!
Die andere seltsame Sache, die ich fand, war, dass sich die Datendatei ganz anders verhielt, je nachdem, ob ich die Excel-Datei importierte oder die Excel-Datei als .txt-Datei speicherte und importierte. Letzteres war viel besser.
Betreff: Arbeiten mit hh:mm-Spalten, die Mitternacht durchlaufen, um verstrichene Zeiten zu bestimmen.Kalt
Betreff: Arbeiten mit hh:mm-Spalten, die Mitternacht durchlaufen, um verstrichene Zeiten zu bestimmen.Das ist vielleicht unnötig, aber es hat Spaß gemacht, und ich musste parallel Assign() verwenden.
Names default to here(1);
dt = current data table();
t = dt:Time << Get Values();
n = nitems(t);
diff = t[2::n]-t[1::(n-1)];
day_break = loc(diff<0); // this will give you last row of the day
// make a matrix n x number of day breaks
m = J(n, nitems(day_break), -1);
parallel assign({db = day_break},
// make the item a 1 if it's row is higher than the corresponding row
m[a, b] = a > db[b];
);
m;
// now just sum the matrix
day = VSum(m`); // +1; // if you want the day to start at 1
dt << New Column("Day", ordinal, <<SET values=""></SET>Betreff: Arbeiten mit hh:mm-Spalten, die Mitternacht durchlaufen, um verstrichene Zeiten zu bestimmen.Guter Fang.
Betreff: Arbeiten mit hh:mm-Spalten, die Mitternacht durchlaufen, um verstrichene Zeiten zu bestimmen.@txnelson ,
Ich habe nach einer alternativen Lösung gesucht, weil ich dachte, dass Ihre Funktion in einer großen Tabelle langsam sein könnte.Mein Ansatz besteht darin, dif- und lag-Funktionen zu verwenden, um eine Spalte zu erstellen: cum kumulierte Zeit. Mit anderen Worten, erhalten Sie inkrementelle Zeitänderungen und summieren Sie sie dann.
Ich denke, es gibt einen Fehler in Ihrer Funktion, aber ich bin mir nicht sicher, wo. Ich habe die Tabelle in das Dauerformat konvertiert.

Hier ist die Formel für :div
If( :Time < Lag( :Time, 1 ),
(:Time + 24 * 60 * 60) - Lag( :Time, 1 ),
Dif( :Time, 1 )
)
Hier ist die Formel für :kum
Sum(Lag(:cum, 1), :Diff)
Dies setzt voraus, dass zwischen den Ereignissen weniger als 24 Stunden liegen.
Jim, ich denke, Sie brauchen In Days(dayCounter -1) in Ihrer Formel, da Sie 1 Tag für Ihre Startzeit gezählt haben.
If( Row() == 1,
dayCounter = 0;
startTime = :Time;
newElapsedtime = 0;
,
If( :Time < Lag( :Time ),
dayCounter
++);
If( dayCounter == 0,
newElapsedtime = :Time - startTime,
newElapsedtime = (In Days( 1 ) - startTime) + In Days( dayCounter - 1 ) +
:Time
);
)
Betreff: Arbeiten mit hh:mm-Spalten, die Mitternacht durchlaufen, um verstrichene Zeiten zu bestimmen.Danke noch einmal @txnelson . Sehr geschätzt!
Betreff: Arbeiten mit hh:mm-Spalten, die Mitternacht durchlaufen, um verstrichene Zeiten zu bestimmen.Hier ist das Beste, was ich tun kann, ohne einen genauen Tageswert.Die folgende JSL geht davon aus, dass ein neuer Tag begonnen hat, wenn der vorherige Zeilenwert für die Spalte „Time“ kleiner als der aktuelle Wert der Spalte „Time“ ist.Sie haben in einer früheren Antwort angegeben, dass dies möglicherweise nicht der Fall ist.Aber ohne einen genauen Tageswert ist dies meiner Meinung nach das Beste, was getan werden kann.Ich habe auch Ihre Datentabelle mit der neuen Formelspalte angehängt.Hier ist die vorgeschlagene Formel
If( Row() == 1,
dayCounter = 0;
startTime = :Time;
newElapsedtime = 0;
,
If( :Time < Lag( :Time ),
dayCounter
++);
If( dayCounter == 0,
newElapsedtime = :Time - startTime,
newElapsedtime = (In Days( 1 ) - startTime) + In Days( dayCounter ) + :Time
);
);
newElapsedtime;
Betreff: Arbeiten mit hh:mm-Spalten, die Mitternacht durchlaufen, um verstrichene Zeiten zu bestimmen.Ich habe gerade eine Beispieltabelle erstellt, die das Problem hoffentlich besser zeigt als meine Beschreibung.
Betreff: Arbeiten mit hh:mm-Spalten, die Mitternacht durchlaufen, um verstrichene Zeiten zu bestimmen.@txnelson Vielen Dank.
Die Spalte ist eine fortlaufende numerische JMP-Spalte, die im JMP-Format hh:mm formatiert ist. Ich habe es auch in Zeichen umgewandelt, um zu sehen, ob das geholfen hat (es hat nicht funktioniert).
Ich habe versucht, die Spalte so zu sortieren, dass sie bei zB beginnt. 00:00. Und das funktioniert. Aber leider wird eine Messung um 16:00 Uhr (Tag 1) direkt neben 16:10 Uhr (gemessen an Tag 2) sein.
Ich habe den Lag-Befehl im Formeleditor ausprobiert, der gut aussah, aber sobald Sie die 00:00-Schwelle überschritten haben, wird es irgendwie verrückt. Dann fing ich an, einige Wenn/Dann-Anweisungen in Formeln zu bauen, auf die ich zurückkommen werde, wenn ich dort warm wurde. Aber ich habe nicht daran gedacht, die if/then-Anweisungen zu verwenden, um die Daten irgendwie umzuschalten, wie Sie es vorschlagen. Und da war es 3 Uhr morgens und ich dachte, es wäre Zeit, ins Bett zu gehen.
Vielen Dank für Ihre Gedanken.
Am besten,
Greg
Betreff: Arbeiten mit hh:mm-Spalten, die Mitternacht durchlaufen, um verstrichene Zeiten zu bestimmen.1. Ist die Zeitspalte eine Zeichenspalte oder eine JMP-Zeitspalte?
2. Wäre die Erkennung, dass der Zeitwert der aktuellen Zeilen kleiner als der Wert der vorherigen Zeilen ist, ein Indikator für eine Erhöhung des Datums?