Rellenar fechas entre fechas con Power BI / Power Query

Una de mis publicaciones más populares es una sobre fechas recurrentes con desplazamiento en Power Query (url). Tiene miles de visitas, pero una de las preguntas de seguimiento clave que tienen las personas después de leerlo es «¿Cómo puedo completar / rellenar fechas entre fechas?»

Esta es la publicación donde cubriré ese mismo tema para mostrarles exactamente cómo pueden usar Power Query / Power BI para completar las fechas de la manera más sencilla posible.

Puedes seguir este artículo descargando el archivo de muestra desde el botón de abajo.

Descargar archivo de muestra

Caso 1: Rellenar fechas continuas entre fechas

Imagina que tenemos una tabla como la de abajo:

Person Start Date End Date Hours per day
Miguel 26-Jun-19 09-Jul-19 7
Bill 22-Jun-19 08-Jul-19 8
Ken 20-Jun-19 05-Jul-19 10
Rob 21-Jun-19 30-Jun-19 8.5

Lo que queremos crear es un conjunto simple de fechas para ese período de tiempo desde la fecha de inicio (Start Date) hasta la fecha de finalización (End Date).

¿Cómo rellenamos las fechas entre esas dos fechas con Power BI / Power Query?

En realidad, es más fácil de lo que piensas. Esta técnica es una que comúnmente veo que usa mi amigo Ken Puls cuando trabaja con fechas. Puedes transformar esas fechas en un número (son puntos flotantes) y crear una lista o secuencia de números basada en esa fecha de inicio y fecha de finalización como esta:

image

La clave aquí es esa lista o secuencia de números usando esta fórmula:

{[Start Date]..[End Date]}

Me gustaría que funcionara con fechas, pero solo funciona con valores numéricos, por lo que necesitamos convertir las fechas en un número antes de crear nuestra nueva columna personalizada.

El resultado de eso será una nueva columna con todas nuestras fechas dentro de una lista.

Puedes hacer clic en el ícono que se ve como dos flechas que van en direcciones opuestas y hacer una operación de «Expand to New Rows»:

image

y luego puedes convertir la nueva columna en un tipo de datos de fecha, eliminar la fecha de inicio y finalización y eso nos dará el resultado que estamos buscando, que es una forma sencilla de completar las fechas entre dos fechas.

image

De nuevo, este es el escenario más fácil y probablemente el más común que puedas encontrar en el mundo real. Si necesitas completar fechas consecutivas entre dos fechas, entonces esta es la mejor manera de lograrlo.

Caso 2: Rellenar solo x cantidad de días

En el caso anterior, descubrimos cómo se llenan las fechas entre dos fechas específicas. Tuvimos una fecha de inicio y finalización, pero ¿qué sucede si solo se tiene la fecha de inicio y se desea establecer un conjunto específico de fechas a partir de esa fecha de inicio?

En este caso tenemos una tabla que se ve así:

Person Start Date Valid for
Miguel 9-Jul-19 7
Bill 2-Jul-19 1
Ken 4-Jul-19 3
Rob 8-Jul-19 90

Y la situación es bastante simple. A la Fecha de inicio (Start Date), queremos agregar la cantidad de días de la columna «Valid for».

Para darte más contexto, imagina que esta es una tabla que nos muestra el acceso que cada persona tendrá durante un período de tiempo y queremos ver cuántos de nosotros tendremos un acceso determinado durante una fecha específica o un conjunto de fechas. El escenario general es más complejo que eso, ya que también podría tener que ver con otros campos, pero he simplificado el escenario solo para fines de demostración.

El siguiente paso es simplemente agregar una columna personalizada. No es necesario convertir las columnas en números esta vez; en realidad necesitamos esta columna como fecha esta vez y agregamos la siguiente fórmula:

image

