该程序目的,解析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)
  1. 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)
  1. 获取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),}
  1. 通过函数enumerate产生的数据位置索引
for group_index, (virtual_group_index, virtual_group) in enumerate(mdf.virtual_groups.items()):    
    print(group_index)
# 输出
0
1
2
3
4
5
  1. 获取channel-group的索引
 print(virtual_group_index)
# 输出
0
1
2
3
4
5
  1. 获取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)
  1. 获取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]}}
  1. 获取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]}
  1. 获取channel-group-index
print(gp_index)
# 输出
0
1
2
3
4
5
  1. 获取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]
  1. 获取所有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)  
]
  1. 通过select从mdf中按照位置锁定signal
for signal in mdf.select(channels, raw=True, copy_master=False, validate=False):
  1. 选择最大的采样长度,用以重采样其他信号,使得函数to_dataframe()可以正常使用
if len(signal.samples) > max:  
    print(len(signal.samples))  
    max = len(signal.samples)  
    name = signal.name
  1. resample函数可以通过信号名称来确定采样率
mdf1 = mdf.resample(raster=name)
  1. 使用函数to_dataframe()来将mdf数据以新的采样率重新排版数据
df1 = mdf1.to_dataframe()
  1. 保存到excel
df1.to_excel(save_excel_path)