Tengo una tabla principal con marca de tiempo para 2021 con una resolución de un minuto ("Timestamp-1min"). Necesita llenar la tabla principal con datos de la segunda tabla con resolución de un día ("Inicio-Fin-TS1") dependiendo de un par de condiciones para cada día en un año (Amanecer, Atardecer: Crepúsculo Inicio y Fin) mientras hace coincidir el día, mes y [hora (Hr:min) en las condiciones].
Lo hice para la fecha 14/06/2021, que se encuentra en la tabla "Timestamp-1min-Result".
Agregué una columna, "S Start-S End", que es Sunrise-Start, Sunrise-End y otra columna para Twilight (Start and End). También quiero completar la Duración del día, Mid T, Hora del crepúsculo y un código. columna (DT/TT) - Hora del día/ Crepúsculo que ayudará a realizar estadísticas con otra tabla a la que me uniría más tarde. ¿Cómo puedo usar fórmulas para completar el tiempo total del día y el tiempo del crepúsculo (en la tabla de resultados) en lugar de tomar valores de la segunda tabla? ¿Cómo puedo crear el código solo para el día (como DT) y el crepúsculo (como TT) solo?
¿Cómo hacerlo de forma interactiva? O ¿JSL es la única forma?
La única forma eficiente de hacer lo que quieres es usar una pieza de JSL.Hacerlo usando múltiples columnas de fórmula forzaría la lectura a través de medio millón de registros varias veces.El JSL a continuación lee la tabla principal solo una vez.
Además, podría hacer todo esto en una tabla, pero luego tendría que fingir que está usando Excel y mover todos los datos de la tabla de datos de búsqueda a la tabla principal y luego ocultar las columnas.No sería bonito.Aquí está el script que creo que debería ayudarlo a resolver su problema.Con medio millón de registros, lleva unos minutos hacer todas las comparaciones requeridas.Tenga en cuenta que el script busca 2 tablas de datos con nombres específicos.
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]
);
);
nelson,
¡Increíble! ¡¡¡Muchas gracias!!!
Necesita saber por dónde empezar a practicar scripting. ¿Hay ejemplos básicos de secuencias de comandos que podríamos seguir y hacerlo tú mismo?