Erstellen eines Skripts, um nur bestimmte Werte für einen bestimmten Datumsbereich auszuwählenIch habe eine Datei ähnlich dieser erhalten

Ich wurde gebeten, eine Formel zu erstellen, die alle Codes abruft, die zwischen dem Start- und Enddatum aufgetreten sind. Ich bin mir nicht sicher, wie ich dies als Formel einrichten soll. Ist dies etwas, das als Skript erstellt werden könnte, um alle Codes abzurufen, die zwischen dem Start- und Enddatum auftreten? Ich habe noch nie zuvor ein Skript erstellt und hoffe, dass mir jemand erklären kann, wie man eines erstellt.
Danke!
Datenexploration und -visualisierungBetreff: Erstellen eines Skripts zum Auswählen nur bestimmter Werte in Bezug auf einen bestimmten DatumsbereichWillkommen in der Community.
Die eigentlichen Anweisungen, die Zeilen innerhalb eines bestimmten Datumsbereichs auswählen und eine neue Datentabelle erstellen, die nur die ausgewählten Zeilen enthält.
// Select the row that have the date range desired
dt << select where( :Start Date >= informat("01/10/2025","m/d/y") &
:End Date <= informat("04/30/2025","m/d/y"));
// Create the new table
dtSubset = dt << subset( selected columns(0), selected rows(1), output table("theSubset"));
Hier ist ein vollständiges Beispiel, das zuerst eine Beispieldatentabelle erstellt und dann die obigen Zeilen ausführt, um die Datentabelle auszuwählen und zu erstellen.
(Hinweis: Das folgende Beispiel wurde im Originalbeitrag irgendwie weggelassen. Danke an @jthi für den Hinweis auf die Auslassung)
Names Default To Here( 1 );
// Create an Example data table
dt = New Table( "Example",
Add Rows( 20 ),
New Column( "Start Date",
Format( "m/d/Y" ),
set each value( Today() + In Days( Random Integer( 1, 100 ) ) )
),
New Column( "End Date",
Format( "m/d/Y" ),
set each value( :Start Date + In Days( Random Integer( 1, 50 ) ) )
)
);
// Select the row that have the date range desired
dt << select where(
:Start Date >= Informat( "01/10/2025", "m/d/y" ) & :End Date <=
Informat( "04/30/2025", "m/d/y" )
);
// Create the new table
dtSubset = dt << subset(
selected columns( 0 ),
selected rows( 1 ),
output table( "theSubset" )
);
Eine weitere interessante, interaktive Möglichkeit zum Erstellen der neuen Tabelle ist die Verwendung eines Datenfilters. Mit dem Datenfilter kann der Benutzer interaktiv Zeilen in der Datentabelle auswählen. Sobald die gewünschten Zeilen ausgewählt sind, kann aus diesen Zeilen eine neue Tabelle erstellt werden.
Dazu: Sobald die Datentabelle angezeigt wird

Gehen Sie zum Pulldown-Menü „Zeilen“ und wählen Sie „Datenfilter“

Wählen Sie im Fenster Datenfilter das Start- und Enddatum aus und klicken Sie auf das +-Zeichen

Die Filter werden dann angezeigt.
Klicken Sie auf die Kontrollkästchen Anzeigen und Einschließen. Geben Sie die Aktion an, die für die Zeilen in der Datentabelle ausgeführt werden soll, wenn die Einstellung für die Filter die Zeilen auswählt.

Nun können die Filter gesetzt werden, um die Auswahl zu treffen. Die blauen Linien können auf die gewünschten Start- und Enddaten gezogen werden, oder die Werte können für jeden Filter direkt in den angezeigten Datumsbereich eingegeben werden.
Bitte beachten Sie, dass die Zeilen in der Datentabelle ausgewählt werden, wenn die Filter geändert werden

Sobald die gewünschten Zeilen ausgewählt sind, kann eine neue Datentabelle erstellt werden, indem Sie die Auswahl Teilmenge anzeigen aus der Aktionsliste des roten Dreiecks des Datenfilters auswählen. Klicken Sie einfach auf das rote Dreieck neben dem Titel des Datenfilters und wählen Sie die Option


