viernes, 6 de agosto de 2021

Importación de fechas en formato Americano en Microsoft Excel mediante Power Query.

Repetimos la importación en Microsoft Excel, del listado de fechas en formato Americano pero en esta ocasión a través de Power Query.

Seleccionamos importar CSV.


Al tratarse de un fichero txt, no se muestra, además no existe el filtro para txt.

Podemos o seleccionar el filtro para todos los archivos, o escribir en el cuadro de texto del nombre del fichero el nombre con comodines, tal que así *.txt y pulsar Enter.

Ahora ya se muestran todos los ficheros txt.

Seleccionamos el que nos interesa y pulsamos el botón Abrir.


Al abrirse la ventana de importación vemos que se reconocen todas las fechas.

Cargamos.los.dstos a Microsoft Excel.


Vemos que se han importado los 102 registros.


Aparentemente está correcto.

Sim embargo la alineación es a la izquierda.


Si aplicamos un filtro vemos que las fechas no se acumularon.

En Power Query, con la confirmación por defecto, se importarán todas las fechas como texto.

Esto se debe a que Power Query analiza las mil primeras filas para decidir el tipo de datos.

jueves, 5 de agosto de 2021

Corrección de fechas importadas desde formato MMDDAAAA en hoja de cálculo

Si una de las peores cosas que nos puede pasar en una hoja de cálculo como Mícrosoft Excel es importar incorrectamente las fechas en formato Americano MMDDAAAA, como formato Europeo.

Peor es aún recibir un listado ya importado y no tener acceso a los datos originales para realizar una reimportación.

Hoy os mostraré un método para solucionarlo mediante fórmulas.

Mañana veremos un método mucho más rápido, pero el de hoy no permite ver la aplicación de algunas fórmulas.

La solución será la fórmula que muestro en la imagen, sin embargo vamos a desarrollarla y explicarla paso a paso.



Lo primero que debemos tener claro es que nos enfrentamos a una columna con una mezcla de textos y números, dependiendo de si la hoja de cálculo ha reconocido la fecha (en cuyo caso se comportará como un número) o si no la ha reconocido (en este caso simplemente se tratará como un texto).

Podemos verlo claramente si ampliamos el ancho de la columna, en este caso se alinearán a la derecha los datos reconocidos como fechas y a la izquierda los que no.

Si aplicamos un filtro veremos que algunos datos no se acumulan, son los que no se han reconocido como fechas.


La primera aproximación parece extraer los datos de Meses, Días y Años de la cadena de texto y luego concatenarlos en el orden correcto.

Para extraer el día, usamos la función extrae.

