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.