Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Trabalhando com datas...

Boa noite, a dúvida que tenho é bem simples:

eu gostaria que todas as datas referentes ao mês de dezembro de 2021 fosse colocadas em uma lista... escrevi essas linhas de comando mas consegui o resultado esperado... pesquisei um monte na internet tbm, só encontrei informações de como formatar as datas, etc...

for fluxo in dataset.iloc[:, 10]:
    if fluxo == date(2021, 12, ...?? ):
    dez_2021.append(fluxo)

desde já agradeço...

6 respostas

Oi, gtferronato! Tudo bom com você? Eu espero que sim!

Existem várias formas de fazer isso, mas como eu não tenho acesso ao seu banco de dados, fiz um com 8 datas aleatórias do ano de 2021. Então você pode usar esse código como base para o seu, tudo bem?

Bom, eu entendi que você está trabalhando com um DataFrame, correto? Então montei um DataFrame de nome df no qual eu defini as datas e nomes aleatórios:

import pandas as pd
df = pd.DataFrame({'Nome': ['Ary', 'Cátia', 'Denis', 'Beto', 'Bruna', 'Dara', 'Carlos', 'Alice'],
                   'Data': ['2021-12-23','2021-12-20','2021-01-22','2021-12-20','2021-03-03','2021-12-12','2021-12-23','2021-11-15']})
df

Resultado de df:

NomeData
0Ary2021-12-23
1Cátia2021-12-20
2Denis2021-01-22
3Beto2021-12-20
4Bruna2021-03-03
5Dara2021-12-12
6Carlos2021-12-23
7Alice2021-11-15

Primeiro, precisamos tornar a coluna Data uma coluna com valores em formato datetime, pois atualmente ele está definido como string. Então, para realizar essa transformação, utilizamos o comando pd.to_datetime() para que seja retornado uma Series de valores em formato datetime, do seguinte modo:

df.Data = pd.to_datetime(df.Data)

Depois definimos as datas limites para o mês de dezembro de 2021, ou seja, do dia 1° de dezembro de 2021 e dia 31 de dezembro de 2021:

data_inicial = '2021-12-1'
data_final = '2021-12-31'

Logo após preparei uma variável selecionadora que define como 'True' quais linhas do nosso DataFrame tem datas no mês de dezembro de 2021 utilizando de comparadores lógicos:

selecionador = (df['Data'] >= data_inicial) & (df['Data'] <= data_final)
selecionador

Resultado:

Data
0True
1True
2False
3True
4False
5True
6True
7False

Pela saída obtida do selecionador podemos ver que ele encontrou corretamente cada data no mês de dezembro.

Agora é possível selecionar todas as datas do DataFrame, para isso, utilizamos a variável selecionador com o método .loc[] obtendo a Series do DataFrame do seguinte modo:

dez_2021 = df.Data.loc[selecionador]

Para transformar a série selecionada em uma lista, utilizamos o método tolist() do pandas:

dez_2021 = df.Data.loc[selecionador].tolist()

#Retorno:
[Timestamp('2021-12-23 00:00:00'),
 Timestamp('2021-12-20 00:00:00'),
 Timestamp('2021-12-20 00:00:00'),
 Timestamp('2021-12-12 00:00:00'),
 Timestamp('2021-12-23 00:00:00')]

No entanto, isso retorna os valores em formato datetime, caso você deseje que os valores estejam em string você pode utilizar o método dt.strftime('%Y-%m-%d') do pandas:

dez_2021 = df.Data.loc[selecionador].dt.strftime('%Y-%m-%d').tolist()

#Retorno:
['2021-12-23', '2021-12-20', '2021-12-20', '2021-12-12', '2021-12-23']

Se essa sugestão não funcionar tão bem com seus dados, você pode me retornar aqui o seu código completo (incluindo seu DataFrame) que eu estarei a disposição para te ajudar melhor ;-)

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá Mirla Borges, tudo bem por aqui. E vc? Percebi que talvez minha dúvida não seja tão simples... não sei se posso compartilhar a tabela por se tratar da fila de espera dos pacientes a serem atendidos pelo setor de Psicologia onde trabalho. Tem cerca de 5.000 encaminhamentos desde 2011... então é dado pra caramba... Minha intenção é filtrar a demanda mensal da unidade, eu cheguei a fazer isso mas fiz com que o excel calculasse a diferença entre a data do encaminhamento e o dia 31/12/2021, daí no python eu fiz o agrupamento desses dados:

