Importar Excel en Matlab de forma eficiente

Publicado el 16 febrero 2022 por Daniel Rodríguez @analyticslane

En 2019 Matlab introdujo las funciones read*() para facilitar la importación de datos desde archivos, como puede ser en caso de CSV o Microsoft Excel. Por lo que se puede emplear para reemplazar a las antiguas csvread() y xlsread(), evitando además la necesidad de disponer de una versión de Excel instalada en el equipo para poder trabajar con este tipo de archivos, algo que se nota especialmente en las versiones de Linux y Mac. Aún así, en el caso de que se desee actualizar código antiguo para trabajar con archivos Excel en Matlab de forma eficiente es necesario tener en cuenta algunos cambios que introducen las nuevas versiones.

Importar Excel en Matlab en versiones anteriores

Antes de 2019, la función que se debía utilizar para importar archivos Excel en Matlab es usar la función xlsread(). Una función que como primer parámetro recibía la ruta al archivo y, de forma opcional, el nombre de la hoja que se desea importar. Importando el contenido de la primera hoja cuando no se indicaba el nombre de una. Devolviendo como resultado hasta cuatro variables: el contenido de las casillas numéricas en una matriz, el resultado de las casillas de texto en una celda, el resultado de todas las casillas en una celda y los resultados de la función de procesado en caso de que se indique una. Por eso lo más habitual era usar esta función en el caso de que solamente se necesitasen los datos numéricos como

data = xlsread('data.xlsx');

Algo que se puede reemplazar en la mayoría de los casos por lo siguiente:

data = readmatrix('data.xlsx');

Aunque, en mi experiencia, era más habitual usar el tercer resultado ya que también incluye el contenido de otras celdas como nombres o fechas.

[~, ~, data] = xlsread('data.xlsx');

Lo que se puede reemplazar básicamente por la siguiente instrucción:

data = readcell('data.xlsx');

Ventajas de trabajo con readcell() frente a xlsread()

El hecho de cambiar xlsread() por readcell() tiene algunas ventajas adicionales con algunos tipos de datos. Ahora las nuevas funciones procesan de una forma más eficiente algunos tipos de datos, como las fechas o los valores faltantes.

Importación de las fechas

Una de las ventajas que ofrece la función readcell() frente a xlsread() es que el contenido de las casillas con fecha se importan como un objeto, no como una cadena de texto. Lo que simplifica trabajar con este tipo de datos. Ahora no es necesario identificar las celdas que contienen fechas y procesar primero las cadenas de texto, con los problemas que esto podía traer debido a los diferentes formatos existentes.

Aunque, en el caso de que los datos se desean procesar con código legado esto puede suponer un problema, ya que ese esperara una cadena de texto. Algo que se puede solucionar asignando a la propiedad 'DatetimeType' el valor 'Text'. Al hacer esto se replica el comportamiento de la con las fechas de la función xlsread().

Valores missing

Otra de las ventajas que ofrece la función readcell() es poder diferenciar entre valores nulos y vacíos ( NaN y missing). Los cuales no se podían diferencia en xlsread(), en ambos casos se obtiene como respuesta NaN, y suelen tener un significado diferente a la hora de analizar los datos.

Al igual que el caso de las fechas esto puede provocar fallos al trabajar con código legado que no tendrá en cuenta la posible existencia de valores missing. Un valor que se introdujo en el 2013. En este caso no existe un parámetro, por lo que será necesario reemplazar los valores missing con NaN, algo que se puede hacer simplemente con

data(cellfun(@ismissing, data)) = {NaN};

Conclusiones

En esta ocasión se ha visto las ventajas que ofrecen las funciones readmatrix() y readcell() frente a xlsread() para importar datos. Unas ventajas que permiten trabajar con archivos de Microsoft Excel en Matlab de forma eficiente. Además, también hemos visto cómo se puede configurar estas nuevas funciones para replicar los resultados de las anteriores, algo útil cuando se tiene que mantener código legado.

Image by ELG21 from Pixabay