Ho una tabella principale con timestamp per il 2021 con risoluzione di un minuto ("Timestamp-1min"). È necessario riempire la tabella principale con i dati della seconda tabella con risoluzione di un giorno ("Inizio-Fine-TS1") in base a una coppia di condizioni per ogni giorno dell'anno (Alba, Tramonto: Inizio e Fine del Crepuscolo) abbinando al tempo stesso giorno, mese e [ora(Hr:min) nelle condizioni].
L'ho fatto per la data 14/06/2021, che si trova nella tabella "Timestamp-1min-Result".
Ho aggiunto una colonna -"S Inizio-S Fine"- che è Alba-Inizio, Alba-Fine nella stessa colonna agli orari corrispondenti per ogni giorno e un'altra colonna per Twilight (Inizio e Fine) allo stesso modo. Voglio anche popolare la durata del giorno, la T media, l'ora del crepuscolo e una colonna di codice (DT/TT) - Ora del giorno/crepuscolo che aiuterà nell'esecuzione delle statistiche con un'altra tabella a cui mi unirò in seguito. Come posso semplicemente utilizzare le formule per popolare l'ora del giorno totale e l'ora del crepuscolo (nella tabella dei risultati) invece di prendere valori dalla seconda tabella. Come posso creare il codice solo per il giorno (come DT) e solo per il crepuscolo (come TT)?
Come farlo in modo interattivo? OPPURE JSL è l'unico modo?
Ecco alcuni suggerimenti:
Nelson,
Sorprendente! Molte grazie!!!
È necessario sapere da dove iniziare per esercitarsi nello scripting. Ci sono esempi di scripting di base che potremmo seguire e fai-da-te?
L'unico modo efficace per fare ciò che desideri è utilizzare un pezzo di JSL.Farlo utilizzando più colonne formula forzerebbe la lettura di mezzo milione di record più volte.La JSL seguente legge la tabella principale solo una volta.
Inoltre, potresti fare tutto questo in un'unica tabella, ma poi dovresti fingere di utilizzare Excel e spostare tutti i dati dalla tabella dei dati di ricerca nella tabella principale e quindi nascondere le colonne.Non sarebbe carino.Ecco lo script che penso dovrebbe aiutarti molto a risolvere il tuo problema.Con mezzo milione di record bastano pochi minuti per eseguire tutti i confronti richiesti.Tieni presente che lo script cerca 2 tabelle di dati con nomi specifici.
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]
);
);