Código simples em Python para operações de dias úteis (iguais às do Excel)

Share:

Apesar de todas as críticas que o Excel sofre, é impossível negar que as funções de datas ajudam demais nos cálculos para finanças, entretanto, no Python (em um primeiro momento) não existem ferramentas tão simplificadas para que a conta seja feita de forma tão simples.

Este post tem como intuito facilitar não somente os cálculos financeiros que são feitos para o mercado brasileiro, mas também facilitar a migração do Excel para o Python em rotinas mais básicas.

Como proceder?

Sabe-se que os feriados brasileiros oficiais (nacionais) estão localizados de forma compilada em um link disponibilizado pela Anbima (link de download). No caso do Excel basicamente todas as planilhas do mercado financeiro brasileiro possuem a famigerada aba “feriados” em qual se define um range para que simplifique os cálculos de dias úteis ( =NETWORKDAYS(data_inicial; data_final; feriados)-1 ).

Mas como se pode simplificar o download e a consolidação dos dados para o Python e, posteriormente, fazer alguns simples códigos que possam servir de auxílio para os cálculos financeiros?

É bem trivial, visto que o pandas já auxilia na leitura do que é desejado neste post:

Um breve pd.read_excel(LINK_ANBIMA) já resolveria este problema de leitura. Entretanto, pode-se melhorar o código para que a resposta fique completamente limpa (sem header e footer) e com algumas linhas a mais para melhorar a performance do código.

Código para fazer o download dos feriados Anbima do site

Para o código começo com a definição do arq_temp, que essencialmente é um arquivo temporário “.parquet” que pode ou não já existir na pasta “Temp” do seu computador. Caso o arquivo já exista, o código irá simplesmente ler este arquivo na pasta temporária e retornar os feriados, caso contrário, irá baixar do site da Anbima, fazer a limpeza dos dados e retornar, da mesma maneira, os feriados em ‘datetime64[D]’.

*Supõe-se, para este código, que os feriados da Anbima não sofrerão alteração, caso o usuário deseje um override (download e substitui

E as funções do excel, o que fazer?

=NETWORKDAYS()

Agora que o código de feriados já foi criado, basta compilar algumas funções que já estão presentes na biblioteca numpy em um formato mais amigável, igual ao do Excel.

Função em Python semelhante à =NETWORKDAYS() do Excel

Quais são as novas funcionalidades que coloquei na função em si? Removi algumas limitações que a função do Excel possui e introduzi algumas coisas bacanas para quem quer utilizar esta função da forma mais dinâmica possível.

  • Qualquer uma das variáveis (data_inicial ou data_final) aceita tanto o formato (‘YYYY-MM-DD’) como uma lista contendo estes formatos, ou np.ndarray contendo estes formatos ou pd.Series contendo estes formatos, ou seja, o usuário pode usar esta função, já vetorizada via numpy, no pd.DataFrame escolhido, ou nas suas matrizes, listas, etc.
  • Caso uma variável tenha tamanho 1 (len(v) == 1) e a outra tenha tamanho maior que 1, o código já replica a variável de tamanho 1, pois aqui considero que se alguém fornecer somente uma data de início e várias datas finais, o usuário deseja a contagem de dias úteis para todas as datas finais começando de uma única data inicial, e vice versa
  • A função já checa divergências nos inputs, caso um número de elementos > 1 seja fornecido nas duas variáveis, mas sem casamentos de tamanhos, a função não irá transformar as datas e retornará um ValueError

*Vale lembrar que a função networkdays equivale à função do Excel =NETWORKDAYS()-1, visto que se calcula exclusive 1 dia do range de datas

=WORKDAY()

Função em Python semelhante à =WORKDAY() do Excel

A função tem funcionalidades de variáveis idênticas à anterior, mas somente com uma variável de entrada que é a data_inicial em que se deseja fazer uma rolagem de dias úteis.

Bônus : Gerar datas úteis entre dois conjuntos de datas

Função bônus para gerar datas úteis entre dois conjuntos de datas fornecidos

Ao utilizar as funções anteriores, o bônus nada mais é do que uma função generalista com a capacidade de criar quantos ranges de datas úteis o usuário necessitar, com as mesmas capacidades da função networkdays e workday.

O código consolidado pode ser encontrado no meu GitHub