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.?
Pandas Zeit berechnen
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"]
Um die Anzahl der Steigflüge (Curr>1) und deren Dauer zu ermitteln, müssen Sie eine Gruppierung und Aggregation verwenden.
ausgabe:
Code: Alles auswählen
df.groupby("Curr").agg({'Time':'count', 'Alt': 'max'}).loc[lambda df: df.Alt > 2]
In obigem DataFrame können Sie die Anzahl der Steigflüge (Spalte Time) und die jeweilige maximale Höhe (Spalte Alt) pro Steigflug ermitteln.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
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
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
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.
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 

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?
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?
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.
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.
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.
Beim Einlesen machst Du also schon den Fehler, die Zeiten nicht in das passende Format umzuwandeln.
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.
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.
@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...
Und da du das bei dem roten Auto erfolgreich gemach hast...