Hallo alle,
Ich habe eine Datentabelle, die aus datierten Einträgen besteht, wobei der neueste Eintrag oben in der Tabelle und der älteste Eintrag unten steht.
Ich versuche, die Zeilen zu durchlaufen, um den Datumsunterschied zwischen zwei Zeilen zu finden. Ich habe dies mit dem folgenden Code getan, habe es von einem Beitrag bekommen @txnelson vor einiger Zeit beantwortet (leider habe ich das OP nicht vor mir).
dt = Data Table( "My Data" );
For( i=N Rows(dt), i >= 2, i--,
:ct[i] = Abs(DateDifference(:date[i-1], :date[i], "Day"));
);
Das funktioniert großartig, und ich kann alle interessanten Datumsunterschiede finden.
Was ich jedoch wirklich tun möchte, ist, Datumsbereiche mit Buchstaben (A, B, C, D usw.) zu kennzeichnen.
Wenn mein erster Eintrag (letzte Zeile in der Datentabelle) beispielsweise am 01.01.2017 (TT/MM/JJJJ) beginnt, möchte ich diese Zeile mit „A“ beschriften und die Zeilen weiter beschriften, die in der Spalte nach oben gehen bis es einen Punkt erreicht, an dem die Differenz der Daten >=n ist (in diesem Fall n=2, könnte aber jede Zahl größer als 1 sein).
Denken Sie daran, dass die Daten zunehmen, wenn wir vom Ende der Tabelle nach oben arbeiten. Die nächste Zeile darüber wäre also der 01.02.2017. Nehmen wir an, das geht bis Ende Januar, also gibt es 31 Zeilen vom 01.01.2017 bis zum 31.01.2017.
In der nächsten Zeile über dem 31.01.2017 haben wir den 05.02.2017. Die Datumsdifferenz beträgt also 5. Ich möchte dann, dass mein Label-Tracker bis zum nächsten Datumswechsel, bei dem die Differenz> = 2 ist, mit der Beschriftung als "B" beginnt und dann mit der Beschriftung als "C" beginnt, und so weiter, bis die Datentabelle fertig ist.
Etwas Ähnliches wurde auch von gepostet @txnelson in diesem Thread: https://community.jmp.com/t5/Discussions/Labeling-rows-as-greater-less-than-a-date-with-JSL/td-p/36376 , aber es erfordert ein bestimmtes Startdatum, um andere Daten zu vergleichen. Ich möchte kein bestimmtes Startdatum haben, sondern es automatisch basierend auf den Daten ausführen lassen, die die Tabelle ausgefüllt haben.
Irgendwelche Vorschläge/Unterstützung wird sehr geschätzt.
Vielen Dank!
@txnelson Vielen Dank für Ihren Code. Ich habe es sehr genau befolgt, es war gut dokumentiert und machte Sinn. Ich habe es an der von Ihnen erstellten Beispieldatentabelle getestet und es hat großartig funktioniert.
Ich musste es für mein spezifisches Datenformat leicht ändern, da es sich um eine große Datentabelle handelt, die verkettet ist, und manchmal wird der Datumsbereich zurückgesetzt, sodass der Datumsunterschied sehr groß ist (> 100 Tage). Trotzdem war es einfach zu ändern, da Ihre Kommentare sehr geholfen haben.
Ich fing eigentlich an, etwas sehr Ähnliches wie Ihre Lösung zu tun, kam aber viel langsamer dorthin als Sie! Ich denke, deshalb machte die Logik Ihres Codes so viel Sinn.
Ich weiß die Hilfe sehr zu schätzen, danke!
Hier ist ein Skript, das tun sollte, was Sie wollen. Stellen Sie sicher, dass Sie es studieren, damit Sie verstehen, wie die verschiedenen Funktionen funktionieren und wie die Logik des Codes funktioniert.Mit anderen Worten, schneiden Sie es nicht einfach aus und fügen Sie es ein, ohne es zu verstehen.
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>