Oi Aline! Tudo bem contigo?
Existem alguns passos que você pode seguir para alcançar seu objetivo, vamos montar eles aqui com dataframe com datas aleatórias, e a partir desse exemplo aqui você pode aplicar os códigos ao seu banco de dados, belezinha?
Primeiro, montei o Dataframe df
com datas e duas linhas sem valores:
import pandas as pd
import numpy as np
df = pd.DataFrame({'data_nascimento':['2000-11-09','2013-10-31','1998-02-17',np.nan,np.nan,'2001-05-28','1998-02-17']})
df
O resultado de df
é o seguinte:
| data_nascimento |
---|
0 | 2000-11-09 |
1 | 2013-10-31 |
2 | 1998-02-17 |
3 | nan |
4 | nan |
5 | 2001-05-28 |
6 | 1998-02-17 |
O tipo inicial dos elementos da coluna data_nascimento
é string. Com esse tipo, vamos utilizar agora um método SimpleImputer
da biblioteca sklearn. O SimpleImputer
vai nos permitir substituir os valores faltantes pelas strings de datas mais frequentes do nosso DataFrame.
Primeiro o importamos através do comando from sklearn.impute import SimpleImputer
depois, precisamos definir seus parâmetros. O 1° parâmetro a ser definido é o missing_values
que indicará o que será substituído, no nosso caso, são os valores do tipo NaN, indicado por np.nan
. Após, definimos o 2° parâmetro, strategy
, que será a forma como os dados serão selecionados para substituir o valor NaN, como queremos a data mais frequente, usaremos 'most_frequent'
.
Por fim, adaptamos nosso DataFrame às definições anteriores através do .fit_transform(df)
e depois transformamos os dados no DataFrame df_novo
:
from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
transform = imp_mean.fit_transform(df)
df_novo = pd.DataFrame(transform, columns=df.columns)
O DataFrame df_novo
tem elementos de data como strings, agora, precisamos transformá-los em elementos do tipo datetime. A transformação utiliza o método to_datetime do pandas, e sua transformação é bem simples, devemos apenas definir a coluna que será transformada e qual o formato da data. Como as datas estão organizadas em formato AAAA-MM-DD, então definimos o formato %Y-%m-%d
.
df_novo['data_nascimento'] = pd.to_datetime(df_novo['data_nascimento'], format="%Y-%m-%d")
Agora, vamos calcular as idades. Para esse cálculo, importaremos o módulo date da biblioteca datetime, que fornece vários métodos para que possamos trabalhar com datas. Após isso, coletamos a data atual pela função date.today()
e criamos uma lista vazia, chamada id
, que receberá as idades.
Para o cálculo da idade, entramos em um laço for que vai ler os elementos da coluna data_nascimento
e o calcular as idade pela equação:
ano_atual - ano_nascimento - (1 ou 0)
. Nessa equação existe a diferença de anos entre a data de nascimento e atual, no entanto para calcular uma idade devemos também considerar se estamos antes ou depois da data de aniversário. Por exemplo, uma pessoa que nasceu em 31/10/2013 tem no dia 21/01/2022, 8 anos. No entanto, se calcularmos apenas a diferença do ano atual com o de nascimento (2022 - 2013) o resultado é 9 anos, pois o dia e mês atual estão antes do dia e mês do nascimento. Então, no código além da diferença entre anos, vamos comparar se o mês e dia atual estão antes ou depois da data de nascimento, para isso, podemos fazer uma simples comparação: (today.month, today.day) < (i.month, i.day)
Se o mês e dia atual estiverem antes do nascimento o retorno será True e será descontado 1 ano a menos na idade, se eles estiverem depois, o retorno será False e nada acontecerá. Os valores de cada cálculo são armazenados na lista idades
conforme o código a seguir:
today = date.today()
id = []
for i in df_novo['data_nascimento']:
id.append(today.year - i.year - ((today.month, today.day) < (i.month, i.day)))
Vale ressaltar que esse laço pode demandar um bom tempo de execução caso o seu banco de dados seja muito grande, pois ele calcula os elementos linha a linha.
Por fim, colocamos os valores das idades em uma nova coluna no DataFrame chamada de idades:
df_novo['idades'] = id
df_novo
O resultado final pode ser analisado abaixo:
| data_nascimento | idades |
---|
0 | 2000-11-09 | 21 |
1 | 2013-10-31 | 8 |
2 | 1998-02-17 | 23 |
3 | 1998-02-17 | 23 |
4 | 1998-02-17 | 23 |
5 | 2001-05-28 | 20 |
6 | 1998-02-17 | 23 |
Espero ter ajudado!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!