如何用Pandas重塑CSV中堆叠格式的信号数据?
问题描述
现有一份逗号分隔的CSV文件,数据以两列堆叠形式存储,每个信号的数据块之间用空行分隔。部分信号包含Timestamp-Value形式的时序数据,部分无有效数值;实际场景中不同信号的时间戳可能不完全一致。需要用Pandas将其转换为以Timestamp为索引、各信号为列的标准DataFrame,期望输出格式如下:
Timestamp SignalName3 SignalName4 SignalName6 SignalName7 0 10/4/2023 15:36:43.757193 13 131 9867 nan 1 10/4/2023 15:36:43.757194 nan nan nan 98670 2 10/4/2023 15:36:43.829083 14 238 1257 nan 3 10/4/2023 15:36:43.829084 nan nan nan 12570 4 10/4/2023 15:36:43.895651 17 413 5736 nan 5 10/4/2023 15:36:43.895652 nan nan nan 57360 6 10/4/2023 15:36:43.931145 11 689 4935 nan 7 10/4/2023 15:36:43.931146 nan nan nan 49350
解决方案
步骤1:读取CSV并拆分数据块
先按行加载文件内容,过滤空行后,根据信号名称行(无逗号的行)拆分出每个信号对应的数据块。
步骤2:解析单个信号的时序数据
对每个数据块,提取信号名称,逐行解析Timestamp和Value,将无效数值转为pd.NA,并转换为带时间戳索引的DataFrame。
步骤3:合并所有信号数据
将所有信号的DataFrame按Timestamp做外连接,得到标准格式的结果。
完整代码示例
import pandas as pd # 读取CSV文件,过滤空行 with open('your_data.csv', 'r') as f: lines = [line.strip() for line in f if line.strip()] # 拆分各信号的数据块 blocks = [] current_block = [] for line in lines: # 假设信号名称为无逗号的单独行,可根据实际格式调整判断逻辑 if ',' not in line: if current_block: blocks.append(current_block) current_block = [] current_block.append(line) else: current_block.append(line) if current_block: blocks.append(current_block) # 解析每个数据块为DataFrame signal_dfs = [] for block in blocks: signal_name = block[0] data_rows = [] for row in block[1:]: ts_str, val_str = row.split(',', 1) # 处理无效数值 try: value = float(val_str) except ValueError: value = pd.NA data_rows.append({'Timestamp': ts_str, signal_name: value}) # 转换时间戳并设置索引 df = pd.DataFrame(data_rows) df['Timestamp'] = pd.to_datetime(df['Timestamp']) signal_dfs.append(df.set_index('Timestamp')) # 合并所有信号的DataFrame final_df = pd.concat(signal_dfs, axis=1).reset_index() # 输出结果 print(final_df)
关键说明
- 若信号名称格式不同(比如带逗号),需调整数据块拆分的判断逻辑。
- 时间戳解析可通过
pd.to_datetime()的format参数指定格式,确保解析准确。 - 无效数值的处理逻辑可根据实际数据情况修改(比如空字符串直接设为
pd.NA)。
内容的提问来源于stack exchange,提问作者Hannibal
相关产品推荐
相关产品推荐

