def select(self, channels, dataframe=False):
""" return the channels listed in *channels* argument
Parameters
----------
channels : list
list of channel names to be filtered
dataframe: bool
return a pandas DataFrame instead of a list of Signals; in this
case the signals will be interpolated using the union of all
timestamps
Returns
-------
signals : list
lsit of *Signal* objects based on the input channel list
"""
# group channels by group index
gps = {}
for ch in channels:
if ch in self.channels_db:
for group, index in self.channels_db[ch]:
if group not in gps:
gps[group] = []
gps[group].append(index)
else:
message = ('MDF filter error: '
'Channel "{}" not found, it will be ignored')
warn(message.format(ch))
continue
# append filtered channels to new MDF
signals = {}
for group in gps:
grp = self.groups[group]
data = self._load_group_data(grp)
for index in gps[group]:
signal = self.get(group=group, index=index, data=data)
signals[signal.name] = signal
signals = [signals[channel] for channel in channels]
if dataframe:
times = [s.timestamps for s in signals]
t = reduce(np.union1d, times).flatten().astype(np.float64)
signals = [s.interp(t) for s in signals]
times = None
pandas_dict = {'t': t}
for sig in signals:
pandas_dict[sig.name] = sig.samples
signals = DataFrame.from_dict(pandas_dict)
return signals
评论列表
文章目录