0 / 0
Go back to the English version of the documentation
Systém referenčních časů
Last updated: 07. 7. 2023
Systém referenčních časů

Referenční systém času (TRS) je místní, regionální nebo globální systém sloužící k identifikaci času.

Referenční systém definuje specifickou projekci pro dopředné a převrácené mapování mezi časovým razítkem a jeho číselnou reprezentací. Běžným příkladem je čas, kdy je většina uživatelů obeznámen s časem UTC, který mapuje časové razítko, například (1. ledna 2019, 12 půlnoci (GMT) na 64bitovou celočíselnou hodnotu (1546300800000), která zachytí počet milisekund, které uplynuly od 1. ledna 1970, 12 půlnoci (GMT). Obecně řečeno, hodnota časového razítka se lépe hodí pro přehlednost člověka, zatímco numerické znázornění je vhodnější pro zpracování počítače.

V knihovně časových řad může být časová řada přidružena k TRS. Kanál TRS se skládá z:

  • Časová značka, která zachycuje granularitu času, například 1 minuta.
  • Zónový čas s datem, který zachycuje čas zahájení, například 1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT). Časové razítko je namapováno na numerickou reprezentaci tak, že počítáním počtu uplynulých časových pulzů od času zahájení. Číselná reprezentace je škálována podle granularity a posunuta o čas zahájení, když je namapována zpět na časové razítko.

Všimněte si, že tato dopředná a reverzní projekce může vést ke ztrátě času. Je-li například granularita času posloupnosti časové řady v sekundách, potom dopředné a zpětné mapování časových razítek 09:00:01 a 09:00:02 (pro čtení jako hh:mm:ss) na granularitu jedné minuty by vedlo k tomu, že časová razítka 09:00:00 a 09:00:00 budou mít za následek zrušení platnosti. V tomto příkladu je časová řada, jejíž granularita se nachází v sekundách, mapována na minuty, a tedy zpětné mapování poskytuje informace o úhoně. Avšak pokud je mapovaná granularita vyšší než granularita vstupní časové řady (konkrétně, je-li granularita časové řady integrální násobkem namapované granularity), pak je zpětné projekci forward + reverzně zaručeno, že bude bezztrátová. Například mapování časové řady, jejíž granularita je v minutách, na sekundy a obrácené promítání na zápis, by vedlo k bezztrátové rekonstrukci časových razítek.

Nastavení TRS

Je-li vytvořena časová řada, je přidružena k TRS (nebo Žádná, pokud není zadán žádný TRS). Je-li TRS žádný, pak číselné hodnoty nelze namapovat na časová razítka. Všimněte si, že TRS může být nastaven pouze na časové řadě v době výstavby. Důvodem je to, že časová řada podle návrhu je neměnný objekt. Immutabilita je užitečná, když se knihovna používá ve vícevláknových prostředích nebo v distribuovaných výpočetních prostředích jako je Apache Spark. Zatímco SNM lze nastavit pouze v době výstavby, lze ji změnit pomocí metody with_trs popsané v další sekci. Produkt with_trs vytvoří novou časovou řadu, a tudíž nemá žádný vliv na neměnnost.

Podívejme se na jednoduchou časovou řadu vytvořenou ze seznamu v paměti:

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

Tato funkce vrací:

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

V době konstrukce může být časová řada přidružena k TRS. Přidružení TRS k časové řadě umožňuje, aby numerická časová razítka byla podle časového pulzu a offse/časového pásma. Následující příklad ukazuje 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

Tato funkce vrací:

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

Zde je další příklad, kde jsou numerická časová razítka znovu interpretována s časovým pulzem jedné hodiny a offsem/časovým pásmem 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

Tato funkce vrací:

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

Všimněte si, že časová razítka nyní označují posun -4 hodin od GMT (EDT timezone) a zachytí časový interval jedné hodiny. Všimněte si také, že nastavení TRS nemění numerická časová razítka-to pouze určuje způsob interpretace číselných časových razítek.

x_trs.print(human_readable=False)

Tato funkce vrací:

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

Změna TRS

TRS přidruženou k časové řadě můžete změnit pomocí funkce with_trs . Všimněte si, že tato funkce vygeneruje výjimku, pokud vstupní časová řada není přidružena k TRS (je-li TRS None). Při použití volby with_trs se změní číselná časová razítka.

Následující ukázka kódu zobrazuje sadu TRS v době, kdy došlo ke kontrukci, bez použití 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)

Tato funkce vrací:

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

Následující příklad ukazuje, jak použít with_trs ke změně granularity na jednu minutu a uchování původního časového posunu (1. ledna 1970, 12 o půlnoci 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)

Tato funkce vrací:

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

Nyní použijte with_trs pro změnu granularity na jednu minutu a posunutí na 1. leden 2019, 12 o půlnoci 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)

Tato funkce vrací:

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

Chcete-li lépe pochopit, jak to má vliv na zpracování po zpracování, prozkoumejte následující. Všimněte si, že materialize na číselných časových razítkách pracuje na výchozích číselných časových razítkách přidružených k časové řadě.

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

Tato funkce vrací:

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

Metodu materialize lze také použít na objekty s datem a časem. To vede k výjimce, pokud základní časová řada není přidružena k TRS (je-li TRS None). Za předpokladu, že základní časová řada má TRS, jsou objekty data a času mapovány na číselný rozsah pomocí 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)]

Duplicitní časová razítka

Změna TRS může vést k duplicitním časovým razítkům. Následující příklad změní granularitu na jednu hodinu, což vede k duplicitním časovým razítkům. Knihovna časových řad zpracovává duplicitní časová razítka hladkým způsobem a poskytuje výhody kombinacím ke snížení hodnot přidružených k duplicitním časovým razítkům do jediné hodnoty, například výpočtem průměru hodnot seskupených duplicitními časovými razítky.

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

Tato funkce vrací:

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

Duplicitní časová razítka lze volitelně kombinovat takto:

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

Tato funkce vrací:

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

Další informace

Chcete-li použít produkt tspy Python SDK, přečtěte si dokumentaci sady tspy Python SDK.

Nadřízené téma: Analýza časové řady

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