Zeitreferenzsystem
Das Zeitreferenzsystem (TRS - Time Reference System) ist ein lokales, regionales oder globales System zum Angeben der Zeit.
Ein Zeitreferenzsystem definiert eine bestimmte Projektion für die progressive und regressive Zuordnung zwischen einer Zeitmarke und ihrer numerischen Darstellung. Ein allgemeines Beispiel, das den meisten Benutzern bekannt ist, ist die UTC-Zeit, bei der eine Zeitmarke, zum Beispiel 1. Januar 2019, 00:00 Uhr (GMT), auf einen 64-Bit-Ganzzahlwert (1546300800000) abgebildet wird, der die Anzahl der Millisekunden erfasst, die seit dem 1. Januar 1970, 00:00 Uhr (GMT) abgelaufen sind. Allgemein kann man sagen, dass der Zeitmarkenwert für den Menschen besser lesbar ist, während die numerische Darstellung für die maschinelle Verarbeitung besser geeignet ist.
In der Zeitreihenbibliothek kann eine Zeitreihe einem TRS zugeordnet werden. Ein TRS besteht aus Folgendem:
- Zeitschritt, der die Zeitgranularität erfasst, zum Beispiel 1 Minute
- Gezonte Datums-/Uhrzeitdaten, die eine Startzeit erfassen, z. B.
1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT)
. Eine Zeitmarke wird einer numerischen Darstellung zugeordnet, indem die Anzahl der seit der Startzeit abgelaufenen Zeitschritte berechnet wird. Eine numerische Darstellung wird durch die Granularität skaliert und um die Startzeit verschoben, wenn sie einer Zeitmarke zugeordnet wird.
Beachten Sie, dass diese progressive und regressive Projektion möglicherweise zu einem Zeitverlust führt. Wenn die wahre Zeitgranularität einer Zeitreihe beispielsweise in Sekunden angegeben ist, würde die Vorwärts-und Rückwärtszuordnung der Zeitmarken 09:00:01
und 09:00:02
(als hh:mm:ss
zu lesen) zu einer Granularität von einer Minute zu den Zeitmarken 09:00:00
bzw. 09:00:00
führen. In diesem Beispiel wird eine Zeitreihe, deren Granularität in Sekunden erfolgt, auf Minuten abgebildet und somit gehen bei der regressiven Zuordnung Informationen verloren. Wenn die abgebildete Granularität jedoch höher als die Granularität der eingegebenen Zeitreihe ist (genauer gesagt, wenn die Zeitreihengranularität ein ganzzahliges Vielfaches der zugeordneten Granularität ist), dann ist die progressive und regressive Projektion garantiert verlustfrei. Wenn Sie beispielsweise eine Zeitreihe mit einer Granularität auf Minutenbasis auf Sekunden abbilden und eine regressive Projektion auf Minuten durchführen, würde dies eine verlustfreie Rekonstruktion der Zeitmarken ergeben.
TRS einstellen
Bei der Erstellung einer Zeitreihe wird diese einem TRS zugeordnet (oder 'None', wenn kein TRS angegeben ist). Wenn das TRS 'None' lautet, können die numerischen Werte nicht Zeitmarken zugeordnet werden. Beachten Sie, dass ein TRS für eine Zeitreihe nur bei der Erstellung festgelegt werden kann. Dies liegt daran, dass eine Zeitreihe absichtlich ein unveränderliches Objekt ist. Die Unveränderlichkeit ist nützlich, wenn die Bibliothek in Multithread-Umgebungen oder in Umgebungen mit verteilter Datenverarbeitung, wie Apache Spark, verwendet wird. Während ein TRS nur bei der Erstellung festgelegt werden kann, kann es mit der Methode with_trs
wie im nächsten Abschnitt beschrieben geändert werden. with_trs
erstellt eine neue Zeitreihe und hat somit keine Auswirkung auf die Unveränderlichkeit.
Betrachten wir eine einfache Zeitreihe, die aus einer speicherinternen Liste erstellt wurde:
values = [1.0, 2.0, 4.0]
x = tspy.time_series(values)
x
Diese Abfrage gibt Folgendes zurück:
TimeStamp: 0 Value: 1.0
TimeStamp: 1 Value: 2.0
TimeStamp: 2 Value: 4.0
Bei der Erstellung kann die Zeitreihe einem TRS zugeordnet werden. Durch die Zuordnung eines TRS zu einer Zeitreihe können die numerischen Zeitmarken entsprechend dem Zeitschritt und der Abweichung/Zeitzone angegeben werden. Das folgende Beispiel zeigt 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
Diese Abfrage gibt Folgendes zurück:
TimeStamp: 2019-01-01T00:00Z Value: 1.0
TimeStamp: 2019-01-01T00:01Z Value: 2.0
TimeStamp: 2019-01-01T00:02Z Value: 4.0
Im folgenden Beispiel werden die numerischen Zeitmarken mit einem Zeitschritt von einer Stunde und einem Offset/einer Zeitzone als 1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT)
neu interpretiert.
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
Diese Abfrage gibt Folgendes zurück:
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
Beachten Sie, dass die Zeitmarken nun eine Abweichung von -4 Stunden von der GMT (Zeitzone EDT) angeben und den Zeitschritt von einer Stunde erfassen. Beachten Sie zudem, dass die numerischen Zeitmarken durch Festlegen eines TRS NICHT geändert werden. Es wird lediglich eine Möglichkeit angegeben, numerische Zeitmarken zu interpretieren.
x_trs.print(human_readable=False)
Diese Abfrage gibt Folgendes zurück:
TimeStamp: 0 Value: 1.0
TimeStamp: 1 Value: 2.0
TimeStamp: 2 Value: 4.0
Zeitreferenzsystem ändern
Sie können die einer Zeitreihe zugeordnete TRS mit der Funktion with_trs
ändern. Beachten Sie, dass diese Funktion eine Ausnahme auslöst, wenn die eingegebene Zeitreihe keinem TRS zugeordnet ist (wenn TRS 'None' lautet). Die Verwendung von with_trs
ändert die numerischen Zeitmarken.
Das folgende Codebeispiel zeigt die TRS-Gruppe zum Zeitpunkt der Kontingente ohne Verwendung von 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)
Diese Abfrage gibt Folgendes zurück:
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
Das folgende Beispiel zeigt, wie with_trs
angewendet wird, um granularity
auf eine Minute zu ändern und die ursprüngliche Zeitzonenabweichung beizubehalten (1. Januar 1970, Mitternacht 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)
Diese Abfrage gibt Folgendes zurück:
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
Wenden Sie jetzt with_trs
an, um granularity
in eine Minute und den Offset auf den 1. Januar 2019, 12 Uhr Mitternacht GMT zu ändern:
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)
Diese Abfrage gibt Folgendes zurück:
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
Um besser zu verstehen, wie sich dies auf die Nachverarbeitung auswirkt, untersuchen wir Folgendes. Beachten Sie, dass materialize
für numerische Zeitmarken mit den zugrunde liegenden numerischen Zeitmarken arbeitet, die der Zeitreihe zugeordnet sind.
print(y.materialize(0,2))
print(y_minutely_1970.materialize(0,2))
print(y_minutely.materialize(0,2))
Diese Abfrage gibt Folgendes zurück:
# 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)]
Die Methode materialize
kann auch auf Datum/Uhrzeit-Objekte angewendet werden. Dies führt zu einer Ausnahmebedingung, wenn die zugrunde liegende Zeitreihe keinem TRS zugeordnet ist (wenn TRS 'None' lautet). Angenommen, die zugrunde liegende Zeitreihe verfügt über ein TRS, dann werden die datetime-Objekte mithilfe des TRS auf einen numerischen Bereich abgebildet.
# 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)]
Doppelte Zeitmarken
Das Ändern des TRS kann zu doppelten Zeitmarken führen. Im folgenden Beispiel wird die Granularität in eine Stunde geändert, was zu doppelten Zeitmarken führt. Die Zeitreihenbibliothek bearbeitet doppelte Zeitmarken nahtlos und fasst doppelten Zeitmarken zugeordnete Werte zur Vereinfachung zu einem einzelnen Wert zusammen, z. B. durch Berechnen eines Durchschnitts der nach doppelten Zeitmarken gruppierten Werte.
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))
Diese Abfrage gibt Folgendes zurück:
# 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)]
Doppelte Zeitmarken können optional folgendermaßen kombiniert werden:
y_hourly_averaged = y_hourly.transform(transformers.combine_duplicate_granularity(lambda x: sum(x)/len(x))
print(y_hourly_averaged.materialize(0,0))
Diese Abfrage gibt Folgendes zurück:
# values corresponding to the duplicate numeric timestamp 0 have been combined using average
# average = (1+2+4)/3 = 2.33
[(0,2.33)]
Weitere Informationen
Informationen zur Verwendung von tspy
Python SDK finden Sie in der tspy
Python SDK-Dokumentation.
Übergeordnetes Thema: Zeitreihenanalyse