Construindo variáveis a partir de datas em Python

Ao iniciante em linguagens de computação, trabalhar com datas pode parecer assustador. Datas são difíceis para o computador interpretar nativamente. Mas as linguagens mais modernas, especialmente as voltadas ao processamento de dados, já incorporam métodos para facilitar sua manipulação. Além disso, explorar datas é essencial ao programador na área de inteligência artificial, já que muitos bancos de dados incluem informações temporais, as quais geralmente contêm informações essenciais para que o modelo alcance um bom desempenho.

Nesse breve tutorial, vou apresentar uma função simples para Python que facilita muito a construção de variáveis a partir de datas: time.tuple().

Pra começar, vamos iniciar uma variável contendo uma data para que possamos manipular. Como exemplo, vou usar o exato momento em que Neil Armstrong se tornou a primeira pessoa a pisar na Lua.

In [1]: from datetime import datetime
In [2]: armstrong = datetime(1969, 7, 21, 2, 56, 15)
In [3]: print(armstrong)
Out[3]: datetime.datetime(1969, 7, 21, 2, 56, 15)

Linha 1: importando a função datetime do módulo datetime.
Linha 2: definindo a variável armstrong, que contém o objeto do formato datetime.datetime correspondente a 21/07/1969 02:56:15.
Linha 3: comando para exibir o conteúdo da variável armstrong na tela.
Linha 4: saída do comando anterior.

Agora vou chamar o método time.tuple() na variável criada, guardar os resultados numa nova variável, e inspecionar seu conteúdo.

In [4]: armstrong_new = armstrong.timetuple()
In [5]: armstrong_new
Out[5]: time.struct_time(tm_year=1969, tm_mon=7, tm_mday=21, tm_hour=2, tm_min=56, tm_sec=15, tm_wday=0, tm_yday=202, tm_isdst=-1)

Linha 1: definindo a variável armstrong_new, contendo o resultado da chamada da função timetuple() na variável armstrong.
Linha 2: comando para exibir o conteúdo da variável armstrong_new na tela.
Linha 3: saída do comando anterior. A nova variável está no formado time.struct_time.

Observe que a nova variável contém várias informações interessantes. As primeiras seis são mais evidentes: o ano em questão (year), o mês do ano (mon), o dia do mês (mday), a hora do dia (hour), o minuto da hora (min) e o segundo do minuto (sec). wday contém o dia da semana, sendo indexado em zero, que corresponde a segunda-feira. yday é o dia do ano, onde 1 corresponde a primeiro de janeiro. O último atributo, isdst, serve para identificar se a data em questão está no horário de verão: 1 indica sim, 0 indica não, e -1 indica desconhecido.

Da inspeção dos resultados anteriores, podemos observar que Neil Armstrong pisou na Lua numa segunda-feira do 202o. dia do ano de 1969.

Agora vem a parte interessante: a partir dessa decomposição, é possível construir novas variáveis para serem usadas em modelos de machine learning, que são muito úteis para capturar efeitos sazonais nas variáveis de saída. Por exemplo, se estivermos modelando um comportamento que varia durante os dias da semana, o componente wday pode ser muito útil. Podemos extrai-lo com a construção:

In [6]: armstrong_wday = armstrong_new.tm_wday
In [7]: print(armstrong_wday)
Out[7]: 0

Linha 1: definindo a variável armstrong_wday, contendo o atributo tm_wday da variável armstrong_new.
Linha 2: comando para exibir o conteúdo da variável armstrong_wday na tela.
Linha 3: saída do comando anterior.

O mesmo pode ser feito com a variável yday, que pode capturar comportamentos que se repetem sempre no mesmo dia do ano, quando por exemplo, esse dia é um feriado com data fixa.

In [8]: armstrong_yday = armstrong_new.tm_yday
In [9]: armstrong_yday
Out[9]: 202

Linha 1: definindo a variável armstrong_yday, contendo o atributo tm_yday da variável armstrong_new.
Linha 2: comando para exibir o conteúdo da variável armstrong_yday na tela.
Linha 3: saída do comando anterior.

Finalmente, podemos construir uma nova variável com base nas informações disponíveis. Suponha que estejamos investigando um fenômeno cujo ciclo é afetado minuto-a-minuto dentro de um mesmo dia. Seria interessante saber quando minutos transcorreram dentro do mesmo dia. Podemos fazer isso com o seguinte código:

In [10]: armstrong_mday = armstrong_new.tm_hour * 60 +
    ...:                  armstrong_new.tm_min
In [11]: armstrong_mday
Out[11]: 176

Linha 1: definindo a variável armstrong_mday, contendo uma operação matemática com os atributos tm_hour e tm_min da variável armstrong_new.
Linha 2: comando para exibir o conteúdo da variável armstrong_mday na tela.
Linha 3: saída do comando anterior.

Primeiro multiplicamos o número de horas passadas no dia por 60 (pois cada hora tem 60 minutos), depois somamos o número de minutos transcorridos dentro da hora em questão.

Insights muito úteis podem surgir da exploração inteligente de datas, por isso saber extrair o máximo de informação possível desse formato de dados é tão importante!