0 / 0
Volver a la versión inglesa de la documentación
Sistema de referencia de tiempo
Última actualización: 07 oct 2024
Sistema de referencia de tiempo

El sistema de referencia de tiempo (TRS) es un sistema local, regional o global utilizado para identificar la hora.

Un sistema de referencia de tiempo define una proyección específica para una correlación avanzada e inversa entre una indicación de fecha y hora y su representación numérica. Un ejemplo común con el que la mayoría de los usuarios están familiarizados es la hora UTC, que correlaciona una indicación de fecha y hora, por ejemplo, (1 de enero de 2019, 12 de la medianoche (GMT) con un valor entero de 64 bits (1546300800000), que captura el número de milisegundos que han transcurrido desde el 1 de enero de 1970, 12 de la medianoche (GMT). En general, el valor de indicación de fecha y hora es más adecuado para su lectura por parte de personas, mientras que la representación numérica es más adecuada para el proceso de máquina.

En la biblioteca de series temporales, una serie temporal se puede asociar a un TRS. Un TRS consta de:

  • Marca de tiempo que captura la granularidad del tiempo, por ejemplo, 1 minuto
  • Hora de fecha con zona que captura una hora de inicio, por ejemplo 1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT). Una indicación de fecha y hora se correlaciona con una representación numérica, calculando el número de marcas de tiempo transcurridas desde la hora de inicio. Una representación numérica se escala por la granularidad y se desplaza por la hora de inicio cuando se correlaciona de nuevo con una indicación de fecha y hora.

Tenga en cuenta que esta proyección avanzada + inversa puede generar la pérdida de tiempo. Por ejemplo, si la granularidad de tiempo real de una serie temporal es en segundos, el reenvío y la correlación inversa de las indicaciones de fecha y hora 09:00:01 y 09:00:02 (para leer como hh:mm:ss) con una granularidad de un minuto daría como resultado las indicaciones de fecha y hora 09:00:00 y 09:00:00 respectivamente. En este ejemplo, una serie temporal, cuya granularidad es en segundos, se correlaciona en minutos y, por lo tanto, la correlación inversa pierde información. No obstante, si la granularidad correlacionada es superior a la granularidad de la serie temporal de entrada (más específicamente, si la granularidad de la serie temporal es un múltiplo integral de la granularidad correlacionada), se garantiza que la proyección avanzada + inversa no tendrá pérdidas. Por ejemplo, la correlación a segundos de una serie temporal cuya granularidad es en minutos, y la proyección inversa en minutos de esta, darían como resultado la reconstrucción de las indicaciones de fecha y hora sin ninguna pérdida.

Configuración de TRS

Cuando se crea una serie temporal, esta se asocia a un TRS (o a Ninguno si no se especifica TRS). Si el valor de TRS es Ninguno, los valores numéricos no se pueden correlacionar con las indicaciones de fecha y hora. Tenga en cuenta que TRS solo se puede establecer en una serie temporal durante la creación. Esto es debido a que una serie temporal se ha diseñado como un objeto inmutable. La inmutabilidad resulta útil cuando se utiliza la biblioteca en entornos de varias hebras o en entornos de sistemas distribuidos, como Apache Spark. Aunque un TRS sólo se puede establecer durante el proceso de creación, se puede cambiar utilizando el método with_trs como se describe en la sección siguiente. with_trs genera una nueva serie temporal y, por lo tanto, no tiene ningún impacto en la inmutabilidad.

Consideremos una serie temporal creada a partir de una lista incluida en la memoria:

values = [1.0, 2.0, 4.0]
x = tspy.time_series(values)
x

Esto devuelve:

TimeStamp: 0     Value: 1.0
TimeStamp: 1     Value: 2.0
TimeStamp: 2     Value: 4.0

Durante el proceso de creación, la serie temporal se puede asociar a un TRS. La asociación de un TRS con una serie temporal permite que sus indicaciones numéricas de fecha y hora sean como la marca de tiempo y el desplazamiento/zona horaria. El ejemplo siguiente muestra 1 minute and 1 Jan 2019, 12 midnight (GMT):

zdt = datetime.datetime(2019,1,1,0,0,0,0,tzinfo=datetime.timezone.utc)
x_trs = tspy.time_series(data, granularity=datetime.timedelta(minutes=1), start_time=zdt)
x_trs

Esto devuelve:

TimeStamp: 2019-01-01T00:00Z     Value: 1.0
TimeStamp: 2019-01-01T00:01Z     Value: 2.0
TimeStamp: 2019-01-01T00:02Z     Value: 4.0

