Ich habe zwei Tabellen, die ich durch einen Zeitstempel verbinden möchte, die Zeitstempel werden jedoch nicht genau zur gleichen Zeit aufgezeichnet. Daher möchte ich alle Zeitstempel zusammenführen, die weniger als 5 Minuten voneinander entfernt sind. Wenn der Zeitstempel keinen passenden Zeitstempel in der anderen Tabelle hat, möchte ich die Zeilendaten trotzdem behalten. Gibt es eine einfache Möglichkeit, dies in JSL zu tun?
Sie könnten in jeder Datentabelle eine Formelspalte erstellen, die Ihre Zeitstempelspalte auf die nächsten 5 Minuten rundet, und diese Spalten dann für die Verknüpfung verwenden.Wenn Sie in JMP 14 mit der rechten Maustaste auf die Überschrift Ihrer Zeitstempelspalte klicken und dann „Neue Formelspalte->Transformieren->Runden...“ auswählen, wird ein Dialogfeld angezeigt, in dem Sie die Möglichkeit haben, aufzurunden, abzurunden oder auf den nächsten gewünschten Zeitschritt.Wenn Sie nicht über JMP 14 verfügen, würde die Formel zum Runden auf das nächste 5-Minuten-Intervall etwa so aussehen:
Round( :Timestamp / 300 ) * 300
(Beachten Sie, dass 300 die Anzahl der Sekunden in 5 Minuten ist).
Das Dialogfeld „Tabellen->JMP Query Builder“ (oder „Tabellen->Join“) verfügt über Optionen zum Beibehalten von Nichtübereinstimmungen und zum Erstellen einer Spalte mit Übereinstimmungskennzeichen.
Hoffe das hilft.
Es gibt keine integrierte Plattform, die eine Verknüpfung mit Fuzzy-Matching durchführt, da Sie angegeben haben, was Sie benötigen.Allerdings kann JSL verwendet werden, um das zu bekommen, was Sie brauchen.
Hier ist ein grobes Beispiel für eine Möglichkeit, Ihre Anfrage zu skripten
Names Default To Here( 1 );
// Create sample data tables
dt1 = New Table( "Data Table 1",
Add Rows( 100 ),
New Column( "DateTime",
Numeric,
"Continuous",
Format( "m/d/y h:m", 19 ),
Input Format( "m/d/y h:m" ),
Formula( Today() + Row() * In Minutes( 5 ) ),
Set Selected
)
);
dt1 << run formulas;
dt1:DateTime << delete formula;
dt2 = dt1 << Subset(
Sampling Rate( 0.25 ),
Selected columns only( 0 ),
output table name( "Data Table 2" ),
link to original table( 0 )
);
Current Data Table( dt2 );
For Each Row( :DateTime = :DateTime + In Minutes( Random Uniform( -100, 100 ) ) );
dt2 << sort( by( :DateTime ), order( ascending ), replace table( 1 ) );
// Create a column in data table 1 for reference
dt1 << New Column( "RowNum", formula( Row() ) );
dt1:RowNum << delete formula;
// Create in data table 2 a column that will hold the row to join to
dt2 << New Column( "Match Row" );
// Loop through data table 2 and find the rows in the first table that match
For( i = 1, i <= N Rows( dt2 ), i++,
checkVal = dt2:DateTime[i];
theRows = dt1 << get rows where(
:Datetime > checkVal - In Minutes( 5 ) & :DateTime < checkVal + In Minutes( 5 )
);
If( N Rows( theRows ) > 0,
minList = {};
For( k = 1, k <= N Rows( theRows ), k++,
Insert Into( minList, Abs( dt1:DateTime[theRows[k]] - checkVal ) )
);
dt2:Match Row[i] = theRows[Loc( minList, Min( minList ) )];
,
dt2:Match Row[i] = 0
);
);
// Join the tables
dt3 = dt1 << Join(
With( dt2 ),
Merge Same Name Columns,
By Matching Columns( :RowNum = :Match Row ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 1 ),
Preserve main table order( 1 ),
output table name("Final Table")
);