O registro do tempo é dado mais importante quando uma operação informatizada acontece e ou é executada por um sistema de informação, pois representa a memória do fato acontecido e permite olharmos para trás e enxergar quando algo relevante aconteceu.
Quero apresentar os formatos mais comuns de representar o tempo em datasets/tabelas e como usar a linguagem de programação Pyspark para realizar algumas transformações necessárias para atender tais padrões para os projetos de análises de dados.
1. Como entendemos o TEMPO
Se fizermos uma pergunta simples a qualquer pessoa, como por exemplo:
“Que horas são agora?”;
“A data de seu nascimento?”;
“Qual o dia da festa?”;
“Quanto tempo devo deixar uma receita no forno?”;
Essas e outras diversas perguntas demandam uma resposta que envolvem alguma medida de tempo, em maior ou menor nível de detalhe; não é diferente quando é preciso responder perguntas de negócios em que o tempo é a informação que dará significado ou contexto a um fato ocorrido, porém, muitas vezes é necessário obter tal resposta a partir do tratamento de um registro que está em um formato não usual ou mesmo através de cálculos de dados recebidos.
2. Formatos mais comuns para Data/Hora.
2.1 IS0 8601
A ISO 8601 é uma norma internacional para representação de data e hora emitida pela Organização Internacional para Padronização (International Organization for Standardization, ISO). Especificamente esta norma define: “Elementos de dados e formatos de intercâmbio para representação e manipulação de datas e horas”. A principal característica do formato de data e hora da norma ISO 8601 é que a informação de data e hora seja ordenada a partir do valor mais significativo ou, em termos simples, do maior (o ano) para o menor (o segundo).
2.2 A Data / Hora em formato UNIX
A hora UNIX é um relógio que marca a quantidade de segundos passados desde 1º de Janeiro de 1970 (UTC) até o momento atual. Foi criado com o objetivo de facilitar o cálculo de datas entre computadores, visto que o cálculo de datas feito através do formato ‘humano’ é difícil para um computador.
Deixo como exercício e também para exploração, um site que ajuda no processo de conversão de formato ISSO para UNIX e vice-versa, a descoberta de qual data se refere o número: 1677447600. A sugestão de um site para converter e explorar:
https://www.nexcess.net/web-tools/unix-timestamp-converter/
2.3 A Date / Hora em formato de notação científica
É provável que em algum momento trabalhando com arquivos Excel você já tenha se deparado com uma coluna com registro neste padrão: 1.29905E+12; isso acontece quando uma coluna do Excel recebe uma cadeia de números com mais de 11 dígitos, ou seja, acontece uma conversão automática para notação científica e são muito chatas, porém é mais comum do que se imagina, mas é possível tratar, como veremos mais a diante.
3. Conhecendo e convertendo o dado TEMPO:
A seguir vamos simular como dados em formato string, comumente ingeridos de arquivos CSV e ou Excel, podem ser convertidos para obter uma tipagem/formato mais adequado aos padrões de projetos de BI e Big Data.
Passo 1) Importar bibliotecas e funções fundamentais do sql para usar no spark.
from pyspark.sql.functions import *
from pyspark.sql.types import *
from datetime import datetime
from pyspark.sql import SparkSession
Passo 2) Criar um dataframe com os dados de exemplos formatos a serem convertidos.
# Create SparkSession
spark = SparkSession.builder.appName('Lab_Tempo').getOrCreate()
data = [(
"2021-09-30 14:30:00", # iso_8601
"2021-09-30T14:30:00.000Z", # ano_mes_dia_hr_mm_ss_mmutc
"1677447600", # formato_unix
"01-Oct-2021 14:30:00", # abreviado
4.44357E+05, # notacao_cientifica
"13/03/2023", # padrao_csv_excel_1
"13-03-2023", # padrao_csv_excel_2
"01/10/2021:14:30:00 -0300", # data_hora_utc_3
)]
# Cria um dataframe a partir dos dados
df = spark.createDataFrame(data, [
"iso_8601",
"ano_mes_dia_hr_mm_ss_mmutc",
"formato_unix",
"abreviado",
"notacao_cientifica",
"padrao_csv_excel_1",
"padrao_csv_excel_2",
"data_hora_utc_3"
]
)
Conversão 01: de formato UNIX para Timestamp: Exemplo citado no tópico 2.2: 1677447600:
OBS: note que embora tenha sido descoberta a data/hora, o mesmo permanece como string, porém a conversão abaixo pode ser aplicada para transformar esse campo em timestamp de verdade.
Conversão 02: para uma data/hora no formato isso_8601 a partir de uma string:
Conversão 03: de data/hora com UTC:
Conversão 04: data com mês abreviado:
OBS: destaque para o formato original e o definido, MMM para o mês e também o padrão PT-Br, mas ao ser apresentado fica como yyyy-mm-dd.
Conversão 05: notação número em notação científica em timestamp:
Conversão 06: data no padrão dd/mm/aaaa & dd-mm-aaaa; padrão de escrita PT-Br:
Conversão 07: Data/Hora com UTC + 3 horas:
OBS: Verificar sempre o UTC, pois é preciso considerar ou desconsiderar as horas a mais ou a menos.
4. Separando informações de campos timestamp/date:
5. Conclusão
Esse breve artigo, trouxe um exemplo de como usar as funções do sql no pyspark timestamp e date para que possamos converter os registros de data em formatos mais adequados para serem usados em projetos, todavia, existem muitas possibilidade de obter informações dos registros de data e hora, como o dia da semana; se é ou não dia útil, se é ou não feriado; enfim.
Deixo como referência para mais detalhes sobre formatos de data e hora no link: https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes
Link para acessar scripts usados:
😎