Logfiles / Timestamp + Duration

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
derElch
User
Beiträge: 36
Registriert: Sonntag 25. Februar 2018, 13:14

Hallo zusammen,

Ich bekomme aus einer aufbereiteten Log-Datei Fehlerdaten: Fehler, Datum Beginn Fehler, Datum Ende Fehler.

Je nach Fehler kann es sein, dass der <1 oder bis zu +30min sein kann. Daher würde ich gerne sehen, wieviele Fehler ich pro Minute habe.
Beispiel:

Code: Alles auswählen

Number	Start			End
2589	2024-09-02 14:49:46	2024-09-02 14:52:14
1223	2024-09-02 14:50:11	2024-09-02 14:54:56
2539	2024-09-02 14:54:34	2024-09-02 14:54:56
2539	2024-09-02 14:56:34	2024-09-02 14:56:38
Hier sieht man, dass 2539 4Minuten später auftaucht, aber zu gleichen Zeiten resettet wird.
Somit wäre auf Minuten aufgelöst.

Code: Alles auswählen

49; 1 #2589 aktiv
50; 2 #1223 fängt hier schon an
51; 2
52; 2
53; 1 # 2589 nicht mehr aktiv
54, 2 # 1223 + 2539 gleichzeitiger Reset
55; 0 # keiner akiv
56; 1 # 2539 kurzzeitigt aktiv
Hat hier jemand eine Idee, wie man das bewerkstelligen kann?
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@derElch: Was hast Du denn schon versucht? Das `datetime`-Modul hat die notwendigen Datentypen um mit Zeitstempeln und -dauern zu arbeiten.

Man könnte einfach die Minuten durchgehen und jedes mal wenn ein Ereignis startet einen Zähler erhöhen und wenn eines endet, den Zähler verringern. Die Anfangszeiten scheinen schon sortiert zu sein. Die gerade aktiven Ereignisse kann man nach der Endzeit sortieren, so hat man leicht Zugriff auf das nächste Ereignis das endet.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
derElch
User
Beiträge: 36
Registriert: Sonntag 25. Februar 2018, 13:14

@__blackjack__:

Die Daten sind alle auf die jeweiligen dtypes gerbracht (DateTime, int, ...)

Aktuelle habe ich zwei Weg im Kopf
  • Über Min/Max TimeStamp einen Dataframe mit 1Min erzeugen und dann mit .apply() maskieren ob Startzeit <= Feldwert UND Feldwert >= Endzeit. Mit dem Ergebnis kann ich dann entweder die Fehler als Liste ablegen oder mittels count die Anzahl bekommen.
  • Verstehen wie die beschriebene Lösung von Stackoverflow genau arbeitet und dann dementsprechend adaptieren. https://stackoverflow.com/questions/735 ... upby-and-r
derElch
User
Beiträge: 36
Registriert: Sonntag 25. Februar 2018, 13:14

Ich habe mich jetzt auf Version 2 entschieden, verstehen und verändern ;)

Aufbau des Test Dataframes

Code: Alles auswählen

EXAMPLE = pd.DataFrame(
    {'error': [2589, 1223, 2539, 2539],
     'start': ['2024-09-02T14:49:46', '2024-09-02T14:50:11', '2024-09-02T14:54:34', '2024-09-02T14:56:34'],
     'end': ['2024-09-02T14:52:14', '2024-09-02T14:54:56', '2024-09-02T14:54:56', '2024-09-02T14:56:38']})

EXAMPLE['start'] = pd.to_datetime(EXAMPLE['start'])
EXAMPLE['end'] = pd.to_datetime(EXAMPLE['end'])

   error               start                 end
0   2589 2024-09-02 14:49:46 2024-09-02 14:52:14
1   1223 2024-09-02 14:50:11 2024-09-02 14:54:56
2   2539 2024-09-02 14:54:34 2024-09-02 14:54:56
3   2539 2024-09-02 14:56:34 2024-09-02 14:56:38
Mittels

Code: Alles auswählen

melt()
dann in die passende Form gebracht

Code: Alles auswählen

df = EXAMPLE.copy()
a = df.melt(id_vars=['error'], value_vars=['start', 'end']).sort_values('value').set_index('value')
a = a.rename(columns={'variable': 'error_status'})
a.index.names = ['event']
a['error_status'] = a['error_status'].replace({'start': 1, 'end': 0})
Ergibt dann folgende Form:

Code: Alles auswählen

                     error  error_status
event                                   
2024-09-02 14:49:46   2589             1
2024-09-02 14:50:11   1223             1
2024-09-02 14:52:14   2589             0
2024-09-02 14:54:34   2539             1
2024-09-02 14:54:56   1223             0
2024-09-02 14:54:56   2539             0
2024-09-02 14:56:34   2539             1
2024-09-02 14:56:38   2539             0
Aus dieser, dann anhand der Beschreibung / Anweisung von Stackoverflow das erzeugt

Code: Alles auswählen

b = a.set_index('error', append=True).unstack().ffill().fillna(0)
b['total_error'] = b['error_status'].sum(axis=1)
Gibt dann folgende Form:

Code: Alles auswählen

                    error_status           total_error
error                       1223 2539 2589            
event                                                 
2024-09-02 14:49:46          0.0  0.0  1.0         1.0
2024-09-02 14:50:11          1.0  0.0  1.0         2.0
2024-09-02 14:52:14          1.0  0.0  0.0         1.0
2024-09-02 14:54:34          1.0  1.0  0.0         2.0
2024-09-02 14:54:56          0.0  0.0  0.0         0.0
2024-09-02 14:56:34          0.0  1.0  0.0         1.0
2024-09-02 14:56:38          0.0  0.0  0.0         0.0
Damit hätte man zumindest zu jedem vorhandenen Zeiteintrag den Status und auch die Summer aller Fehler. Über einen Resampler auf 1sec Intervall kann man dadurch dann auf jeden Zeit resamplen und dann im Gegenzug auf zB 30sec Intervalle zur vollen und halben Minute wechseln wenn man will ;)
Antworten