import pandas as pd 

dataset = pd.read_excel('dados-simples.xlsx')

dez_2021 = []
nov_2021 = []
out_2021 = []
set_2021 = []
ago_2021 = []
jul_2021 = []
jun_2021 = []
mai_2021 = []
abr_2021 = []
mar_2021 = []
fev_2021 = []
jan_2021 = []

for fluxo in dataset.loc[:,  'Tempo']:
  if fluxo == 0:
    dez_2021.append(fluxo)
  elif fluxo == 1:
    nov_2021.append(fluxo)
  elif fluxo == 2:
    out_2021.append(fluxo)
  elif fluxo == 3:
    set_2021.append(fluxo)
  elif fluxo == 4:
    ago_2021.append(fluxo)
  elif fluxo == 5:
    jul_2021.append(fluxo)
  elif fluxo == 6:
    jun_2021.append(fluxo)
  elif fluxo == 7:
    mai_2021.append(fluxo)
  elif fluxo == 8:
    abr_2021.append(fluxo)
  elif fluxo == 9:
    mar_2021.append(fluxo)
  elif fluxo == 10:
    fev_2021.append(fluxo)
  elif fluxo == 11:
    jan_2021.append(fluxo)

vinteumdf = (len(jan_2021), len(fev_2021), len(mar_2021), len(abr_2021), len(mai_2021), len(jun_2021), len(jul_2021), len(ago_2021), len(set_2021), len(out_2021), len(nov_2021), len(dez_2021))

vinteum = pd.DataFrame(vinteumdf, index=['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'], columns=['2021'])

Esse foi o código que usei para agrupar os encaminhamentos de 2021, contudo, como gosto de poupar tempo, gostaria de saber se existe uma maneira mais fácil...

Tentando replicar a explicação que vc deu eu encontrei a função pd.date_range(), mas não sei como usá-la ou se pode ser usada para esse fim. Tentei da seguinte forma, com a mesma base de dados:

dataset.Entrada = pd.to_datetime(dataset.Entrada)

nov_2021 = []

for fluxo in dataset.loc[:, 'Entrada']:
  if fluxo == pd.date_range(start= 2021-11-1, end= 2021-11-30):
    nov_2021.append(fluxo)

Mas isso retorna o seguinte erro:

/usr/local/lib/python3.7/dist-packages/ipykernellauncher.py:2: DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use array.size > 0 to check that an array is not empty.

Desde já agradeço a atenção. Abraço

Olá gtferronato! Tudo bem?

Entendi melhor a situação de filtrar os meses, obrigada pela explicação!

É uma ótima opção utilizar pd.date_range() para esse caso com tantas condicionais. No entanto, esse erro surgiu devido o as entradas colocadas nos parâmetros start e end que precisam estar no formato de string ou datetime e da forma forma como você apresentou nenhum desses dados seguem essa estrutura. Então uma solução é colocar essas datas entre aspas:

for fluxo in dataset.loc[:, 'Entrada']:
  if fluxo == pd.date_range(start = '2021-11-1', end = '2021-11-30'):

Vale ressaltar que esse método vai retornar datas no formato AAAA-mm-dd (ano-mês-dia) então é bom ficar de olho se o seu banco de dados também mantém esse formato de data.

Vou deixar aqui também o link para a documentação do método date_range para você também dar uma olhada em outros parâmetros que podem ser úteis.

Eu espero que essa explicação tenha te ajudado no seu projeto. Se a dúvida persistir peço que, por favor, informe aqui para que eu possa te ajudar da melhor forma possível.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Oi oi, como está vc Mirla? fiz como vc sugeriu... mas retornou outro erro:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

tentei procurar na internet uma solução, mas dá a impressão que a maioria das explicações complica mais que soluciona :(

abraço

solução!

Olá! Tudo bem?

Nossa, agora foi um erro meu em não olhar bem a estrutura, perdão :(

A variável de comparação do if não pode ser o == e sim um in:

for fluxo in dataset.loc[:, 'Entrada']:
  if fluxo in pd.date_range(start = '2021-11-1', end = '2021-11-30'):

Isso se deve pois pd.date_range() retorna uma variável iterável como uma lista, e verificamos se a variável fluxo está contida nessa lista.

Novamente, peço desculpas pela falta de atenção. Espero que agora funcione :D

Mas claro, se o problema persistir, informe aqui para que eu possa te ajudar da melhor forma possível.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Agora sim hein.... muito obrigado pela ajuda :)))