J'ai une table principale avec horodatage pour 2021 avec une résolution d'une minute ("Timestamp-1min"). Besoin de remplir le tableau principal avec les données du deuxième tableau avec une résolution d'un jour ("Start-End-TS1") en fonction d'une paire de conditions pour chaque jour de l'année (lever du soleil, coucher du soleil : début et fin du crépuscule) tout en faisant correspondre les jour, mois et [heure (Hr: min) dans les conditions].
Je l'ai fait pour la date du 14/06/2021 - qui se trouve dans le tableau "Timestamp-1min-Result".
J'ai ajouté une colonne - "S Start-S End" - qui est Sunrise-Start, Sunrise-End dans la même colonne aux heures correspondantes pour chaque jour et une autre colonne pour Twilight (Début et Fin) également. Je souhaite également renseigner la durée du jour, le milieu T, l'heure du crépuscule et une colonne de code (DT/TT) - Heure de jour/crépuscule, ce qui aidera à effectuer des statistiques avec une autre table que je rejoindrais plus tard. Comment puis-je simplement utiliser des formules pour renseigner l'heure totale de la journée et l'heure du crépuscule (dans le tableau des résultats) au lieu de prendre les valeurs du deuxième tableau. Comment puis-je créer le code pour l'heure de jour uniquement (en tant que DT) et l'heure de crépuscule (en tant que TT) uniquement ?
Comment le faire de manière interactive ? OU JSL est-il le seul moyen ?
Voici quelques suggestions:
Nelson,
Incroyable! Merci beaucoup!!!
Besoin de savoir par où commencer pour pratiquer le script. Existe-t-il des exemples de scripts de base que nous pourrions suivre et bricoler ?
Le seul moyen efficace de faire ce que vous voulez est d’utiliser un morceau de JSL.Le faire en utilisant plusieurs colonnes de formule forcerait la lecture d'un demi-million d'enregistrements plusieurs fois.Le JSL ci-dessous ne lit la table principale qu'une seule fois.
En outre, vous pouvez tout faire dans un seul tableau, mais vous devrez alors faire semblant d'utiliser Excel et déplacer toutes les données de la table de données de recherche vers la table principale, puis masquer les colonnes.Ce ne serait pas joli.Voici le script qui, je pense, devrait vous aider à résoudre votre problème.Avec un demi-million d’enregistrements, il faut quelques minutes pour effectuer toutes les comparaisons requises.Attention, le script recherche 2 tables de données avec des noms spécifiques.
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]
);
);