You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:30:10