Source code for toto.inputs.mat

"""Read MATLAB file
    This import mat file. This class returns a Panda Dataframe with some extra attributes such as Latitude,Longitude,Units.
    
    Parameters
    ~~~~~~~~~~

    filename : (files,) str or list_like
        A list of filename to process.

    Notes
    -----

    The file MUST contain a variable called `time`, `t` or `timestamp` with matlab datenum time steps

    Examples
    ~~~~~~~~

    >>> from toto.inputs.mat import MATfile
    >>> nc=MATfile('filename.mat')._toDataFrame()
"""
import glob,os,sys
import pandas as pd

from scipy.io import loadmat
import numpy as np
import datetime as dt

TIMES=['t','time','timestamp']

[docs]def matlab2datetime(matlab_datenum): day = dt.datetime.fromordinal(int(matlab_datenum)) dayfrac = dt.timedelta(days=matlab_datenum%1) - dt.timedelta(days = 366) return day + dayfrac
[docs]class MATfile():
[docs] @staticmethod def defaultExtensions(): return ['.mat']
def __init__(self,filenames): if isinstance(filenames,str): filenames=[filenames] self.filenames=filenames self.data=[] # READ self._reads_mat() def _reads_mat(self): for file in self.filenames: self._read_mat(file) def _read_mat(self,filename): mat = loadmat(filename) # load mat-file columns=[key for key in mat.keys() if not key.startswith('_')] columns_lower=[col.lower() for col in columns] df = pd.DataFrame(np.vstack([mat[c].flatten() for c in columns]).T,columns=columns) time_col_name=False for time_name in TIMES: if time_name in columns_lower: time_col_name=columns[columns_lower.index(time_name)] continue if not time_col_name: print('Time variable could not be found') sys.exit(-1) df.rename(columns={time_col_name:'time'},inplace=True) time=[matlab2datetime(tval) for tval in df['time']] df['time']=time df.set_index('time',inplace=True,drop=False) self.data.append(df) def _toDataFrame(self): return self.data
if __name__ == '__main__': MATfile('../../../test/test.mat')