Joviano

Bem vindo ao

Blog do Jovi!

O blog do Jovi tem como objetivo ajudar você com suas dúvidas, além de expandir seu conhecimento através da informação.

Como Calcular Dias Úteis com Power Query

Calcular dias úteis com Power Query pode parecer um bicho de sete cabeças, mas eu garanto que é mais fácil do que você pensa. Já se perdeu contando dias úteis no calendário e se sentiu como se estivesse em um labirinto? Fica tranquilo!
O Power Query está aqui para ser o seu GPS nessa jornada. Vamos começar do zero e subir de nível até você se tornar um mestre que até leva em conta os feriados!

Começando Simples: O Básico Sem Feriados

Segura essa, FERA! Vamos começar com o básico, sem complicação.
Vou te mostrar a seguir um comando que você pode colocar ai no seu Excel ou Power BI hoje mesmo.

Em seu editor Power Query, crie uma nova consulta em branco, e cole esse comando a seguir:

(
    dataInicio as date, 
    dataFim as date
) =>
let
    listaDatas = List.Dates(dataInicio, Duration.Days(dataFim - dataInicio)+1, #duration(1,0,0,0)),
    listaDiasUteis = List.Select(listaDatas, each Date.DayOfWeek(_, Day.Monday) < 5)
in
    List.Count(listaDiasUteis) - 1

Com a função criada, basta você dar um nome para ela, e eu recomendo sempre preceder com “fx”, como eu fiz aqui:

Power Query nomeando função personalizada

Agora que você tem uma função, basta invocar com uma coluna personalizada.
No exemplo abaixo, eu tenho algumas datas, e te mostro como fazer:

Power Query adicionando coluna personalizada

E na caixinha de fórmula digite assim:

Power Query função na coluna personalizada

Prontinho 👇👇

Power Query tabela

Me permita agora te explicar detalhadamente como funciona cada parte da função personalizada que fizemos juntos:

  1. List.Dates: Essa função cria uma lista de datas começando pela dataInicio até a dataFim. Ela usa #duration(1,0,0,0) para indicar que queremos avançar um dia de cada vez.
  2. Duration.Days: Essa função calcula a diferença em dias entre dataInicio e dataFim. É uma forma elegante de calcular a diferença entre duas datas, sem “enjambrar” nada 😂
  3. List.Select: Essa é a função que faz a mágica acontecer. Ela pega a lista de datas e filtra só os dias úteis. É como pegar um saco de balas e tirar só as que você gosta.
  4. Date.DayOfWeek: Essa função pega uma data e retorna a posição (ordem) do dia na semana.
  5. Day.Monday: Aqui é onde você define qual é o primeiro dia da semana. No caso, estamos usando segunda-feira (Monday) como o primeiro dia. É como se você estivesse dizendo: “A semana começa na segunda, então me dá só os dias úteis baseados nisso.”

O Poder das Listas: Nível HARD

Prepare-se, FERA! Agora é hora de subir o nível e falar sobre o poder das listas no Power Query.
As listas são como uma caixa de ferramentas completa, com tudo que você precisa para qualquer situação.

🏖️ Feriados são como aqueles episódios especiais de série que você não pode perder.
Então, vamos incluí-los na nossa função:

(
    dataInicio as date, 
    dataFim as date, 
    optional listaFeriados
) =>
let
    feriados = if listaFeriados = null then {} else listaFeriados, 
    listaDatas = List.Dates(
        dataInicio, 
        Duration.Days(dataFim - dataInicio) + 1, 
        #duration(1, 0, 0, 0)
    ), 
    listaDiasUteis = List.Select(listaDatas, each Date.DayOfWeek(_, Day.Monday) < 5), 
    listaDiasUteisSemFeriados = List.Difference(listaDiasUteis, feriados)
in
    List.Count(listaDiasUteisSemFeriados) - 1

Pra informar esses feriados, você deve criar uma lista com eles, que pode ser assim:

// 5 feriados de exemplo
let
    feriados = {
        #date(2000,1,1),
        #date(2000,9,7),
        #date(2000,11,2),
        #date(2000,11,15),
        #date(2000,12,31)
    }
in
    feriados

Ou, pode ter uma tabela que está no Power Query, e precisa converter em lista

Power Query converter coluna da tabela em uma lista

Com essa lista em mãos, basta incluir no parâmetro da função invocada

Power Query usando função personalizada

E como funciona esse tratamento dos feriados?

  1. List.Difference: Essa função é o verdadeiro herói aqui. Ela pega a lista de dias úteis e remove os feriados. É como ter um filtro de água que tira todas as impurezas e deixa só o que é bom.
  2. if listaFeriados = null then {} else listaFeriados: Aqui estamos usando uma condicional para verificar se a lista de feriados foi fornecida. Se não foi, a gente assume uma lista vazia. É como dizer: “Se você não me disser quais são os feriados, vou assumir que não tem nenhum!”
  3. List.Count: Por fim, essa função conta quantos dias úteis sobraram depois de remover os feriados. É o grand finale!

NIVEL HARD 2 – Feriado do dia e mês (em “passar” o ano)

Similar ao anterior, nesse caso precisamos de uma lista de “MES & DIA” dos feriados.
Neste exemplo vou colocar os “mês & dia” dos feriados direto dentro da função, evitando assim necessidade do terceiro argumento opcional.

(
    dataInicio as date, 
    dataFim as date
) =>
let
    feriadosMesDia = {
        "0101",  // janeiro - dia 1
        "0907",  // setembro - dia 7
        "1102",  // novembro - dia 2
        "1115",  // novembro - dia 15
        "1225" // dezembro - dia 25
    }, 
    listaDatas = List.Dates(
        dataInicio, 
        Duration.Days(dataFim - dataInicio) + 1, 
        #duration(1, 0, 0, 0)
    ), 
    listaDiasUteis = List.Select(listaDatas, each Date.DayOfWeek(_, Day.Monday) < 5), 
    listaDiasUteisSemFeriados = 
        List.Select(
            listaDiasUteis, 
            each List.Contains(feriadosMesDia, Date.ToText(_, "MMdd")) = false
        )
in
    List.Count(listaDiasUteisSemFeriados) - 1

Veja só como funciona cada uma das implementações

  1. Date.ToText: Essa função transforma a data em uma string no formato “MMdd”. É como se você pegasse uma foto sua e a transformasse em um desenho!
  2. List.Contains: Essa função verifica se um determinado “MMdd” está na lista de feriados. É o nosso segurança na porta da balada, conferindo se você está na lista VIP ou não.
  3. List.Select com List.Contains: Aqui, estamos usando List.Select novamente, mas desta vez com List.Contains para filtrar os dias úteis que também são feriados. É como ter um filtro duplo no café: só passa o que é realmente bom!

Aprendendo com o Vídeo

Se você é mais do tipo visual e prefere aprender vendo, tenho uma novidade: temos um vídeo explicando tudo isso no meu canal do YouTube!

É uma ótima forma de aprender essa técnica passo a passo e ainda pegar algumas dicas extras.
Então, não perca tempo e clique aqui para assistir.

Nesse vídeo eu usei uma outra técnica, diferente da apresentada neste artigo, e é interessante que você conheça

E se você é dos mais AVANÇADOS, que gosta de conteúdo denso, então tem uma LIVE (que está aberta), que falo sobre esse assunto, no canal de meu amigo CRISTIANO GALVÃO.
Clique Aqui para assistir, e aprenda como o List.Buffer pode turbinar ainda mais essa técnica.

ATENÇÃO: E quando a data final é anterior que a inicial…

Nossa amiga Érika postou nesse vídeo do Youtube dúvida interessante, envolvendo um cálculo de dias “negativos”. veja só:

Acontece que quando usamos o List.Dates no Power Query, ele PRECISA que a data inicial seja menor que a final.

Mas, é possível fazer um pequeno ajuste na função, de modo que ela entregue o resultado negativo, quando a situação for inversa, como proposto pela Erilka.

(
    dataInicio as date, 
    dataFim as date
) =>
let
    x = List.Min({dataInicio, dataFim}),            // etapa ACRESCENTADA
    y = List.Max({dataInicio, dataFim}),            // etapa ACRESCENTADA
    pn = if dataInicio < dataFim then 1 else -1,    // etapa acrescentada   
    listaDatas = List.Dates(Date.AddDays(x,1), Duration.Days(y - x) , #duration(1,0,0,0)), // etapa MODIFICADA
    listaDiasUteis = List.Select(listaDatas, each Date.DayOfWeek(_, Day.Monday) < 5)
in
    List.Count(listaDiasUteis)  * pn  // etapa MODIFICADA

Nesse exemplo, estamos fazendo uma avaliação das variáveis x e y para usá-las como parâmetros de nossa função.

O cálculo parte do dia 0, logo, quando o intervalo é negativo, temos que fazer esse ajuste extra, mas é mais fácil entender em uma imagem:

dias uteis no power query - explicação

Agora ficou fácil ein…

Conclusão

E aí, virou ou não virou um mestre em calcular dias úteis com Power Query? Agora você tem o poder de ir do básico ao avançado, tudo na palma da sua mão. Quer mais? Então, não perca tempo e conheça nossa FORMAÇÃO POWER QUERY 2.0, que vai MUITO ALÉM DO POWER QUERY.

E aí, curtiu?
Então não perca mais tempo e mergulhe de cabeça na nossa FORMAÇÃO 🚀

Te vejo do outro lado!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Receba conteúdos do Jovi!

Digite seu interesse abaixo:

Quer Aprender sobre Power Query?

Conheça nossa formação e tudo que você pode aprender com ela.

Mais conteúdos gratuitos para você!

Power Query

[ NO AR ] JOVI TALK

Por aqui falamos de tratamento de dados e automações, sempre focando nos analistas de negócio que desejam ganhar tempo nas suas atividades.

Leia mais

OPA, vejo que você é novo por aqui!

Temos um presente de boas vindas para os amantes de Blog!

E ai FERA?!

Não vou atrapalhar tua leitura deste super artigo.

Só quero te dizer que por ser um visitante novo aqui no site, nosso sistema está programado para te enviar um cupom de desconto para a FORMAÇÃO POWER QUERY 2.0, que é um pacotão de cursos do JOVI, com mais de 300 horas de conteúdo.

Informe seus dados a seguir, que te enviaremos as instruções para resgate desse cupom exclusivo.

Após enviar, pode fechar essa janela, que seu presente já está em processamento.

A ementa possui centenas de aulas, e resumimos em um painel de PowerBI o qual enviaremos a você.

Preencha seu nome e email que em instantes receberá a ementa completa deste pacote de cursos.

Formato Aceito: [+ código do pais] [código de área] [número]