Timestamp-Datentyp für große Zeitreihen



  • Hallo zusammen

    ich möchte mir eine Zeitreihen-Bibliothek bauen. D.h. es geht um Reihen von Zeit-Wert-Paaren.
    Nun stellt sich mir die Frage, welchen Datentyp ich verwende, um die Zeit abzubilden.

    Ich hatte jetzt an std::chrono gedacht, nur stellt sich mir die Frage ob chrono dafür geeignet ist, denn die chrono::time_point hängen ja immer mit einer clock zusammen.
    Ich möchte Zeitstempel addieren, subtrahieren, vergleichen, aber die Zeitstempel stehen in keiner Relation zur jeweiligen Systemzeit.

    Zu welchem Datentyp würdet ihr mir in dem Fall für den Zeitstempel raten?
    Insbesondere im Hinblick auf Performance und Speicherkonsum. Es geht um sehr große Zeitreihen.



  • @It0101 sagte in Timestamp-Datentyp für große Zeitreihen:

    Ich möchte Zeitstempel addieren

    Da fängt es schon an - was soll das sein - konkret: was ist denn der 1. November 1999 + 3. Dezember 2010?

    Chrono hat das Konzept eines Zeitpunktes (time_point) und das einer Länge (duration). Chrono bietet dir außerdem die Möglichkeit, die Auflösung zu wählen.

    Insbesondere im Hinblick auf Performance und Speicherkonsum. Es geht um sehr große Zeitreihen.

    Was bedeutet "groß" in diesem Zusammenhang? Groß = von 1 Mio BC bis 1 Mio Jahre nach BC? Welche Präzision brauchst du (Nanosekunden, Millisekunden, Tage)? Du kannst dann den passenden Typ in chrono wählen.



  • Wie genau muss der Zeitstempeln sein?
    Wenn eine Sekunde reicht nimm die klassische UNIX Epoch bzw. das Windows Äquivalent. Die UNIX Epoch ist mittlerweile 64Bit groß und das entspricht einem klassischem double in 64Bit.



  • In Sachen Präzision: Millisekunden.
    Was die Addition betrifft: eher sowas wie 05.01.2018 14h:33m + 4 Tage.
    Oder Subtraktion: 06.01.2018 16:00 - 02.01.2018 12h:33h
    z.B. um eine Differenz in Millisekunden zu errechnen.

    Groß bedeutet das man z.B. zwischen 01.01.2017 und 01.01.2019 z.B. 100.000 verschiedene Zeitpunkte hat.
    Alles findet nach 1990 statt.



  • @It0101 sagte in Timestamp-Datentyp für große Zeitreihen:

    Hallo zusammen

    ich möchte mir eine Zeitreihen-Bibliothek bauen. D.h. es geht um Reihen von Zeit-Wert-Paaren.
    Nun stellt sich mir die Frage, welchen Datentyp ich verwende, um die Zeit abzubilden.

    Ich hatte jetzt an std::chrono gedacht, nur stellt sich mir die Frage ob chrono dafür geeignet ist, denn die chrono::time_point hängen ja immer mit einer clock zusammen.
    Ich möchte Zeitstempel addieren, subtrahieren, vergleichen, aber die Zeitstempel stehen in keiner Relation zur jeweiligen Systemzeit.

    Zu welchem Datentyp würdet ihr mir in dem Fall für den Zeitstempel raten?
    Insbesondere im Hinblick auf Performance und Speicherkonsum. Es geht um sehr große Zeitreihen.

    Bei sowas habe ich immer "Sekunden relativ zu einem bestimten Datum" verwendet, z.B, 0 == 1.1.1970, 86400 == 2.1.1970, usw. Sekundenangaben lassen sich leicht im Nachhinein in jedes Datumsformat umrechnen.



  • @It0101 Du könntest z.B. std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> verwenden. Wäre meine Default-Wahl.

    Wenn du Speicher sparen musst, käme auch sowas wie std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<int32_t, std::milli>> in Betracht. Du damit würdest du die Millisekunden in einem int32_t speichern. Musst du halt überlegen, welchen Typ du nehmen willst, weil sonst die Millisekunden irgendwann überlaufen.



  • Ok ich muss mich mit chrono wohl etwas intensiver auseinandersetzen. Scheint zumindest nicht besonders trivial zu sein, einfach mal so bei einem time_point Datum und Uhrzeit zu setzen.

    Dafür beschäftigt sich das halbe Internet mit der aktuellen Zeit, aber nicht mit anderen Zeiten aus irgendwelchen Datenquellen. 😉

    Ich denke aber ich werde chrono verwenden, wenns eine halbwegs sinnvoll Lösung gibt. Ich schwanke noch zwischen Millisekunden und Sekunden. Eventuell reichen auch Sekunden für meine Zwecke.

    std::tm tm = {};
    std::stringstream ss("Jan 9 2014 12:35:34");
    ss >> std::get_time(&tm, "%b %d %Y %H:%M:%S");
    auto tp = std::chrono::system_clock::from_time_t(std::mktime(&tm));
    

    Kann das überhaupt performant sein? Kommt mir ziemlich umständlich vor. ( Quelle: internet ).



  • @It0101 sagte in Timestamp-Datentyp für große Zeitreihen:

    std::tm tm = {};
    std::stringstream ss("Jan 9 2014 12:35:34");
    ss >> std::get_time(&tm, "%b %d %Y %H:%M:%S");
    auto tp = std::chrono::system_clock::from_time_t(std::mktime(&tm));
    

    Kann das überhaupt performant sein? Kommt mir ziemlich umständlich vor. ( Quelle: internet ).

    Willst du jetzt einen Timestamp aus einem String parsen oder einfach nur ein bestimmtes Datum einem Timestamp zuweisen?

    Wie wäre es mit:

    #include "date.h"
    
    using namespace date;
    using namespace std::chrono;
    ...
    auto tp = sys_days{ year(2014)/1/9 } + hours(12) + minutes(35) + seconds(34);
    

    Oder wenn du parsen willst:

    time_point<system_clock, milliseconds> tp; // oder andere Präzision wählen
    std::stringstream ss("Jan 9 2014 12:35:34");
    ss >> parse("%b %d %Y %H:%M:%S", tp);
    

    Ohne Howard Hinnants date.h gehts nicht sinnvoll.



  • @wob sagte in Timestamp-Datentyp für große Zeitreihen:

    Ohne Howard Hinnants date.h gehts nicht sinnvoll.

    Also hat man irgendwie ne chrono-Bibliothek geschaffen, die aber kein Mensch für reale Anwendungen nutzen kann?
    Das einzige was die nativ kann, ist Zeitmessung, oder? Also T1 - T0

    Hab schon von der date.h gehört. Im Internet scheint die jeder zu kennen. Schade eigentlich dass das Standardkomitee schwer angetrunken war als es um die Chrono ging 😃

    Danke dir für deine Hilfe. Ich werde mir diese berüchtigte date.h mal anschauen 😉



  • Von boost gibt es noch Boost.Date_Time.

    Mit #define BOOST_DATE_TIME_NO_LIB
    vor #include <boost\date_time\gregorian\gregorian.hpp> ist es auch header-only. Es fallen glaube ich dann ein paar Funktionen weg. Aber z.B. T1 - T0 funktioniert dann noch.

    Kann man auch mit date_period und der dazugehörigen Memberfunktion lenght() realisieren.


Anmelden zum Antworten