Seite 1 von 2

Pandas Zeit berechnen

Verfasst: Samstag 21. Januar 2023, 22:44
von rboelli
Hallo, ich möchte die Motorlaufzeit aus einer Fluglogdatei csv auswerten.
Die Daten werden jede sek geschrieben.

Das DataFrame sieht wie folgt aus
Time TQly Alt Curr Gas
0 11:53:41.770 100 2 0.1 -1024
1 11:53:42.500 100 2 0.1 -1024
2 11:53:43.500 100 2 0.1 -1024
3 11:53:44.500 100 3 0.1 492
4 11:53:45.500 100 3 1.6 1024
.........
979 12:10:00.950 100 2 0.1 479
980 12:10:01.950 100 2 0.1 482



Flugzeit und Motorlaufzeit und die Segelzeit habe ich wie folgt ermittelt.
code:
flugzeit = ( (df["Alt"] > 2) ).sum() # zählt zeilen wenn Curr > 1
print(f'Flugzeit : {flugzeit} sek ')

motorzeit = ((df["Curr"] > 1) & (df["Alt"] > 2)).sum() # zählt zeilen wenn Curr > 1
print(f' Motorlaufzeit : {motorzeit} sek ')

segelzeit = ((df["Curr"] <= 1) & (df["Alt"] > 2)).sum()
print(f'Segelzeit : {segelzeit} sek ')

ausgabe:
[981 rows x 5 columns]
Flugzeit : 976 sek
Motorlaufzeit : 102 sek
Segelzeit : 874 sek

Der Flug setzt sich aber aus mehreren Steigflüge (Motorlaufzeit) Curr > 1
und anschließenden Segelzeiten zusammen.

Ich würde gerne auswerten wie viele Steigflüge (Curr>1) und deren Dauer ermitteln.
Ebenso die die Höhendifferenz bei jedem Steigflug.

Kann mir jemand einen tipp geben, wie ich das mit Pandas ohne schleifen erreichen kann.?

Re: Pandas Zeit berechnen

Verfasst: Sonntag 22. Januar 2023, 10:37
von Sirius3
Der erste Schritt ist es, per diff den Übergang zwischen Motor- und Segelflug zu finden. Dann kannst Du über cumsum den einzelnen Phasen einen eindeutigen Index vergeben, nach dem Du gruppieren kannst, um Deine gewünschten Größen auszurechnen:

Code: Alles auswählen

df_flug = df[df["Alt"] > 2]
motor_an = df_flug["Curr"] > 1
uebergang = motor_an.astype(float).diff()
uebergang[0] = 0
phasen = abs(uebergang.astype(int)).cumsum()
gruppen = df_flog.groupby(phasen)
hoehendifferenz = gruppen.last()["Alt"] - gruppen.first()["Alt"]

Re: Pandas Zeit berechnen

Verfasst: Sonntag 22. Januar 2023, 15:31
von AIHelfer
Um die Anzahl der Steigflüge (Curr>1) und deren Dauer zu ermitteln, müssen Sie eine Gruppierung und Aggregation verwenden.

Code: Alles auswählen

df.groupby("Curr").agg({'Time':'count', 'Alt': 'max'}).loc[lambda df: df.Alt > 2]
ausgabe:
Time Alt
Curr
1.6 17 100
2.2 14 100
2.7 12 100
3.2 14 100
3.7 16 100
4.2 20 100
4.7 17 100
In obigem DataFrame können Sie die Anzahl der Steigflüge (Spalte Time) und die jeweilige maximale Höhe (Spalte Alt) pro Steigflug ermitteln.

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 08:17
von rboelli
Ok ,vielen dank, werde ich heute mal gleich ausprobieren.
In Pandas gibt es so viele Befehle, das ich den Wald vor lauter Bäume nicht sehe.
Liegt vielleicht am Alter >67

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 14:52
von rboelli
Soweit funktionier alles , bis auf die Zeile von AIHelfer.
df.groupby("Curr").agg({'Time':'count', 'Alt': 'max'}).loc[lambda df: df.Alt > 2]
Da bekomme ich keine sinnvolle werte raus.

code:
df_flug = df[df["Alt"] > 1]
motor_an = df_flug["Curr"] > 1
uebergang = motor_an.astype(float).diff()
uebergang[0] = 0
phasen = abs(uebergang.astype(float)).cumsum()
gruppen = df_flug.groupby(phasen)
hoehendifferenz = gruppen.last()["Alt"] - gruppen.first()["Alt"]
anzahl = df.groupby("Curr").agg({'Time': 'count', 'Alt': 'max'}).loc[lambda df: df.Alt > 1]

print(df.columns)

print("df_flug"),print(df_flug)
print("motor_an"),print (motor_an)
print("uebergang"),print(uebergang)
print("phasen"),print(phasen)
print("gruppe"),print (gruppen)
print("hoehendifferenz"),print(hoehendifferenz)