List.Dates([Start Date], [#»Valid for «], Duration.From(1))

Estoy usando una función llamada List.Dates la cual toma una fecha inicial y crea una lista de fechas a partir de ella.

  • El primer parámetro de esta función es la fecha de inicio (Start Date)
  • El segundo parámetro de esta función es la cantidad de fechas que esta función debe devolver desde la fecha de inicio
  • El tercer parámetro es la cantidad de días entre las fechas y se debe pasar como un tipo de datos de Duración. En mi caso, estoy diciendo que quiero una nueva fecha diaria. Es por eso que uso Duration.From (1) pero también puede usar #duration (1,0,0,0)

Después de expandir la nueva columna, así es como se ve:

image

Una cosa crucial y REALMENTE importante a mencionar es que el  «conteo» de los días comienza a partir de las 0 horas de la fecha de inicio. Esto significa que está incluyendo la fecha de inicio como la primera fecha y es por eso que la lista inicial de fechas para Miguel en esa tabla solo se extiende hasta el 15 de julio.

Caso 3: Rellenar los días de la semana específicos entre las fechas

En la publicación que mencioné anteriormente sobre fechas recurrentes, básicamente juego con el último parámetro de la función List.Dates para obtener solo fechas que tendrán un «espacio» de x cantidad de días entre ellas, que defino usando el parámetro de List.Dates. Las fechas funcionan con la duración.

Esta es una revisión de ese caso específico y aquí está la tabla inicial:

Initial
Appointment
Patient Follow ups needed Frequency (every x days)
11-Jan-18 Audie Livengood 3 14
28-Oct-17 Curt Gatz 2 7

El objetivo de esta es establecer las fechas de seguimiento para una cita. Imagínate que fuimos al hospital y el médico dice que quiere vernos en 2 semanas desde esa cita o que quiere vernos cada 2 semanas durante los próximos dos meses.

Podemos usar la misma fórmula que tengo en mi publicación anterior. Es la mejor manera de hacerlo:

image

y después de expandir la nueva columna y establecer el tipo de datos correcto para esta nueva columna, obtendrá esto:

image

En este caso, básicamente jugamos con la función List.Dates para adaptarla a nuestras necesidades. Les recomiendo que lean el artículo original si desean ver más a fondo ese escenario específico.

Otros casos no cubiertos

Es posible que encuentres otros casos en los que necesites hacer algo bastante específico, como buscar el 5to o el viernes pasado dentro de un determinado conjunto de fechas o encontrar el segundo fin de semana de trabajo de la temporada.

Por lo general, estos son escenarios altamente específicos que personalmente abordaría creando una función personalizada, por lo que, si alguna vez se encuentra en una situación diferente a las que se enumeran aquí, háganmelo saber en los comentarios. Me encantaría saber sobre estos otros escenarios y ver si podríamos actualizar la lista de casos de esta publicación.

Trabajando con campos Fecha y hora

Hasta ahora no hemos tratado nada más que fechas, pero ¿qué pasa con los valores de tipo fecha y hora?

Para eso no podemos crear una secuencia de números ya que la secuencia de números solo funciona con números enteros y la función List.Dates solo funciona con fechas, entonces, ¿qué podemos usar?

Para los campos de fecha y hora podemos usar una función llamada List.DateTimes

Veamos este ejemplo:

DateTime Total Alarms Alarm every (minutes)
7/9/19 8:00 AM 20 30
7/20/19
10:30 AM
10 5

El objetivo aquí es simple: tenemos que establecer la fecha y hora exactas en que deben activarse estas alarmas. Tenemos una fecha y hora que nos indica cuándo debe sonar la alarma la primera vez, luego cuántas veces debe sonar (columna de alarmas totales) y luego con qué frecuencia debe sonar en minutos en esa columna de Alarma cada (minuto).

Carga esos datos en la ventana de Power Query y asegúrate de que la columna sea del tipo de datos datetime.

Luego podemos crear una columna personalizada usando esta fórmula:

List.DateTimes([DateTime],[Total Alarms], #duration(0,0,[#»Alarm every (minutes)»],0) )

image

Observa cómo la función se parece también a la función List.Dates y es exactamente la misma, excepto que el primer parámetro debe ser un valor de fecha y hora en lugar de un valor de fecha.

Lo realmente importante aquí es cómo funciona la parte #duration y esto es lo que necesita comprender:

  • #duration tiene 4 argumentos y cada uno de ellos son valores enteros
  • #duration (días, horas, minutos, segundos)

Después de expandir la columna, así es como se ve nuestra tabla:

image

Otras consideraciones para Fecha y Tiempo

En algunos casos, no es necesario que uses datetime (fecha y tiempo), sino que solo uses la parte de tiempo y trabajes de esa manera como una duración directamente desde la interfaz de Power Query, pero si necesitas usar un valor de datetime, entonces List.DateTimes sería tu mejor amiga y no se te olvide el poder de la palabra clave #duration.

¿Tienes otros casos que no están cubiertos aquí? ¡Déjame saber sobre ellos en la sección de comentarios a continuación!

4 Comments

  1. Impresionante Miguel, muchas gracias. Habia utilizado esta función creo que del ebook de Ken y lo he cargado con fechas sin sustituir a valores asi:
    {Number.From ([StartDate]) .. Number.From ([EndDate])} y es genial.
    muchas gracias por toda esta informacion, realmente tus publicaciones son muy facil de enteder y geniales. Cuidate mucho Miguel, te envio un fuerte abrazo! sls a Ken, Rob, Bill 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.