A continuación, se muestra otro ejemplo en el que las indicaciones de fecha y hora numéricas se reinterpretan con una marca de tiempo de una hora y de desplazamiento/zona horaria como 1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT).

tz_edt = datetime.timezone.edt
zdt = datetime.datetime(2019,1,1,0,0,0,0,tzinfo=tz_edt)
x_trs = tspy.time_series(data, granularity=datetime.timedelta(hours=1), start_time=zdt)
x_trs

Esto devuelve:

TimeStamp: 2019-01-01T00:00-04:00     Value: 1.0
TimeStamp: 2019-01-01T00:01-04:00     Value: 2.0
TimeStamp: 2019-01-01T00:02-04:00     Value: 4.0

Observe que ahora las indicaciones de fecha y hora indican un desplazamiento de -4 horas desde GMT (zona horaria EDT) y capturan la marca de tiempo de una hora. Tenga en cuenta también que establecer un TRS NO cambia las indicaciones numéricas de fecha y hora; sólo especifica una forma de interpretar las indicaciones numéricas de fecha y hora.

x_trs.print(human_readable=False)

Esto devuelve:

TimeStamp: 0     Value: 1.0
TimeStamp: 1     Value: 2.0
TimeStamp: 2     Value: 4.0

Cambio de TRS

Puede cambiar el TRS asociado a una serie temporal utilizando la función with_trs. Tenga en cuenta que esta función generará una excepción si la serie temporal de entrada no está asociada a un TRS (si el valor de TRS es Ninguno). El uso de with_trs cambia las indicaciones numérica de fecha y hora.

El código de ejemplo siguiente muestra el TRS establecido durante el proceso de creación sin utilizar with_trs:

# 1546300800 is the epoch time in seconds for 1 Jan 2019, 12 midnight GMT
zdt1 = datetime.datetime(1970,1,1,0,0,0,0,tzinfo=datetime.timezone.utc)
y = tspy.observations.of(tspy.observation(1546300800, 1.0),tspy.observation(1546300860, 2.0), tspy.observation(1546300920,
    4.0)).to_time_series(granularity=datetime.timedelta(seconds=1), start_time=zdt1)
y.print()
y.print(human_readable=False)

Esto devuelve:

TimeStamp: 2019-01-01T00:00Z     Value: 1.0
TimeStamp: 2019-01-01T00:01Z     Value: 2.0
TimeStamp: 2019-01-01T00:02Z     Value: 4.0

# TRS has been set during construction time - no changes to numeric timestamps
TimeStamp: 1546300800     Value: 1.0
TimeStamp: 1546300860     Value: 2.0
TimeStamp: 1546300920     Value: 4.0

El ejemplo siguiente muestra cómo aplicar with_trs para cambiar granularity a un minuto y retener el desplazamiento de hora original (1 de enero de 1970, 12 de medianoche GMT):

y_minutely_1970 = y.with_trs(granularity=datetime.timedelta(minutes=1), start_time=zdt1)
y_minutely_1970.print()
y_minutely_1970.print(human_readable=False)

Esto devuelve:

TimeStamp: 2019-01-01T00:00Z     Value: 1.0
TimeStamp: 2019-01-01T00:01Z     Value: 2.0
TimeStamp: 2019-01-01T00:02Z     Value: 4.0

# numeric timestamps have changed to number of elapsed minutes since 1 Jan 1970, 12 midnight GMT
TimeStamp: 25771680     Value: 1.0
TimeStamp: 25771681     Value: 2.0
TimeStamp: 25771682     Value: 4.0

Ahora aplique with_trs para cambiar granularity a un minuto y el desplazamiento a 1 de enero de 2019, 12 de la noche GMT:

zdt2 = datetime.datetime(2019,1,1,0,0,0,0,tzinfo=datetime.timezone.utc)
y_minutely = y.with_trs(granularity=datetime.timedelta(minutes=1), start_time=zdt2)
y_minutely.print()
y_minutely.print(human_readable=False)

Esto devuelve:

TimeStamp: 2019-01-01T00:00Z     Value: 1.0
TimeStamp: 2019-01-01T00:01Z     Value: 2.0
TimeStamp: 2019-01-01T00:02Z     Value: 4.0

# numeric timestamps are now minutes elapsed since 1 Jan 2019, 12 midnight GMT
TimeStamp: 0     Value: 1.0
TimeStamp: 1     Value: 2.0
TimeStamp: 2     Value: 4.0