print("anzahl"),print(anzahl)

Ausgabe:
Index(['Time', 'Alt', 'Curr'], dtype='object')
df_flug
Time Alt Curr
2 11:53:43.500 2 0.1
3 11:53:44.500 3 10.1
4 11:53:45.500 15 20.6
5 11:53:46.500 20 56.8
6 11:53:47.500 25 55.5
7 11:53:48.500 30 53.5
8 11:53:49.500 28 0.8
9 11:53:50.500 26 0.1
10 11:53:51.500 24 0.4
11 11:53:52.500 22 0.5
12 11:53:53.500 20 50.7
13 11:53:54.500 25 50.2
14 11:53:55.500 30 43.4
15 11:53:56.500 35 43.2
16 11:53:57.500 28 0.7
17 11:53:58.500 26 0.1
motor_an
2 False
3 True
4 True
5 True
6 True
7 True
8 False
9 False
10 False
11 False
12 True
13 True
14 True
15 True
16 False
17 False
Name: Curr, dtype: bool
uebergang
2 NaN
3 1.0
4 0.0
5 0.0
6 0.0
7 0.0
8 -1.0
9 0.0
10 0.0
11 0.0
12 1.0
13 0.0
14 0.0
15 0.0
16 -1.0
17 0.0
0 0.0
Name: Curr, dtype: float64
phasen
2 NaN
3 1.0
4 1.0
5 1.0
6 1.0
7 1.0
8 2.0
9 2.0
10 2.0
11 2.0
12 3.0
13 3.0
14 3.0
15 3.0
16 4.0
17 4.0
0 4.0
Name: Curr, dtype: float64
gruppe
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001FE7FD09EE0>
hoehendifferenz
Curr
1.0 27
2.0 -6
3.0 15
4.0 -2
Name: Alt, dtype: int64
anzahl
Time Alt
Curr
0.1 5 26
0.4 1 24
0.5 1 22
0.7 1 28
0.8 1 28
10.1 1 3
20.6 1 15
43.2 1 35
43.4 1 30
50.2 1 25
50.7 1 20
53.5 1 30
55.5 1 25
56.8 1 20

Process finished with exit code 0

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 14:54
von __deets__
Ich bin mir nicht sicher, aber wenn AIHelfer nicht nur ein Spitzname, sondern Programm ist, dann versucht jemand, mit ChatGPT hier Antworten zu erzeugen. Auch die andere gegebene Antwort war subtil falsch. Ich wuerde darauf also *nicht* setzen. Ein weiterer Hinweis ist der ploetzlich andere Tonfall (Sie statt Du). Also eher mal mit Sirius3 Antwort auseinandersetzen.

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 15:54
von rboelli
ok, sind auch nur 2 Beiträge von AIHelfer
kann man so etwas nicht sperren??

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 16:02
von __deets__
Da ich noch nicht weiss, ob und was der User wirklich ist (kann auch ein "normaler" User sein), ist der nicht gesperrt. Das mag sich aendern, aber wenn ich hier jeden rauswerfe, der einen Fehler im Code postet, sieht's hier ziemlich oede aus. Unter anderem fliege ich selbst dann auch raus ;)

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 19:24
von rboelli
Hallo zusammen.
Die Differenz mit "Alt" funktionier
Die Differens mit "Time" leider nicht.

Time Alt Curr
3 11:53:44.500 3 10.1
4 11:53:45.500 15 20.6
5 11:53:46.500 20 56.8
6 11:53:47.500 25 55.5

df_flug = df[df["Alt"] > 2]
motor_an = df_flug["Curr"] > 1
uebergang = motor_an.astype(float).diff()
uebergang[0] = 0
phasen = abs(uebergang.astype(float)).cumsum()
gruppen = df_flug.groupby(phasen)
hoehendifferenz = gruppen.last()["Alt"] - gruppen.first()["Alt"]

hoehendifferenz = gruppen.last()["Alt"] - gruppen.first()["Alt"] # funktionier
zeitdifferenz = gruppen.last()["Time"] , gruppen.first()["Time"] # funktionier nicht

