Pandas Zeit berechnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
rboelli
User
Beiträge: 15
Registriert: Mittwoch 18. Januar 2023, 12:02

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.?
Sirius3
User
Beiträge: 18275
Registriert: Sonntag 21. Oktober 2012, 17:20

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"]
AIHelfer
User
Beiträge: 2
Registriert: Sonntag 22. Januar 2023, 15:24

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.
rboelli
User
Beiträge: 15
Registriert: Mittwoch 18. Januar 2023, 12:02

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
rboelli
User
Beiträge: 15
Registriert: Mittwoch 18. Januar 2023, 12:02

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
rboelli
User
Beiträge: 15
Registriert: Mittwoch 18. Januar 2023, 12:02

ok, sind auch nur 2 Beiträge von AIHelfer
kann man so etwas nicht sperren??
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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 ;)
rboelli
User
Beiträge: 15
Registriert: Mittwoch 18. Januar 2023, 12:02

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?
rboelli
User
Beiträge: 15
Registriert: Mittwoch 18. Januar 2023, 12:02

sorry
zeitdifferenz = gruppen.last()["Time"] - gruppen.first()["Time"] # funktionier nicht
Sirius3
User
Beiträge: 18275
Registriert: Sonntag 21. Oktober 2012, 17:20

jetzt wäre es noch gut, zu wissen, wie die Fehlermeldung exakt lautet.
rboelli
User
Beiträge: 15
Registriert: Mittwoch 18. Januar 2023, 12:02

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.
Sirius3
User
Beiträge: 18275
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
rboelli
User
Beiträge: 15
Registriert: Mittwoch 18. Januar 2023, 12:02

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

gruppen ist ja auch nicht df.
rboelli
User
Beiträge: 15
Registriert: Mittwoch 18. Januar 2023, 12:02

und wie macht man es bei gruppen ???
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Genauso wie bei df.
rboelli
User
Beiträge: 15
Registriert: Mittwoch 18. Januar 2023, 12:02

schön das wir das jetzt beide wissen.
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

@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...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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 🤷🏼‍♂️
Antworten