Lavorare con hh: mm colonne che passano attraverso la mezzanotte per determinare i tempi trascorsi.Pensavo che questo sarebbe stato un problema semplice, ed eccomi qui, poche ore dopo non più avanti. Ho due colonne in una tabella molto grande. Uno è un tempo nel formato hh: mm. L'altro è una serie di misurazioni. Tutte le misurazioni vengono eseguite su un periodo di 24 ore (o leggermente inferiore) e il tempo registrato come hh: mm. Ciò di cui ho veramente bisogno è un tempo trascorso dalla prima misurazione. Il problema è che tutto è riferito a 00:00 e quindi i calcoli vanno tutti in modo strano a quel punto in quanto non sa che è il giorno successivo e il set di dati è troppo grande per me per aggiungere il giorno manualmente. Tutti i pensieri sono apprezzati con gratitudine!
L'altra cosa strana che ho scoperto è che il file di dati si è comportato in modo abbastanza diverso a seconda che avessi importato il file Excel o salvato il file Excel come file .txt e importato. Quest'ultimo era molto meglio.
Ri: Lavorare con hh: mm colonne che passano attraverso la mezzanotte per determinare i tempi trascorsi.1. La colonna dell'ora è una colonna di caratteri o una colonna dell'ora JMP?
2. Il rilevamento del valore temporale delle righe correnti inferiore al valore delle righe precedenti sarebbe un indicatore di un incremento della data?Ri: Lavorare con hh: mm colonne che passano attraverso la mezzanotte per determinare i tempi trascorsi. @txnelson Grazie mille.
La colonna è un JMP numerico continuo formattato in formato JMP hh: mm. L'ho anche convertito in personaggio per vedere se questo ha aiutato (non ha funzionato).
Ho provato a ordinare la colonna in modo che inizi ad es. 00:00. E questo funziona. Ma sfortunatamente una misurazione alle 16:00 (giorno 1) sarà proprio accanto alle 16:10 (presa il giorno 2).
Ho provato il comando Lag nell'editor delle formule che stava bene ma di nuovo non appena hai superato quella soglia delle 00:00 è diventato pazzo. Poi ho iniziato a costruire alcune dichiarazioni if / then in formula a cui tornerò mentre mi stavo riscaldando lì. Ma non ho pensato di usare le istruzioni if / then per attivare o disattivare i dati come suggerisci. E ormai erano le 3 del mattino e ho pensato che fosse ora di andare a letto.
Grazie mille per i tuoi pensieri.
Migliore,
Greg
Ri: Lavorare con hh: mm colonne che passano attraverso la mezzanotte per determinare i tempi trascorsi.Ho appena creato una tabella di esempio che, si spera, mostra il problema meglio della mia descrizione.
Ri: Lavorare con hh: mm colonne che passano attraverso la mezzanotte per determinare i tempi trascorsi.Ecco il meglio che posso fare, senza un esatto valore del giorno. La JSL in basso presuppone che sia iniziato un nuovo giorno se il valore della riga precedente per la colonna Time è inferiore al valore corrente della colonna Time. In una risposta precedente hai indicato che potrebbe non essere così. Ma, senza un esatto valore del giorno, questo è il migliore che penso possa essere fatto. Ho anche allegato la tua tabella di dati con la nuova colonna formula allegata. Ecco la formula proposta
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;
Ri: Lavorare con hh: mm colonne che passano attraverso la mezzanotte per determinare i tempi trascorsi.Grazie ancora @txnelson . Molto apprezzato!
Ri: Lavorare con hh: mm colonne che passano attraverso la mezzanotte per determinare i tempi trascorsi. @txnelson ,
Ho cercato una soluzione alternativa, perché pensavo che la tua funzione in una tabella di grandi dimensioni potesse essere lenta. Il mio approccio è utilizzare le funzioni dif e lag per creare una colonna: cum tempo cumulativo. In altre parole ottenere cambiamenti di tempo incrementali quindi riassumerli.
Penso che ci sia un errore nella tua funzione, ma non sono sicuro di dove. Ho convertito la tabella in formato durata.

Ecco la formula per : DIF
If( :Time < Lag( :Time, 1 ),
(:Time + 24 * 60 * 60) - Lag( :Time, 1 ),
Dif( :Time, 1 )
)
Ecco la formula per : cum
Sum(Lag(:cum, 1), :Diff)
Ciò presuppone che ci siano meno di 24 ore tra gli eventi.
Jim, penso che tu abbia bisogno di In Days (dayCounter -1) nella tua formula, dal momento che hai contato 1 giorno per l'inizio.
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
);
)
Ri: Lavorare con hh: mm colonne che passano attraverso la mezzanotte per determinare i tempi trascorsi.Buona pesca.
Ri: Lavorare con hh: mm colonne che passano attraverso la mezzanotte per determinare i tempi trascorsi.Questo potrebbe non essere necessario, ma è stato divertente e ho dovuto usare parallel assegn ().
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>Ri: Lavorare con hh: mm colonne che passano attraverso la mezzanotte per determinare i tempi trascorsi.freddo