muss ich da noch was am format machen?

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 19:25
von rboelli
sorry
zeitdifferenz = gruppen.last()["Time"] - gruppen.first()["Time"] # funktionier nicht

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 20:04
von Sirius3
jetzt wäre es noch gut, zu wissen, wie die Fehlermeldung exakt lautet.

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 20:16
von rboelli
eine ganze reihe:
C:\Users\dell\anaconda3\envs\Python_PC_Programme\python.exe C:/eigeneProgramme/Python_PC_Programme/src/csv_Abfrage_04.py
Index(['Time', 'Alt(m)', 'Curr(A)'], dtype='object')
Traceback (most recent call last):
File "C:\Users\dell\anaconda3\envs\Python_PC_Programme\lib\site-packages\pandas\core\ops\array_ops.py", line 165, in _na_arithmetic_op
result = func(left, right)
File "C:\Users\dell\anaconda3\envs\Python_PC_Programme\lib\site-packages\pandas\core\computation\expressions.py", line 241, in evaluate
return _evaluate(op, op_str, a, b) # type: ignore[misc]
File "C:\Users\dell\anaconda3\envs\Python_PC_Programme\lib\site-packages\pandas\core\computation\expressions.py", line 70, in _evaluate_standard
return op(a, b)
TypeError: unsupported operand type(s) for -: 'str' and 'str'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\eigeneProgramme\Python_PC_Programme\src\csv_Abfrage_04.py", line 45, in <module>
zeitdifferenz = gruppen.last()["Time"] - gruppen.first()["Time"]
File "C:\Users\dell\anaconda3\envs\Python_PC_Programme\lib\site-packages\pandas\core\ops\common.py", line 72, in new_method
return method(self, other)
File "C:\Users\dell\anaconda3\envs\Python_PC_Programme\lib\site-packages\pandas\core\arraylike.py", line 110, in __sub__
return self._arith_method(other, operator.sub)
File "C:\Users\dell\anaconda3\envs\Python_PC_Programme\lib\site-packages\pandas\core\series.py", line 6259, in _arith_method
return base.IndexOpsMixin._arith_method(self, other, op)
File "C:\Users\dell\anaconda3\envs\Python_PC_Programme\lib\site-packages\pandas\core\base.py", line 1325, in _arith_method
result = ops.arithmetic_op(lvalues, rvalues, op)
File "C:\Users\dell\anaconda3\envs\Python_PC_Programme\lib\site-packages\pandas\core\ops\array_ops.py", line 226, in arithmetic_op
res_values = _na_arithmetic_op(left, right, op) # type: ignore[arg-type]
File "C:\Users\dell\anaconda3\envs\Python_PC_Programme\lib\site-packages\pandas\core\ops\array_ops.py", line 172, in _na_arithmetic_op
result = _masked_arith_op(left, right, op)
File "C:\Users\dell\anaconda3\envs\Python_PC_Programme\lib\site-packages\pandas\core\ops\array_ops.py", line 110, in _masked_arith_op
result[mask] = op(xrav[mask], yrav[mask])
TypeError: unsupported operand type(s) for -: 'str' and 'str'

Process finished with exit code 1


Muss ich den str erst umwandeln (und wie) oder gibt es ein Befehl 2 Zeiten von einander abziehen.

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 20:37
von Sirius3
Genau ungekehrt. Die entscheidende Zeile ist `TypeError: unsupported operand type(s) for -: 'str' and 'str'`. Du versuchst hier zwei Strings voneinander abzuziehen, was offensichtlich nicht funktionieren kann.
Beim Einlesen machst Du also schon den Fehler, die Zeiten nicht in das passende Format umzuwandeln.

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 21:57
von rboelli
ok ich ich habe mit pd.to datetime "Time" geändert
Eine zeitdifferenz funktioniert auch,
aber bei gruppe.last bekomme ich den fehler
TypeError: unsupported operand type(s) for -: 'str' and 'str'

df['Time'] = pd.to_datetime(df['Time']) # Funktioniert

print(df['Time'].max() - df['Time'].min()) # Funktioniert
print( gruppen.last()["Time"] - gruppen.first()["Time"] ) # Funktioniert nicht

Was muss ich eingeben das ich die beiden Zeiten subtrahieren kann.

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 21:59
von __deets__
gruppen ist ja auch nicht df.

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 22:09
von rboelli
und wie macht man es bei gruppen ???

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 22:20
von __deets__
Genauso wie bei df.

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 22:37
von rboelli
schön das wir das jetzt beide wissen.

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 22:52
von sparrow
@rboelli: Ich versuche das mal zu versinnbildlichen: Angenommen du fährst ein rotes und ein grünes Auto. Jetzt liegt Schnee und du kommst mit dem roten ins rutschen. Dann merkst du, dass Winterreifen helfen und ziehst da Winterreifen drauf. Das wird aber nicht dazu führen, dass das grüne Auto nicht auch ins rutschen kommt. Da müssen halt auch Winterreifen drauf.
Und da du das bei dem roten Auto erfolgreich gemach hast...

Re: Pandas Zeit berechnen

Verfasst: Montag 23. Januar 2023, 23:02
von __deets__
rboelli hat geschrieben: Montag 23. Januar 2023, 22:37 schön das wir das jetzt beide wissen.
Ja, dann wende dein Wissen doch mal konsequent an. Statt es eben nur einmal zu machen 🤷🏼‍♂️