Trabajando con columnas hh: mm que pasan hasta la medianoche para determinar los tiempos transcurridos.Pensé que iba a ser un problema sencillo, y aquí estoy, unas horas más tarde, no más adelante. Tengo dos columnas en una tabla muy grande. Uno es un tiempo en formato hh: mm. El otro es una serie de medidas. Todas las mediciones se toman durante un período de 24 horas (o un poco menos) y el tiempo se registra como hh: mm. Lo que realmente necesito es un tiempo transcurrido desde la primera medición. El problema es que todo está referenciado a 00:00 y, por lo tanto, los cálculos se vuelven extravagantes en ese punto, ya que no sabe que es el día siguiente y el conjunto de datos es demasiado grande para que pueda agregar el día manualmente. ¡Todos y cada uno de los pensamientos son agradecidos!
La otra cosa extraña que encontré fue que el archivo de datos se comportó de manera bastante diferente dependiendo de si importé el archivo de Excel o si guardé el archivo de Excel como un archivo .txt y lo importé. Este último fue mucho mejor.
Re: Trabajando con columnas hh: mm que pasan hasta la medianoche para determinar los tiempos transcurridos.1) ¿Es la columna de tiempo una columna de caracteres o una columna de tiempo JMP?
2) ¿La detección del valor de tiempo de las filas actuales siendo menor que el valor de las filas anteriores sería un indicador de un incremento en la fecha?Re: Trabajando con columnas hh: mm que pasan hasta la medianoche para determinar los tiempos transcurridos. @txnelson Muchas gracias.
La columna es un continuo numérico JMP formateado en formato JMP hh: mm. También lo convertí en personaje para ver si eso ayudó (no lo hizo).
Intenté ordenar la columna de modo que comience en, por ejemplo. 00:00. Y eso funciona. Pero desafortunadamente una medición a las 16:00 (día 1) estará justo al lado de las 16:10 (tomada el día 2).
Intenté el comando Lag en el editor de fórmulas, que se veía bien, pero nuevamente, tan pronto como cruzaste ese umbral de 00:00, se volvió un poco loco. Luego comencé a construir algunas declaraciones if / then en la fórmula a las que volveré cuando me estaba calentando allí. Pero no pensé en usar las declaraciones if / then para alternar los datos de alguna manera como sugieres. Y para entonces eran las 3 de la mañana y pensé que era hora de irse a la cama.
Muchas gracias por tus pensamientos.
Mejor,
Greg
Re: Trabajando con columnas hh: mm que pasan hasta la medianoche para determinar los tiempos transcurridos.Acabo de hacer una tabla de muestra que, con suerte, muestra el problema mejor que mi descripción.
Re: Trabajando con columnas hh: mm que pasan hasta la medianoche para determinar los tiempos transcurridos.Aquí es lo mejor que puedo hacer, sin un valor de día exacto. El JSL a continuación supone que un nuevo día ha comenzado si el valor de la fila anterior para la columna Hora es menor que el valor actual de la columna Hora. Usted indicó en una respuesta anterior que este puede no ser el caso. Pero, sin un valor de día exacto, esto es lo mejor que creo que se puede hacer. También adjunté su tabla de datos con la nueva columna de fórmula adjunta. Aquí está la fórmula propuesta.
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;
Re: Trabajando con columnas hh: mm que pasan hasta la medianoche para determinar los tiempos transcurridos.Gracias de nuevo @txnelson . ¡Muy apreciado!
Re: Trabajando con columnas hh: mm que pasan hasta la medianoche para determinar los tiempos transcurridos. @txnelson ,
Busqué una solución alternativa, porque pensé que su función en una tabla grande podría ser lenta. Mi enfoque es usar las funciones dif y lag para crear una columna: semen tiempo acumulado En otras palabras, obtenga cambios de tiempo incrementales y luego resúmalos.
Creo que hay un error en su función, pero no estoy seguro de dónde. Convertí la tabla al formato de duración.

Aquí está la fórmula para : dif
If( :Time < Lag( :Time, 1 ),
(:Time + 24 * 60 * 60) - Lag( :Time, 1 ),
Dif( :Time, 1 )
)
Aquí está la fórmula para :semen
Sum(Lag(:cum, 1), :Diff)
Esto supone que hay menos de 24 horas entre eventos.
Jim, creo que necesitas In Days (dayCounter -1) en tu fórmula, ya que contabas 1 día para tu hora de inicio.
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
);
)
Re: Trabajando con columnas hh: mm que pasan hasta la medianoche para determinar los tiempos transcurridos.Buena atrapada.
Re: Trabajando con columnas hh: mm que pasan hasta la medianoche para determinar los tiempos transcurridos.Esto puede ser innecesario, pero fue divertido y pude usar la asignación paralela ().
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>Re: Trabajando con columnas hh: mm que pasan hasta la medianoche para determinar los tiempos transcurridos.frio