Para entender mejor cómo impacta en el procesamiento posterior, examinemos lo siguiente. Tenga en cuenta que materialize en las indicaciones de fecha y hora numéricas opera en las indicaciones de fecha y hora numéricas subyacentes asociadas a la serie temporal.

print(y.materialize(0,2))
print(y_minutely_1970.materialize(0,2))
print(y_minutely.materialize(0,2))

Esto devuelve:

# numeric timestamps in y are in the range 1546300800, 1546300920 and thus y.materialize(0,2) is empty
[]
# numeric timestamps in y_minutely_1970 are in the range 25771680, 25771682 and thus y_minutely_1970.materialize(0,2) is empty
[]
# numeric timestamps in y_minutely are in the range 0, 2
[(0,1.0),(1,2.0),(2,4.0)]

El método materialize también se puede aplicar a objetos de fecha y hora. Esto genera una excepción si la serie temporal subyacente no está asociada a un TRS (si el valor de TRS es Ninguno). Presuponiendo que la serie temporal subyacente tenga un TRS, los objetos de fecha y hora se correlacionan en un rango numérico utilizando el TRS.

# Jan 1 2019, 12 midnight GMT
dt_beg = datetime.datetime(2019,1,1,0,0,0,0,tzinfo=datetime.timezone.utc)
# Jan 1 2019, 12:02 AM GMT
dt_end = datetime.datetime(2019,1,1,0,2,0,0,tzinfo=datetime.timezone.utc)

print(y.materialize(dt_beg, dt_end))
print(y_minutely_1970.materialize(dt_beg, dt_end))
print(y_minutely.materialize(dt_beg, dt_end))

# materialize on y in UTC millis
[(1546300800,1.0),(1546300860,2.0), (1546300920,4.0)]
# materialize on y_minutely_1970 in UTC minutes
[(25771680,1.0),(25771681,2.0),(25771682,4.0)]
# materialize on y_minutely in minutes offset by 1 Jan 2019, 12 midnight
[(0,1.0),(1,2.0),(2,4.0)]

Indicaciones de fecha y hora duplicadas

Cambiar el TRS puede dar como resultado la duplicación de las indicaciones de fecha y hora. El ejemplo siguiente cambia la granularidad a una hora, lo que da como resultado indicaciones de fecha y hora duplicadas. La biblioteca de series de temporales maneja las indicaciones de fecha y hora duplicadas sin problemas y proporciona combinadores útiles para reducir los valores asociados a las indicaciones de fecha y hora duplicadas a un único valor, por ejemplo, calculando un promedio de los valores agrupados por indicaciones de fecha y hora duplicadas.

y_hourly = y_minutely.with_trs(granularity=datetime.timedelta(hours=1), start_time=zdt2)
print(y_minutely)
print(y_minutely.materialize(0,2))

print(y_hourly)
print(y_hourly.materialize(0,0))

Esto devuelve:

# y_minutely - minutely time series
TimeStamp: 2019-01-01T00:00Z     Value: 1.0
TimeStamp: 2019-01-01T00:01Z     Value: 2.0
TimeStamp: 2019-01-01T00:02Z     Value: 4.0

# y_minutely has numeric timestamps 0, 1 and 2
[(0,1.0),(1,2.0),(2,4.0)]

# y_hourly - hourly time series has duplicate timestamps
TimeStamp: 2019-01-01T00:00Z     Value: 1.0
TimeStamp: 2019-01-01T00:00Z     Value: 2.0
TimeStamp: 2019-01-01T00:00Z     Value: 4.0

# y_hourly has numeric timestamps of all 0
[(0,1.0),(0,2.0),(0,4.0)]

Opcionalmente, las indicaciones de fecha y hora duplicadas se pueden combinar del modo siguiente:

y_hourly_averaged = y_hourly.transform(transformers.combine_duplicate_granularity(lambda x: sum(x)/len(x))
print(y_hourly_averaged.materialize(0,0))

Esto devuelve:

# values corresponding to the duplicate numeric timestamp 0 have been combined using average
# average = (1+2+4)/3 = 2.33
[(0,2.33)]

Más información

Para utilizar el SDK tspy de Python, consulte la Documentación del SDK tspy de Python.

Tema principal: Análisis de series temporales

Búsqueda y respuesta de IA generativa
Estas respuestas las genera un modelo de lenguaje grande en watsonx.ai que se basa en el contenido de la documentación del producto. Más información