Betreff: Erstellen eines Skripts zum Auswählen nur bestimmter Werte in Bezug auf einen bestimmten DatumsbereichKönnten Sie eine Beispieltabelle bereitstellen, um die Erstellung eines Beispiels etwas zu erleichtern?
Ich würde dafür wahrscheinlich keine Formel, sondern ein Skript erstellen. Ich nehme an, Sie möchten alle Code_x-Werte extrahieren, bei denen date_x zwischen Startdatum und Enddatum für jede Zeile liegt. Wo sollen sie aufgezeichnet werden? Was soll mit Duplikaten geschehen? Kann das Datenformat geändert werden (können die Daten gestapelt werden)?
@txnelson, hat die JMP-Community Ihr vollständiges Beispiel gelöscht?
Betreff: Erstellen eines Skripts zum Auswählen nur bestimmter Werte in Bezug auf einen bestimmten DatumsbereichDies ist eine Beispieltabelle. Sie haben Recht, ich muss mir jede Zeile ansehen und die Codes für jedes Datum zwischen dem Start- und Enddatum abrufen. Es spielt keine Rolle, ob es Duplikate gibt. Letztendlich muss ich wissen, ob alle Codes gleich sind oder ob es in jedem Zeitrahmen unterschiedliche Codes gibt. Ich muss für jede Zeile wissen, ob die Codes, die zwischen dem Start- und Enddatum liegen, alle „2“ oder alle „3“ oder eine Kombination der Codes sind.
Ich denke, das muss eine Art Skript sein, da mir keine Formel einfällt, die funktionieren würde. Ich habe keine Erfahrung mit der Erstellung von Skripten, daher wäre ich für jede Hilfe dankbar!!
Betreff: Erstellen eines Skripts zum Auswählen nur bestimmter Werte in Bezug auf einen bestimmten DatumsbereichDies kann höchstwahrscheinlich viel einfacher gemacht werden, wenn Sie Ihren endgültigen Bedarf berücksichtigen, aber da es keine genaue Spezifikation / Ergebnisspalte gibt, habe ich einfach etwas erstellt, von dem ich denke, dass es Ihnen weiterhelfen sollte
Names Default To Here(1);
dt = Open("$DOWNLOADS/example table.jmp");
Try(Column(dt, "Date 1") << Set Name("date_1"));
date_cols = Filter Each({colname}, dt << Get Column Names("String"),
Starts With(colname, "date_");
);
code_cols = Filter Each({colname}, dt << Get Column Names("String"),
Starts With(colname, "code ");
);
dt << New Column("Result", Character, Multiple Response);
For Each Row(dt,
dates = dt[Row(), date_cols];
between_bin = :"Start date"n <= dates <= :"Stop date"n;
between_idx = Loc(between_bin);
If(N Items(between_idx) > 0,
codes = dt[Row(), code_cols[between_idx]];
valid = Loc(codes);
If(N Items(valid) == 0,
codes = {};
,
codes = As List(codes[valid`]);
);
,
codes = {};
);
res = Transform Each({code}, codes,
Char(code);
);
:Result = Concat Items(res, ", ");
);

Betreff: Erstellen eines Skripts zum Auswählen nur bestimmter Werte in Bezug auf einen bestimmten DatumsbereichJarmos Code ist spektakulär. Ich sehe gern, wie er Probleme angeht und löst. Aber die meiste Zeit meines Lebens hielten mich meine Kollegen, Freunde, mein Ehepartner und meine Kinder für einen Menschen mit seltsamen Denkweisen. An guten Tagen nannte man mich einen „Nerd“.
Angesichts meiner Lebenssituation habe ich festgestellt, dass die meisten Menschen nicht so denken wie ich.
@PruningTheSpark sagt
„ Ich glaube, das muss eine Art Skript sein, da mir keine Formel einfällt, die funktionieren würde. Ich habe keine Erfahrung mit der Erstellung von Skripten, daher wäre ich für jede Hilfe dankbar!! “.
Ich glaube, dass die Mehrheit der JMP-Benutzer PruningTheSparks Meinung nahesteht. PruningTheSpark glaubt vielleicht nicht, dass es eine Lösung ohne Skripting für das Problem gibt, aber die interaktiven Möglichkeiten von JMP zur Bearbeitung der eigenen Daten sind wirklich leistungsstark. Daher habe ich unten die interaktiven Schritte zusammengestellt, die zur Lösung des PruningTheSparks-Problems erforderlich sind.
Ich habe mit der bereitgestellten Beispieldatentabelle begonnen und sie leicht modifiziert. Die Ergebnisse von Jamos Skript zeigen, dass keine der Zeilen mehr als einen gültigen Code hat. Da mehr als ein Code möglich ist, habe ich in Zeile 2 Code hinzugefügt, der anzeigt, dass Zeile 2 mehrere Codes hat.

Die erste Aufgabe besteht darin, alle Codes zu finden, die zwischen Startdatum und Enddatum liegen. Da es 6 verschiedene Codespalten gibt, ist es am einfachsten, die Daten zu stapeln, um dies alles auf einmal zu erledigen.
Tabellen=>Stapel

Es handelt sich um einen Mehrfachserienstapel, der das Datum und die Codespalten absteckt
Jetzt kann ich alle Codes mit fehlenden Werten entfernen, da diese nicht in den Ergebnissen auftauchen. Ich habe also eine Zelle mit einem fehlenden Wert in der Spalte Daten 2 ausgewählt, die alle Codes enthält, und dann mit der rechten Maustaste geklickt und „Zugehörige Zellen auswählen“ gewählt.

Dadurch werden alle Zeilen ausgewählt, die fehlende Werte für die Spalte „Daten 2“ aufweisen.
Klicken Sie mit der rechten Maustaste in die Spalte „RowState“ und wählen Sie „Zeilen löschen“

und Sie haben nur noch die Zeilen mit Codes übrig

Jetzt muss ich feststellen, welche dieser Codes zwischen dem Startdatum und dem Enddatum liegen. Dazu erstelle ich einfach eine neue Spalte, die ich "dazwischen" nenne und die folgende Formel hat:

die eine 1 für Zeilen hat, bei denen die Spalte Daten (sie enthält das Datum aus der Originaltabelle) eine 1 hat, wenn sie im Bereich liegt, und eine 0, wenn sie außerhalb des Bereichs liegt

Mit der gleichen Technik wie beim Löschen der Codes mit fehlendem Wert können die Zeilen mit Nullen ausgewählt und gelöscht werden.

Um die Tabelle aufzuräumen, können einige der nicht mehr benötigten Spalten gelöscht werden

Nun gilt es, die Codes wieder in einzelne Zeilen zu bringen. Dazu genügt ein einfacher Split
Tabellen=>Teilen


Um nun die Codespalten in einer Spalte zu kombinieren, kann ein Spaltendienstprogramm namens „Spalten kombinieren“ verwendet werden. Wählen Sie einfach die Spalten aus, die kombiniert werden sollen, und dann
Spalten=>Hilfsprogramm=>Spalten kombinieren

Daraufhin wird ein Eingabefeld angezeigt, in das Sie den Namen der neuen Spalte eingeben und das Trennzeichen zwischen den Elementen angeben können (in diesem Fall ein ",").

Dies führt dazu, dass die Tabelle eine neue Spalte hat

Das Bereinigen der Tabelle durch Löschen der nicht mehr benötigten Spalten ergibt

Jetzt müssen die Ergebnisse nur noch in die ursprüngliche Datentabelle zurück übertragen werden. Dazu eignet sich die Update-Plattform. Klicken Sie auf die ursprüngliche Tabelle und
Tabellen=>Aktualisieren

Füllen Sie die Tabelle aus, aus der das Update abgerufen werden soll, und wählen Sie aus, dass die Datensatz-ID der Originaltabelle mit der Datensatz-ID aus der geteilten Tabelle abgeglichen werden soll. Klicken Sie dann auf OK. Die Originaltabelle enthält dann die Lösung.

Es wurde kein Skript verwendet, es waren lediglich 2 einfache Formelspalten erforderlich.
Während man diese Schritte durchläuft, fügt JMP in das Protokoll das JSL ein, das zum Erstellen der ausgeführten interaktiven Schritte erforderlich ist. Man kann diese JSL-Teile also einfach in ein Skript kopieren und hat am Ende ein Skript, das bei Ausführung im Handumdrehen die Lösung bereitstellt.
names default to here(1);
dt = data table( "Example Table" );
// Stack data table
// → Data Table( "Stacked" )
dtStacked = Data Table( "example table" ) << Stack(
columns(
:date_1, :code 1, :date_2, :code 2, :date_3, :code 3, :date_4, :code 4,
:date_5, :code 5, :date_6, :code 6
),
Number of Series( 2 ),
Output Table( "Stacked" )
);
wait(0);
// Delete selected rows
Data Table( "Stacked" ) << Select Where( Is Missing( :Data 2 ) ) << Delete Rows;
// Delete columns
Data Table( "Stacked" ) << Delete Columns( :Label, :Label 2 );
// New column: is between
Data Table( "Stacked" ) << New Column( "is between",
Numeric,
"Continuous",
Format( "Best", 12 )
);
// Change column formula: is between
Data Table( "Stacked" ):is between << Set Formula(
:Data >= :Start date & :Data <= :Stop date
);
// Delete selected rows
Data Table( "Stacked" ) << Select Where( :is between == 0 ) << delete rows;
// Delete column: is between
Data Table( "Stacked" ) << Delete Columns( :is between );
// Delete columns
Data Table( "Stacked" ) << Delete Columns( :Stop date, :Start date, :Data );
// Split data table
// → Data Table( "Split" )
Data Table( "Stacked" ) << Split(
Split By( :Data 2 ),
Split( :Data 2 ),
Group( :record_id ),
Output Table( "Split" ),
Sort by Column Property
);
// Combine columns
Data Table( "Split" ) << Combine Columns(
columns( :"1"n, :"2"n, :"3"n ),
Column Name( "Result" ),
Delimiter( "," )
);
// Delete columns
Data Table( "Split" ) << Delete Columns( :"1"n, :"2"n, :"3"n );
// Update data table
Data Table( "example table" ) << Update(
With( Data Table( "Split" ) ),
Match Columns( :record_id = :record_id )
);
Man kann auch einen neuen Workflow öffnen, den Rekorder einschalten und die Schritte durchgehen. Am Ende erhält man einen Workflow, der in Zukunft zum Erstellen der Lösung verwendet werden kann.

Betreff: Erstellen eines Skripts zum Auswählen nur bestimmter Werte in Bezug auf einen bestimmten DatumsbereichVielen Dank für Ihre Hilfe!
Betreff: Erstellen eines Skripts zum Auswählen nur bestimmter Werte in Bezug auf einen bestimmten DatumsbereichVielen Dank für die Hilfe! Die Screenshots sind sehr hilfreich!