=EXTRAE(A2;4;2")


Pero al intentar extraer el mes de la primera fecha el dato obtenido no se corresponde con el mes.


Si arrastramos la fórmula a todas las filas, vemos que algunas si coinciden, en concreto las que están alineadas a la izquierda.


Si cambiamos el formato de los datos de la columna a Número, tendremos una pista de que está pasando.


Ahora vemos que los datos extraídos se corresponden con la fecha en formato número.


Para hacer lo que deseamos, el primer paso será partir de un tipo de datos comunes.

Para ello, vamos a pasar todos los datos a formato texto usando la función texto.

=TEXTO(A2;"DD/MM/AAAA")


Al ver el resultado de la fórmula, parece que nada a pasado, pero podemos ver que ahora ha cambiado la alineación.


Ahora toda la columna se muestra, por defecto, alineada a la izquierda, esto demuestra que ahora todos los datos son textos.


Ahora que todos los datos son del mismo tipo, podemos usar las funciones de texto para obtener días, meses y años.

Para ello usaremos las funciones Extrae, Izquierda y Derecha.


Concatenamos los datos, sin olvidar incluir los separadores, en este caso la barra.

=EXTRAE(B2;4;2)&"/"&IZQUIERDA(B2;2)&"/"&DERECHA(B2;4)


Ahora vemos que el mes y el año han intercambiado posición.


Incluso para las fechas que no se habían reconocido.


Sin embargo si aplicamos un filtro, vemos que los datos no se acumulan.

Esto nos da una pista de que lo que estamos tratando para la hoja de cálculo (Microsoft Excel, Libreoffice Calc o Google Sheets) está tratando las fechas como textos.

Aprovecharemos la función Valor para convertir el texto en su valor numérico.


Usando valor, obtenemos un número que representa la fecha. 

=VALOR(C2)


Como ya explicamos, las hojas de cálculo representan las fechas con un número que indica el número de días que han pasado desde una fecha de origen, usualmente el 01/01/1900. 

Cambiamos el formato de la columna a fecha corta para ver los datos en el formato deseado.


Finalmente obtenemos las fechas en el formato correcto.


Para confirmarlo, aplicamos un filtro y comprobamos que, ahora si, todos lo datos se agrupan en años y meses correctamente.


Este proceso se ha realizado en tres pasos.



Pero puede resumirse en un único paso.



En este caso se pueden agrupar todos los pasos en uno solo.

=VALOR(EXTRAE(TEXTO(A2;"DD/MM/AAAA");4;2)&"/"&IZQUIERDA(TEXTO(A2;"DD/MM/AAAA");2)&"/"&DERECHA(TEXTO(A2;"DD/MM/AAAA");4))


En este ejercicio hemos resuelto un problema, convirtiendo en primer lugar todos los datos a texto, para procesarlos de forma uniforme, y luego volviendo a transformar los resultados a número y fecha.

En ocasiones es más sencillo dar un rodeo para resolver un problema de forma homogénea, en lugar de aplicar funciones lógicas para cada caso diferente.

 

miércoles, 4 de agosto de 2021

Comportamiento extraño de fechas filtradas en hojas de cálculo.

El mayor problema con las fechas no es la limitación del campo numérico almacenarlas en una hoja de cálculo.

El gran problema y le he dado por las múltiples formas que los humanos tenemos de expresar las fechas.

Hoy vamos a analizar los dos formatos más habituales de expresar fechas, que podríamos denominar, el europeo y el americano.


En Europa habitualmente se indica primero el día, luego el mes y finalmente el año, este formato se suele identificar como DDMMAAAA, haciendo referencia la D a día, la M a mes y la A a año.

En América se suele indicar en primer lugar el número de mes, luego el del día y finalmente el del año, este formato se suele identificar como MMDDAAAA.

En el ejemplo de hoy, vamos a importar el fichero de texto con las fechas que vemos a continuación, todas ellas en formato MMDDAAAA.

En este caso era sencillo darse cuenta que estás fechas entran en formato Americano, ya que las fechas son consecutivas y nos dan una pista importante, pero en el caso de venir mezcladas podría ser difícil darse cuenta.


Importamos el fichero a Microsoft Excel, desde "Obtener datos externos" desde la opción "Desde un archivo de texto".

Seleccionamos el fichero pulsamos el botón importar.


Vemos que los.datos se reconocen correctamente y pulsamos en "Finalizar"


Seleccionamos la celda A1 y aceptamos.


Ya tenemos los datos en el Excel.

Ahora aplicamos un filtro, para quedarnos solo con los datos que nos interesan.

Y al desplegar el filtro notamos algo extraño.

Algunas de las fechas no aparecen agrupadas por meses, es como si no reconociese a que mes pertenecen.

En realidad, si nos fijamos un poco más resulta que las fechas que no aparecen acumuladas son fechas que no pueden existir con el día 02 del mes 13 del año 2021.


Es más, si ampliamos el ancho de la columna nos sorprenderá que algunas fechas están alineadas a la izquierda, como si fuesen textos, y otras a la derecha como si fuesen números.


Este es uno de los peores errores que podemos cometer al importar datos en una hoja de cálculo.

Lo que ha sucedido es que nuestra hoja de cálculo ha asumido que las fechas están en formato DDMMAAAA, pero el fichero de texto las traía en formato MMDDAAAA.

Pero lo.peor que nos puede suceder es creer que solo las fechas no reconocidas están mal.

Las que se han reconocido pueden estar bien o mal, por ejemplo el uno de Enero no será errónea porque tanto el día como el mes son iguales haciendo que su representación en ambos formatos de fecha coincida.

Sin embargo no es lo mismo el dos de Enero que el uno de Febrero.

Lo peor de estas coincidencias es que podríamos llegar a comprobar que los datos para el día uno de Enero son correctos y confiarnos.


martes, 3 de agosto de 2021

Comparativa fechas en formato 1900 en distintas hojas de cálculo (Microsoft Excel, Libreoffice Calc, Google Sheets)

A pesar de que todas las hojas de cálculo soportan el formato de fechas 1900, no todas los implementan igual. 



En Microsoft Excel se asigna el día 00/01/1900 al valor cero. 

Es una situación curiosa, ya que este día no existe.

El valor 1 se corresponde al día 01/01/1900.

Mientras que para el día 01/08/2021 se corresponde el valor 44.409.


En Libreoffice Calc los valores para el día actual son los mismos, sin embargo para el valor 0 se asigna el 30/12/1899 y para el 1 el 31/12/1899.

A pesar de que para el día 01/08/2021 se corresponde el mismo valor que en Microsoft Excel, no sucede esto para el valor 1, que se corresponde al día anterior.



Los valores en Google Sheets se corresponden a los mostrados en Libreoffice Calc.


Mostrando los datos en paralelo podemos comprobar que a pesar de que los datos para los primeros días puede haber una diferencia en los datos de fechas actuales son equivalentes.



Cuando trabajemos con fechas recientes no tendremos problemas, pero en el caso de tener que recurrir a fechas cercanas al 1900 deberemos tener clara la diferencia entre las distintas herramientas.

domingo, 1 de agosto de 2021

Tratamiento de fechas en hojas de cálculo (Microsoft Excel, Libreoffice Calc y Google Sheets)

Aunque aparentemente los datos relativos a fechas y horas parecen un tipo de datos por sí mismo, y así es en alguno lenguajes de programación, en las hojas de cálculo no tienen un tipo propio.

Para tratar datos relativos a fechas y a la vez facilitar los cálculos relativos a las mismas, tradicionalmente se representan las fechas como números enteros.



Para ello se elige un día al que se asigna el valor 1.

Lamentablemente no existe un único sistema de fechas.

En concreto existen dos sistemas de fechas denominados 1900 y 1904 por el año que usan como año 1.

A día de hoy el formato por defecto suele ser el 1900.

En este formato el número 1 se corresponde con el día 01/01/1900 


Por ejemplo a fecha de hoy día 01/08/2021.


Si modificamos el formato de celdas de Fecha.


Y asignamos el formato General.


Veremos un número en lugar de la fecha.

Para el día 01/08/2021 el número mostrado es 44409, que se corresponde con el número de días transcurridos entre el día de hoy y el día de inicio del sistema de fechas, en el ejemplo el día  01/01/1900.


En la siguiente imagen muestro diversos valores numéricos y la fecha a la que se corresponden en el sistema 1900. 

Como se puede apreciar los valores inferiores al 1 muestran la fecha 00/01/1900.


También se aplica el mismo formato en Libreoffice Calc.


También sucede lo mismo en Google Sheets.


Sin embargo existen ciertas diferencias y peculiaridades que iré mostrando en futuras publicaciones.