0 / 0
Go back to the English version of the documentation
System odniesienia czasu
Last updated: 07 lip 2023
System odniesienia czasu

System odniesienia czasu (Time reference system-TRS) jest systemem lokalnym, regionalnym lub globalnym używanym do identyfikacji czasu.

System odniesienia czasu definiuje konkretną projekcję na potrzeby przekazywania i odwrotnego odwzorowania między znacznikiem czasu i jego reprezentacją numeryczną. Powszechnym przykładem, że większość użytkowników zna czas UTC, który odwzorowuje znacznik czasu, na przykład (1 sty 2019, 12 północy (GMT) na 64-bitową liczbę całkowitą (1546300800000), która przechwytuje liczbę milisekund, które upłynęły od 1 stycznia 1970 roku, 12 północy (GMT). Ogólnie rzecz biorąc, wartość znacznika czasu jest lepiej dopasowana do ludzkiej czytelności, podczas gdy reprezentacja liczbowa jest lepiej dopasowana do przetwarzania maszyn.

W bibliotece szeregów czasowych szeregi czasowe mogą być powiązane z TRS. System TRS składa się z:

  • Znacznik czasu, który przechwytuje granulację czasu, na przykład 1 minuta
  • Nieupakowany czas, który przechwytuje czas rozpoczęcia, na przykład 1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT). Znacznik czasu jest odwzorowywany na reprezentację liczbową, obliczając liczbę znaczników czasu, które upłynęły od czasu rozpoczęcia. Reprezentacja numeryczna jest skalowana przez granulację i przesunięta o czas rozpoczęcia, gdy jest ona odwzorowana z powrotem na znacznik czasu.

Należy zauważyć, że ta perspektywiczny + odwrócony projekcja może doprowadzić do utraty czasu. For instance, if the true time granularity of a time series is in seconds, then forward and reverse mapping of the time stamps 09:00:01 and 09:00:02 (to be read as hh:mm:ss) to a granularity of one minute would result in the time stamps 09:00:00 and 09:00:00 respectively. W tym przykładzie seria czasowa, której granulacja jest podana w sekundach, jest odwzorowywana na minuty, a tym samym odwzorowanie odwrotne loże informacje. Jeśli jednak odwzorowana granulacja jest wyższa niż granulacja szeregów czasowych wejściowych (dokładniej, jeśli granulacja szeregów czasowych jest wielokrotnością odwzorowanej granulacji), to perspektywiczny + odwrócona projekcja jest gwarantowana jako bezstratna. Na przykład odwzorowanie szeregów czasowych, których granulacja jest w minutach, na sekundy i odwrócenie ich do minut, spowodowałoby bezstratną rekonstrukację datowników.

Ustawianie TRS

Kiedy tworzona jest seria czasowa, jest ona powiązana z TRS (lub None, jeśli nie określono TRS). Jeśli TRS ma wartość Brak, wartości liczbowe nie mogą być odwzorowywane na znaczniki czasu. Należy pamiętać, że TRS może być ustawiony tylko w szeregach czasowych w czasie budowy. Powodem jest to, że seria czasowa według projektu jest niezmiennym obiektem. Niezmienność jest przydatna, gdy biblioteka jest używana w środowiskach wielowątkowych lub w rozproszonych środowiskach obliczeniowych, takich jak Apache Spark. Zestaw TRS można ustawić tylko w czasie budowy, ale można go zmienić za pomocą metody with_trs zgodnie z opisem w następnej sekcji. Produkt with_trs tworzy nowy szereg czasowy i tym samym nie ma wpływu na niezmienność.

Zastanówmy się nad prostym szeregiem czasowym stworzonym z listy in-memory:

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

Zwracane są następujące dane:

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

W czasie budowy szeregi czasowe mogą być powiązane z TRS. Powiązanie TRS z szeregami czasowymi pozwala na to, aby jego liczbowe znaczniki czasu były takie jak znacznik czasu i przesunięcia/strefa czasowa. W poniższym przykładzie przedstawiono 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

Zwracane są następujące dane:

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

Oto kolejny przykład, w którym liczbowe datowniki są reinterpretowane z czasem o jedną godzinę, a przesunięcie/strefę czasową jako 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

Zwracane są następujące dane:

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

Należy zauważyć, że datowniki wskazują teraz przesunięcie -4 godzin od czasu GMT (strefa czasowa EDT) i przechwytuje znacznik czasu o jednej godzinie. Należy również zauważyć, że ustawienie parametru TRS NIE zmienia datowników liczbowych-określa tylko sposób interpretowania liczbowych datowników.

x_trs.print(human_readable=False)

Zwracane są następujące dane:

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

Zmiana TRS

Istnieje możliwość zmiany TRS powiązanego z serią czasową za pomocą funkcji with_trs . Należy zauważyć, że ta funkcja zgłosi wyjątek, jeśli wejściowa seria czasowa nie jest powiązana z TRS (jeśli TRS ma wartość Brak). Użycie produktu with_trs powoduje zmianę liczbowych datowników.

Poniższy przykładowy kod przedstawia zestaw TRS ustawiony w czasie rywalizacji bez użycia produktu 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)

Zwracane są następujące dane:

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

W poniższym przykładzie przedstawiono sposób zastosowania produktu with_trs w celu zmiany granularity na jedną minutę i zachowania oryginalnego przesunięcia czasu (1 sty 1970, 12 północy 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)

Zwracane są następujące dane:

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

Teraz zastosuj with_trs , aby zmienić granularity na jedną minutę, a przesunięcie na 1 sty 2019, 12 północy 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)

Zwracane są następujące dane:

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

Aby lepiej zrozumieć, w jaki sposób wpływa ono na przetwarzanie końcowe, przeanalizujmy poniższe informacje. Należy zwrócić uwagę, że materialize na liczbowym znacznikach czasu działa na bazowych znacznikach liczbowych powiązanych z serią czasową.

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

Zwracane są następujące dane:

# 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)]

Metoda materialize może być również stosowana do obiektów typu data i godzina. Powoduje to wystąpienie wyjątku, jeśli bazowy szereg czasowy nie jest powiązany z TRS (jeśli TRS ma wartość Brak). Zakładając, że bazowy szereg czasowy ma TRS, obiekty typu data i godzina są odwzorowywane na zakres liczbowy przy użyciu 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)]

Duplikuj znaczniki czasu

Zmiana TRS może spowodować zduplikowanie datowników. W poniższym przykładzie można zmienić granulację na jedną godzinę, co powoduje zduplikowanie datowników. Biblioteka szeregów czasowych umożliwia bezproblemowe duplikowanie znaczników czasu i zapewnia wygodę kombinatorów w celu zredukowania wartości powiązanych ze zduplikowanymi znacznikami czasu do jednej wartości, na przykład przez obliczenie średniej wartości pogrupowanych przez zduplikowane znaczniki czasu.

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))

Zwracane są następujące dane:

# 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)]

Podwójne znaczniki czasu mogą być opcjonalnie łączone w następujący sposób:

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

Zwracane są następujące dane:

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

Więcej inform.

Aby użyć pakietu tspy Python SDK, należy zapoznać się z dokumentacją pakietu tspy Python SDK.

Temat nadrzędny: Analiza szeregów czasowych

Generative AI search and answer
These answers are generated by a large language model in watsonx.ai based on content from the product documentation. Learn more