我们可以将第 0-32 行合并到带有关键点的单行中,并添加可被 33(关键点数量)整除的时间戳吗?

问题描述 投票:0回答:1

这是我的代码的输出

代码的输出

共有33个关键点,其中包括

body_pose = ['NOSE', 'LEFT_EYE_INNER', 'LEFT_EYE', 'LEFT_EYE_OUTER', 'RIGHT_EYE_INNER', 'RIGHT_EYE', 'RIGHT_EYE_OUTER', 'LEFT_EAR', 'RIGHT_EAR', 'MOUTH_LEFT', 'MOUTH_RIGHT',
              'LEFT_SHOULDER', 'RIGHT_SHOULDER', 'LEFT_ELBOW', 'RIGHT_ELBOW', 'LEFT_WRIST', 'RIGHT_WRIST', 'LEFT_PINKY', 'RIGHT_PINKY', 'LEFT_INDEX', 'RIGHT_INDEX', 'LEFT_THUMB',
              'RIGHT_THUMB', 'LEFT_HIP', 'RIGHT_HIP', 'LEFT_KNEE', 'RIGHT_KNEE', 'LEFT_ANKLE', 'RIGHT_ANKLE', 'LEFT_HEEL', 'RIGHT_HEEL', 'LEFT_FOOT_INDEX', 'RIGHT_FOOT_INDEX']

问题是名称

NOSE_x
NOSE_y
NOSE_z
存储在第 0 行 -> 正确

但是下一个周期

LEFT_EYE_INNER_x
LEFT_EYE_INNER_y
LEFT_EYE_INNER_z
存储在第1行 -> 错误,因为它们应该存储在第0行的数字0中,

等等

如何将其合并为一排?

这里是我的附加数据代码并将其保存为Excel格式

    def save_data_to_excel(self):
        data_dict = {pose_type: [] for pose_type in ['pose', 'right_hand', 'left_hand']}
        for pose_type, pose_data in self.alldata:
            for idx, (key, value) in enumerate(pose_data.items()):
                # Append timestamp along with position data
                timestamp = datetime.now().strftime("%H:%M:%S.%f")
                key_suffix = ['X', 'Y', 'Z']
                data_dict[pose_type].append({**{'Number': idx, 'Timestamp': timestamp}, **{f'{key}_{key_suffix[i]}': val for i, val in enumerate(value)}})
                #data_row = [idx, timestamp] + [{f'{key}_{key_suffix[i]}': val for i, val in enumerate(value)}]
                #data_dict[pose_type].append(data_row)

        with pd.ExcelWriter('koordinat.xlsx') as writer:
            for pose_type, data in data_dict.items():
                df = pd.DataFrame(data)
                df.to_excel(writer, sheet_name=pose_type, index=False)

我期望的输出是 33 个关键点和可被 33 整除的时间戳存储在每一行的数字 0、数字 1、数字 2 等位置

访问 Excel 文件的链接:https://docs.google.com/spreadsheets/d/12taz4_8HV8865D80kkEHqEFw3U6o4pZp/edit?rtpof=true&sd=true

python python-3.x pandas excel csv
1个回答
0
投票

我会使用

csv
包并一次读取一行来累积结果。当您看到包含
NOSE_x
数据的行时,这是一个信号,表明您正在开始一个新的最终结果行,并且允许您开始合并最终结果行的数据。

请注意,此示例使用

io.StringIO()
来模拟
open()
,我将打印结果而不是将它们写入文件。我认为您可能可以处理读取和写入文件的问题。

import io ## we will simulate open with io.StringIO()
import csv

raw_data = """
"Timestamp","NOSE_x","NOSE_y","NOSE_z","MOUTH_x","MOUTH_y","MOUTH_z"
1.1,1,2,3,,,
2.2,,,,4,5,6
10.1,10,20,30,,,
20.2,,,,40,50,60
""".strip()

results = []
with io.StringIO(raw_data) as file_in:
    reader = csv.DictReader(file_in)
    for row in reader:
        if row.get("NOSE_x"): # we have a starting result row
            result = {}

        for key, value in row.items():
            if value:
                result[key] = value

        if row.get("MOUTH_z"): # we have a final result row
            results.append(result)

for result in results:
    print(result)

这应该给你:

{'Timestamp': '2.2', 'NOSE_x': '1', 'NOSE_y': '2', 'NOSE_z': '3', 'MOUTH_x': '4', 'MOUTH_y': '5', 'MOUTH_z': '6'}
{'Timestamp': '20.2', 'NOSE_x': '10', 'NOSE_y': '20', 'NOSE_z': '30', 'MOUTH_x': '40', 'MOUTH_y': '50', 'MOUTH_z': '60'}
© www.soinside.com 2019 - 2024. All rights reserved.