求助:用Python实现CAN总线日志按秒分组并转宽表格式
处理CAN总线CSV日志的Python实现
先看个原始CSV的例子,方便理解转换逻辑:
原始日志示例:
Timestamp,Can ID,data,datalength
2024-05-20 12:00:01,0x123,010203,6
2024-05-20 12:00:01,0x456,0405,4
2024-05-20 12:00:02,0x123,060708,6
2024-05-20 12:00:02,0x789,09,2
下面是直接能用的Python代码,用Pandas完成转换:
import pandas as pd # 读取原始CAN日志CSV,记得把文件名换成你自己的 df = pd.read_csv('can_log.csv', parse_dates=['Timestamp']) # 核心转换:把Timestamp设为行,Can ID设为列,填充对应data值 # 要是同一秒同一个Can ID有多条数据,这里用'last'取最后一条,按需换成'first'取第一条 pivoted_df = df.pivot_table( index='Timestamp', columns='Can ID', values='data', aggfunc='last' ) # 把Timestamp从索引转成普通列(可选,不想转就删掉这行) pivoted_df = pivoted_df.reset_index() # 把缺失值换成空字符串(可选,默认是NaN,觉得看着别扭就加这行) pivoted_df = pivoted_df.fillna('') # 保存成新的CSV文件,文件名自己改 pivoted_df.to_csv('formatted_can_log.csv', index=False)
关键步骤说明
parse_dates=['Timestamp']:确保时间戳被正确识别为日期格式,避免后续转换出问题pivot_table:这一步是核心,帮你把行和列重新排列,aggfunc用来处理重复数据,比如同一秒同一ID有多个data的情况,选合适的聚合方式就行fillna(''):把没有数据的单元格换成空字符串,比默认的NaN看着清爽
内容的提问来源于stack exchange,提问作者Mechnanic_programmer
相关产品推荐
相关产品推荐

