Re: Aus einer Excel-Datei mit Python bestimmte Zeile ausgeben lassen
Verfasst: Dienstag 27. September 2022, 13:48
Der Code ist in Teilen nun wie folgt:
Darin kann ich unten mit dem kleinen Teil mit der Zahl (in diesem Fall 2) den gewollten Zeitstempel wählen.
Als Ausgabe bekomme ich dann die zugehörigen Daten, wenn der Timestamp zum ersten mal erreicht ist:
Darin sind also alle Werte aus dem Tuple, wenn der Wert 2 zum ersten mal überschritten wird.
Problem ist nur wie gesagt, dass sozusagen jede Datenserie nicht gleichzeitig bei 0s beginnt, sondern fortlaufend später. Bei 5: Parameter ist der timestamp zB 11.244567. Dies ist allerdings der Startwert, da die Daten in dieser Spalte erst zu dieser zeit beginnen.
Der Grenzwert des timestamp soll demzufolge nicht immer genau bei 2s liegen, sondern ab Beginn des ersten Wertes 2s betragen. Demzufolge Startwert+2s und dann die entsprechenden zugehörigen Parameter des Tuple anzeigen.
Code: Alles auswählen
import sys
!{sys.executable} -m pip install prettyprinter
from collections import namedtuple
from contextlib import closing
import openpyxl
from more_itertools import first_true, grouper
from prettyprinter import cpprint
Item = namedtuple("Parameter", "x y v atan alat timestamp")
Project = namedtuple("Trajektorie", "ID items")
def create_from_column(column_values):
column_values = iter(column_values)
return Project(
next(column_values),
[Item(*group) for group in grouper(column_values, 6, "strict")],
)
def load_excel(file_path):
with closing(openpyxl.open(file_path)) as workbook:
return list(
map(
create_from_column,
workbook.worksheets[0].iter_cols(min_col=2, values_only=True),
)
)
def search_item(project, min_timestamp):
return first_true(
project.items, None, lambda project: project.timestamp > min_timestamp
)
def main():
projects = load_excel("Test.xlsx")
cpprint(projects)
print("-" * 70)
for project in projects:
print(project.ID, ":", search_item(project, 2))
if __name__ == "__main__":
main()
Code: Alles auswählen
search_item(project, 2))
Als Ausgabe bekomme ich dann die zugehörigen Daten, wenn der Timestamp zum ersten mal erreicht ist:
Code: Alles auswählen
1 : Parameter(x=410574.85, y=5653917.24, v=0.0083, atan=0.0111, alat=-0.0492, timestamp=2.002)
2 : Parameter(x=410576.27, y=5653912.7, v=14.059, atan=-1.0263, alat=1.3111, timestamp=2.002)
3 : Parameter(x=410570.81, y=5653915.15, v=1.5975, atan=-0.6558, alat=-0.0103, timestamp=2.002)
4 : Parameter(x=410568.75, y=5653895.86, v=15.2532, atan=-0.3959, alat=0.024, timestamp=2.002)
5 : Parameter(x=410584.78, y=5653915.04, v=26.8599, atan=0.7595, alat=0.0988, timestamp=11.244567)
6 : Parameter(x=410527.93, y=5653907.68, v=29.8087, atan=-0.5317, alat=0.0409, timestamp=16.4164)
7 : Parameter(x=410568, y=5653884.21, v=21.9894, atan=-0.5353, alat=-0.6291, timestamp=18.852167)
8 : Parameter(x=410568.28, y=5653884.21, v=33.1464, atan=-0.584, alat=-0.4838, timestamp=27.6276)
9 : Parameter(x=410568.38, y=5653884.26, v=25.5369, atan=-0.5661, alat=-0.5998, timestamp=29.763067)
10 : Parameter(x=410568.13, y=5653922.85, v=5.298, atan=0.0337, alat=-0.0164, timestamp=37.9379)
Problem ist nur wie gesagt, dass sozusagen jede Datenserie nicht gleichzeitig bei 0s beginnt, sondern fortlaufend später. Bei 5: Parameter ist der timestamp zB 11.244567. Dies ist allerdings der Startwert, da die Daten in dieser Spalte erst zu dieser zeit beginnen.
Der Grenzwert des timestamp soll demzufolge nicht immer genau bei 2s liegen, sondern ab Beginn des ersten Wertes 2s betragen. Demzufolge Startwert+2s und dann die entsprechenden zugehörigen Parameter des Tuple anzeigen.