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.
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:

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»:

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.

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:

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:

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:

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

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) )

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:

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!
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 🙂
Gracias por compartir sus conocimientos.
Muy bueno, gracias Miguel me ha ayudado mucho.
Muy útil. Me ayudo a resolver un problema muy importante en mi trabajo.
Muchas gracias Miguel.
Hola,
Mi pregunta es la siguiente:
Si para el mismo Ítem tengo diferente valor en cada año, con fecha inicio y final independiente, como puedo proyectar?
Ejemplo:
Item1, FechaInicio: junio20, Fechafin: febrero23, valor en 2020:2, valor en 2021:5, valor2022:6
como puedo generarme un grafico con escala temporal mensual?
Un saludo
Leire
Hola! Es una pregunta interesante y algo, como es para graficar, sería mejor verlo con un modelo de datos completo y tal vez con una medida dax. Te invito a que publiques tu escenario completo con ejemplos en nuestro foro:
https://foro.poweredsolutions.co/
Hola, ¿cómo podría rellenar fechas con la siguiente condicion:
Póliza, Tipo, f. inicio, f.fin,
A001, mensual, 06/01/2020, 06/01/2023
-Rellenar mensual cada día 6 a partir de feb/2020 hasta la fecha fin ejem: 06/02/2020-
06/03/2020
~Rellenar cada trimestre~
A002, trimestral, 10/01/2020,10/01/2025
Ejem: 10/04/2020
10/07/2020
~Rellenar cada semestre ~
A003, semestral, 15/01/2020,15/01/2030
Ejem:
15/07/2020
15/01/2021
Hola!
Probablemente sea una mejor idea crear tu propia función personalizada para cada escenario. Existen algunas funciones que te pueden ayudar como Date.AddMonths, pero ninguna que te brinde una solución directamente.
Te recomiendo leer el siguiente artículo:
https://www.thepoweruser.com/2019/02/19/parameters-and-functions-in-power-bi-power-query-custom-functions/
También puedes publicar tu escenario completo en el foro:
https://foro.poweredsolutions.co/
hola, lo que pasa es que tengo una columna de producto y varias columnas con ventas por mes, ej
producto enero febrero marzo ….
como puedo sacar una grafica que me saque por mes
Hola! El botón de Anular dinamizacion de columnas sería tu mejor opción.
Saludos!
Miguel buen dia
Tengo intervalos de numeros en este formato en una columna
0/40
41/43
50/57 etc
quiero hacer una columna nueva que concatene por ejemplo 0/1/2/3…/40 de cada una de estas columnas, como lo podria hacer?
muchas gracias
Hola Camila!
Creo que el artículo realmente no aplica para ese caso. Lo mejor sería revisar el escenario en detalle.
Te sugiero publicar la consulta en el foro oficial de Power BI en español:
https://community.powerbi.com/t5/Translated-Spanish-Desktop/bd-p/pbi_spanish_desktop
Saludos!