Forum FlexPro – Discuss your topic!

Datensatz mit FPScript nach Vorgabe erstellen

Accueil > Community > FPScript > Datensatz mit FPScript nach Vorgabe erstellen

Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • #35164
    Thomas BalvenThomas Balven
    Participant

    Ich würde gerne mit einem Skript einen Datensatz mit Hilfe der Kalenderzeit erzeugen lassen. Ich lese einen Datensatz mit dem Namen ‘Datum’ ein und ziehe mir mit einer Formel (‘Startdatum):

    Dim Startdatum
    Startdatum = Datum.X[0, 0]

    und einer Formel (‘Enddatum’)

    Dim Enddatum
    Enddatum = Datum.X[-1]
    

    die relevanten Start-und Enddaten in der Form hh:mm:ss heraus. Im Anschluss würde ich gerne einen neuen Datensatz in folgender Form erzeugen:

    Kalenderzeit            Y-Wert
    01.12.2022 00:00:00     1
    01.12.2022 00:00:01     0
    01.12.2022 08:00:00     1
    01.12.2022 08:00:01     0
    01.12.2022 16:00:00     1
    01.12.2022 16:00:01     0
    02.12.2022 00:00:00     1
    02.12.2022 00:00:01     0
    02.12.2022 08:00:00     1
    02.12.2022 08:00:01     0
    02.12.2022 16:00:00     1
    02.12.2022 16:00:01     0

    Der neue Datensatz soll immer bei ‘Startdatum’ 00:00 Uhr beginnen und mir eine 1 als Wert zurückgeben. 1 Sekunde später soll der Wert 0 sein. Im Anschluss soll im 8 Stunden-Takt das gleiche geschehen bis ‘Enddatum’ erreicht ist.

    Kann man das im FPScript lösen?

    Vielen Dank für die Hilfe.

    #35165
    Bernhard KantzBernhard Kantz
    Participant

    Mit der Funktion Date() wird durch ‘Nullsetzen’ der Zeit das Datum aus einer Kalenderzeit bestimmt, liefert also genau den Startzeitpunkt des gewünschten Datensatzes. Mit der gewünschten Schrittweite von 8 h kann mit der Series()-Funktion die 1er-Zeitpunkte als Datenreihe berechnet werden:

    Dim zeit_ein = Series(Date(datum_start), datum_end, 8 h)

    Zu beachten ist allerdings, das die Datenreihe in der Länge so berechnet wird, dass der letzte Wert den geringsten Abstand zum gewünschten Endpunkt hat; er kann also auch über diesem liegen. Wenn die ein Problem sein sollte, muss man von der Datenreihe alle bis aufs letzte Element weiterverwenden:

    If zeit_ein[-1] > datum_end Then
    	zeit_ein = zeit_ein[0, -2]
    End
    

    Man lege sich dann Datenreihen für die x- und y-Komponente des gewünschten Resultats an:

    Dim M = NumberOfRows(zeit_ein)
    Dim x = CalendarTime ? # 2 * M
    Dim y = ? # 2 * M
    

    Durch Adressieren der geraden und ungeraden Elemente können die Ein- und Aus-Zeitpunkte in jeweils einer Zuweisung gesetzt werden:

    Dim i_ein = (M, 0L, 2L)
    Dim i_aus = i_ein + 1L
    
    x[i_ein] = zeit_ein
    y[i_ein] = 1
    
    x[i_aus] = zeit_ein + 1 s
    y[i_aus] = 0
    
    Signal(y, x)
    

    Generell sollte man stets versuchen, auf eine Schleife über Datenreihen zu verzichten. Dabei leisten wie hier gezeigt die Indizierung mittels Datenreihen gute Dienste. Diese Indexdatenreihen können etwa auch mit den Funktionen der Ereignisisolation erzeugt werden.

Viewing 2 posts - 1 through 2 (of 2 total)
  • You must be logged in to reply to this topic.