Ich habe eine Haupttabelle mit Zeitstempel für 2021 in einer Minutenauflösung („Timestamp-1min“). Die Haupttabelle muss mit Daten aus der zweiten Tabelle mit einer Tagesauflösung („Start-Ende-TS1“) gefüllt werden, abhängig von einem Paar Bedingungen für jeden Tag in einem Jahr (Sonnenaufgang, Sonnenuntergang: Beginn und Ende der Dämmerung) und gleichzeitiger Übereinstimmung Tag, Monat und [Zeit(Std:Min) in den Bedingungen].
Ich habe es für das Datum 14.06.2021 gemacht, das in der Tabelle „Timestamp-1min-Result“ steht.
Ich habe eine Spalte „S Start-S Ende“ hinzugefügt, die Sonnenaufgang-Start und Sonnenaufgang-Ende in derselben Spalte zu den passenden Zeiten für jeden Tag enthält, und eine weitere Spalte für Dämmerung (Start und Ende). Ich möchte auch die Tageslänge, die mittlere T-Zeit, die Dämmerungszeit und eine Codespalte (DT/TT) – Tages-/Dämmerungszeit – ausfüllen, die bei der Erstellung von Statistiken mit einer anderen Tabelle hilft, der ich später beitreten würde. Wie kann ich einfach Formeln verwenden, um die Gesamttageszeit und die Dämmerungszeit (in der Ergebnistabelle) auszufüllen, anstatt Werte aus der zweiten Tabelle zu übernehmen? Wie kann ich den Code nur für die Tageszeit (als DT) und die Dämmerungszeit (als TT) allein erstellen?
Wie geht das interaktiv? ODER Ist JSL der einzige Weg?
Hier sind ein paar Vorschläge:
Nelson,
Toll! Vielen Dank!!!
Sie müssen wissen, wo Sie mit der Skripterstellung beginnen sollen. Gibt es grundlegende Skriptbeispiele, denen wir folgen und die wir selbst basteln könnten?
Der einzig effiziente Weg, das zu tun, was Sie wollen, ist die Verwendung eines Teils von JSL.Die Verwendung mehrerer Formelspalten würde dazu führen, dass eine halbe Million Datensätze mehrmals gelesen werden müssten.Die folgende JSL liest die Haupttabelle nur einmal durch.
Sie könnten dies auch alles in einer Tabelle tun, müssten dann aber so tun, als würden Sie Excel verwenden, alle Daten aus der Nachschlagedatentabelle in die Haupttabelle verschieben und dann die Spalten ausblenden.Es wäre nicht schön.Hier ist das Skript, das Ihnen meiner Meinung nach einen großen Schritt zur Lösung Ihres Problems bringen sollte.Bei einer halben Million Datensätzen dauert es einige Minuten, alle erforderlichen Vergleiche durchzuführen.Bitte beachten Sie, dass das Skript nach zwei Datentabellen mit bestimmten Namen sucht.
Names Default To Here( 1 );
dtMain = Data Table( "Timestamp-1min" );
dtLookUP = Data Table( "Start-End-TS1" );
// Add the required new colummns
dtMain << New Column( "S Start-S End", format("h:m:s"));
dtMain << New Column( "T Start-T End", format("h:m:s"));
dtMain << New Column( "Day Length", format("h:m:s"));
dtMain << New Column( "Mid T", format("h:m:s"));
dtMain << New Column( "Twilight time", format("h:m:s"));
dtMain << New Column( "DT/TT", character);
// Loop through Main table and set values
DT = "";
dl = twTime = .;
For( i = 1, i <= N Rows( dtMain ), i++,
If( i == 1 | Day( dtMain:Timestamp[i] ) != Day( dtMain:Timestamp[i - 1] ),
theRow = Try(
(dtLookUp << get rows where(
dtLookUp:Month 2 == Month( dtMain:Timestamp[i] ) & dtLookUp:Date == Day( dtMain:Timestamp[i] )
))[1],
.
)
);
// Get the time for the current row
theTime = Date MDY( 12, 31, 1899 ) + 3600 * Hour( dtMain:Timestamp[i] ) + 60 * Minute( dtMain:Timestamp[i] )
+Second( dtMain:Timestamp[i] );
theNextTime = Date MDY( 12, 31, 1899 ) + 3600 * Hour( dtMain:Timestamp[i + 1] ) + 60 *
Minute( dtMain:Timestamp[i + 1] ) + Second( dtMain:Timestamp[i + 1] );
// If this is a Twilight Start, record the time, and set the value for Twilight time
If( dtLookUp:Twilight start[theRow] >= theTime & dtLookUp:TwilightStart[theRow] <= theNextTime,
dtMain:"T Start-T End"n[i] = dtLookUp:Twilight start[theRow];
DT = "TT";
twTime = dtLookUp:Twilight Length[theRow];
);
// If this is Sunrise, recorde the time and set the value for Day Length
If( dtLookUp:Sunrise[theRow] >= theTime & dtLookUp:Sunrise[theRow] <= theNextTime,
dtMain:"S Start-S End"n[i] = dtLookUp:Sunrise[theRow];
DT = "DT";
dl = dtLookUp:Day Length[theRow];
);
// If sunset has ended record the value and blank out the day length time
If( dtLookUp:Sunset[theRow] >= theTime & dtLookUp:Sunset[theRow] <= theNextTime,
dtMain:"S Start-S End"n[i] = dtLookUp:Sunset[theRow];
DT = "TT";
dl = .;
);
// If twighlight has ended record the value and blank out the Twilight time
If( dtLookUp:Twilight End[theRow] >= theTime & dtLookUp:Twilight End[theRow] <= theNextTime,
dtMain:"T Start-T End"n[i] = dtLookUp:Twilight End[theRow];
DT = "";
twTime = .;
);
// If this is the Mid T time, record the value
If( dtLookUp:Mid T[theRow] >= theTime & dtLookUp:Mid T[theRow] <= theNextTime,
dtMain:Mid T[i] = dtLookUp:Mid T[theRow]
);
// Write the repeating values
dtMain:"DT/TT"n[i] = DT;
dtMain:Twilight time[i] = twTime;
dtMain:Day Length[i] = dl;
// Do some cleanup on ending records
If( Is Missing( dtMain:"S Start-S End"n[i] ) == 0 & Is Missing( dtMain:Day Length[i - 1] ) == 0,
dtMain:Day Length[i] = dtMain:Day Length[i - 1]
);
If( Is Missing( dtMain:"T Start-T End"n[i] ) == 0 & Is Missing( dtMain:Twilight time[i - 1] ) == 0,
dtMain:Twilight time[i] = dtMain:Twilight time[i - 1]
);
If( Is Missing( dtMain:Twilight time[i] ) == 0 & dtMain:"DT/TT"n[i] == "",
dtMain:"DT/TT"n[i] = dtMain:"DT/TT"n[i - 1]
);
);