Ciao a tutti,
Ho una tabella di dati che consiste di voci datate in cui la voce più recente è nella parte superiore della tabella e la voce più vecchia è nella parte inferiore.
Quello che sto cercando di fare è scorrere le righe per trovare la differenza di data tra due righe. Ho fatto questo con il seguente codice, preso da un post che @txnelson risposto qualche tempo fa (scusa non ho l'OP di fronte a me).
dt = Data Table( "My Data" );
For( i=N Rows(dt), i >= 2, i--,
:ct[i] = Abs(DateDifference(:date[i-1], :date[i], "Day"));
);
Funziona alla grande, e posso trovare tutte le differenze di date di interesse.
Tuttavia, quello che voglio veramente fare è etichettare gli intervalli di date con lettere dell'alfabeto (A, B, C, D, ecc.).
Ad esempio, se la mia prima voce (ultima riga nella tabella dati) inizia il 01/01/2017 (gg / mm / aaaa), voglio etichettare quella riga "A" e voglio continuare ad etichettare le righe che salgono sulla colonna fino a raggiungere un punto in cui la differenza di date è> = n (in questo caso n = 2, ma potrebbe essere qualsiasi numero maggiore di 1).
Tieni presente che le date stanno aumentando mentre lavoriamo dal fondo del tavolo. Quindi, la riga successiva sopra sarebbe 02/01/2017. Diciamo che questo va avanti fino alla fine di gennaio, quindi ci sono 31 righe che vanno dal 01/01/2017 al 31/01/2017.
Alla riga successiva al 31/01/2017, abbiamo il 05/02/2017. Quindi la differenza di data è 5. Mi piacerebbe quindi che il mio inseguitore di etichette inizi ad etichettarlo come "B" fino alla successiva modifica della data in cui la differenza è> = 2 e quindi inizia l'etichettatura come "C", e così via fino al termine della tabella dei dati.
Qualcosa di simile a questo è stato pubblicato da @txnelson in questa discussione: https://community.jmp.com/t5/Discussions/Labeling-rows-as-greater-less-than-a-date-with-JSL/td-p/36376 , ma richiede una data di inizio specificata per confrontare altre date a. Non desidero avere una data di inizio specificata, ma preferisco che sia eseguita automaticamente in base alle date che hanno popolato la tabella.
Qualsiasi suggerimento / supporto è molto apprezzato.
Grazie!
@txnelson Grazie mille per il tuo codice. L'ho seguito molto chiaramente, era ben documentato e aveva un senso. Provalo sulla tabella di dati campione che hai creato e ha funzionato alla grande.
Ho dovuto modificarlo leggermente per il mio formato di dati specifico in quanto è una grande tabella di dati che è concatenata e talvolta l'intervallo di date va indietro così la differenza di data è molto grande (> 100 giorni). Tuttavia, è stato facile modificarlo in quanto i tuoi commenti hanno aiutato molto.
In realtà stavo iniziando a fare qualcosa di molto simile a ciò che la tua soluzione è, ma ci sono arrivato molto più lentamente di te! Penso che sia il motivo per cui la logica del tuo codice è stata molto sensata.
Apprezzo molto l'aiuto, grazie!
Ecco uno script che dovrebbe fare ciò che vuoi ...... assicurati di studiarlo in modo da capire come funziona la diversa funzione e come funziona la logica del codice. In altre parole, non limitarti a tagliarlo e incollarlo senza comprenderlo.
Names Default To Here( 1 );
// Create a sample data table
dt = New Table( "Example",
Add Rows( 100 ),
New Column( "Date",
Numeric,
"Continuous",
Format( "ddMonyyyy", 12 ),
Input Format( "ddMonyyyy" ),
Set Values(
[3640106008.56964, 3639892909.24216, 3639816069.76636, 3639711971.2654,
3639614050.02423, 3639594631.39805, 3639581856.84272, 3639499697.65438,
3639405448.76553, 3639293346.42584, 3639022373.8664, 3638682552.62729,
3638662956.28802, 3638644514.74731, 3638510978.46425, 3638508355.329,
3638447240.64829, 3638280760.96257, 3638253465.01226, 3638182573.0004,
3638135159.78165, 3638031154.80142, 3638019646.52908, 3637888422.23898,
3637821622.60523, 3637761224.6898, 3637708154.53698, 3637655683.55496,
3637523013.28917, 3637336766.86203, 3637273948.44657, 3637146868.92602,
3637139130.85435, 3637041997.93449, 3636718392.96078, 3636702006.57404,
3636684337.39444, 3636645617.3044, 3636621923.04457, 3636576772.74921,
3636548097.39841, 3636524282.13857, 3636202501.07711, 3636082870.01646,
3636015305.10949, 3635986264.04419, 3635954006.90437, 3635864908.69012,
3635855262.80858, 3635593939.60592, 3635374128.02522, 3635336114.35042,
3635271204.82971, 3635136811.26229, 3635062537.71875, 3635022035.10663,
3634999736.12185, 3634972464.2373, 3634849211.45924, 3634794399.03536,
3634785984.37775, 3634667869.53241, 3634645627.14123, 3634606120.34103,
3634483420.7033, 3634469476.65781, 3634457506.03348, 3634300180.05399,
3634161262.31866, 3634024215.74686, 3633993153.4734, 3633957176.13649,
3633780205.72602, 3633775930.38711, 3633762315.48745, 3633671471.68225,
3633623618.86685, 3633564003.73824, 3633498484.02555, 3633488261.49554,
3633127296.72145, 3633091315.52892, 3632836504.4496, 3632759089.11,
3632695080.2713, 3632564084.614, 3632496376.27829, 3632409035.04661,
3632213416.86148, 3632155851.6491, 3632136908.29403, 3632061846.54667,
3632011684.6858, 3631978413.53537, 3631925136.87974, 3631865971.06053,
3631774901.06017, 3631755982.44004, 3631706805.99126, 3631667141.16235]
),
Set Display Width( 68 )
)
);
// Create the new column
dt<<NEW column="">= 1, i--,
If( i == N Rows( dt ),
// Last row in the table gets the letter "A"
dt:Label[i] = alphaList[letter],
// Otherwise
// If the date on this row is >= the date on the last row,
// change the letter number
If( Abs( Date Difference( :date[i + 1], :date[i], "Day" ) ) >= 2,
letter = letter + 1
);
// Since there could be more than 26 groups, groups AA, BB etc.
// may have to be added, so calculate the number of letters
howmanyLetters = Floor( Letter / 26 ) + 1;
// Now calculate which letter to use
whichLetter = Modulo( letter, 26 );
If( whichLetter == 0,
whichLetter = 26
);
// Create the new value for the column Label
For( k = 1, k <= howmanyLetters, k++,
dt:Label[i] = dt:Label[i] || alphaList[whichLetter]
);
)
);</NEW>