该程序目的,解析canape录取的mf4文件,按照信号名称和时间戳将全部数据统计到excel中
from asammdf import MDF
f = r"C:\Users\calmcar\Desktop\ToCC\blf\log\yaxonRecorder_2025-04-30_10-27-11.mf4"
save_excel_path = r"C:\Users\calmcar\Desktop\ToCC\blf\report\signal1.xlsx"
mdf = MDF(f)
print(mdf.virtual_groups) # 获取channel-group信息类型是字典
# 下两个for循环只为了解一些函数的用法,以及一些值的定义,方便使用
for group_index, (virtual_group_index, virtual_group) in enumerate(mdf.virtual_groups.items()): # enumerate将一个可遍历数据类型
print(group_index) # 通过函数enumerate产生的数据位置索引
print(virtual_group_index) # 获取了channel-group的索引
print(virtual_group) # 获取了channel-gropu的信息VirtualChannelGroup(groups=[0], records_size=16, cycles_nr=0
print(mdf.included_channels(virtual_group_index)) # 获取channels信息 类型嵌套字典
print(mdf.included_channels(virtual_group_index)[virtual_group_index]) # 获取channels信息,字典
for gp_index, channel_indexes in mdf.included_channels(virtual_group_index)[virtual_group_index].items():
print(gp_index) # 获取了channel-group-index
print(channel_indexes) # 获取了channel-group下channels的个数
print(mdf.masters_db.get(gp_index, None))
max = 0
name = ""
for group_index, (virtual_group_index, virtual_group) in enumerate(mdf.virtual_groups.items()):
if virtual_group.cycles_nr == 0:
continue
channels = [
(None, gp_index, ch_index)
for gp_index, channel_indexes in mdf.included_channels(
virtual_group_index
)[virtual_group_index].items()
for ch_index in channel_indexes
if ch_index != mdf.masters_db.get(gp_index, None)
]
print(channels)
for signal in mdf.select(channels, raw=True, copy_master=False, validate=False):
# print(signal)
if len(signal.samples) > max:
print(len(signal.samples))
max = len(signal.samples)
name = signal.name
mdf1 = mdf.resample(raster=name)
df1 = mdf1.to_dataframe()
print(df1)
df1.to_excel(save_excel_path)
- python中需要引用MDF库
from asammdf import MDF
mdf文件一般是用channel和channel group组织的,一个文件可能包含多个chnannel-group,一个channel-group也可以包含多个channel,channel和signal一一对应,channel保存了一些描述信息,数据和时间戳保存在signal里
2. 创建MDF对象,对mdf文件进行数据操作
f = r"C:\Users\calmcar\Desktop\Recorder_2020-04-30_10-27-11.mf4"
mdf = MDF(f)
- 获取channel-group信息 类型是字典
print(mdf.virtual_groups)
# 输出
{0: VirtualChannelGroup(groups=[0], records_size=16, cycles_nr=0),
1: VirtualChannelGroup(groups=[1], records_size=9, cycles_nr=46052), 2: VirtualChannelGroup(groups=[2], records_size=9, cycles_nr=46097), 3: VirtualChannelGroup(groups=[3], records_size=14,cycles_nr=46097),
4: VirtualChannelGroup(groups=[4], records_size=14,cycles_nr=46097),
5: VirtualChannelGroup(groups=[5], records_size=16,cycles_nr=46097),}
- 通过函数enumerate产生的数据位置索引
for group_index, (virtual_group_index, virtual_group) in enumerate(mdf.virtual_groups.items()):
print(group_index)
# 输出
0
1
2
3
4
5
- 获取channel-group的索引
print(virtual_group_index)
# 输出
0
1
2
3
4
5
- 获取channel-gropu的信息VirtualChannelGroup(groups=[0], records_size=16, cycles_nr=0
print(virtual_group)
# 输出
VirtualChannelGroup(groups=[0], records_size=16, cycles_nr=0)
VirtualChannelGroup(groups=[1], records_size=9, cycles_nr=46052)
VirtualChannelGroup(groups=[2], records_size=9, cycles_nr=46097)
VirtualChannelGroup(groups=[3], records_size=14, cycles_nr=46097)
VirtualChannelGroup(groups=[4], records_size=14, cycles_nr=46097)
VirtualChannelGroup(groups=[5], records_size=16, cycles_nr=46097)
- 获取channel信息 类型嵌套字典
print(mdf.included_channels(virtual_group_index))
# 输出
{0: {0: [1]}}
{1: {1: [1, 2]}}
{2: {2: [1, 2]}}
{3: {3: [1, 2, 3, 4]}}
{4: {4: [1, 2, 3, 4]}}
{5: {5: [1, 2, 3, 4, 5, 6, 7]}}
- 获取channel信息,类型字典
print(mdf.included_channels(virtual_group_index)[virtual_group_index])
# 输出
{0: [1]}
{1: [1, 2]}
{2: [1, 2]}
{3: [1, 2, 3, 4]}
{4: [1, 2, 3, 4]}
{5: [1, 2, 3, 4, 5, 6, 7]}
- 获取channel-group-index
print(gp_index)
# 输出
0
1
2
3
4
5
- 获取channel-group下channels的个数
print(channel_indexes)
# 输出
[1]
[1, 2]
[1, 2]
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4, 5, 6, 7]
- 获取所有signal的channel-index,signal-index,用来确认信号的位置
channels = [
(None, gp_index, ch_index)
for gp_index, channel_indexes in mdf.included_channels(
virtual_group_index
)[virtual_group_index].items()
for ch_index in channel_indexes
if ch_index != mdf.masters_db.get(gp_index, None)
]
- 通过select从mdf中按照位置锁定signal
for signal in mdf.select(channels, raw=True, copy_master=False, validate=False):
- 选择最大的采样长度,用以重采样其他信号,使得函数to_dataframe()可以正常使用
if len(signal.samples) > max:
print(len(signal.samples))
max = len(signal.samples)
name = signal.name
- resample函数可以通过信号名称来确定采样率
mdf1 = mdf.resample(raster=name)
- 使用函数to_dataframe()来将mdf数据以新的采样率重新排版数据
df1 = mdf1.to_dataframe()
- 保存到excel
df1.to_excel(save_excel_path)


发布评论