Tenho um dataframe que mostra detalhes sobre funcionários e o local em que estão e as posições que ocuparam. O dataframe tem colunas para Site Id, Employee ID e StartDate (além de muitos outros campos). Tenho isso classificado por Site e Employee ID ASC e, em seguida, EffectiveDate DESC (o registro mais recente é o primeiro)
Site EmployeeID StartDate
1 123 2024-09-01
1 123 2024-08-01
1 123 2024-06-01
1 123 2024-05-01
2 100 2024-06-01
2 100 2024-03-01
Preciso criar uma nova coluna chamada EndDate
que é a data do registro anterior menos 1 dia. Estamos mudando para um novo sistema, então só nos importamos com as datas que incluem o intervalo 7/1/24 (ou depois). Então, para meu exemplo df, ficaria assim
Site EmployeeID StartDate EndDate Import
1 123 2024-09-01 Y
1 123 2024-08-01 2024-08-31 Y
1 123 2024-06-01 2024-07-31 Y
1 123 2024-05-01 2024-05-31 N
2 100 2024-06-01 Y
2 100 2024-03-01 2024-05-31 N
E então filtrando paradf['Import'] ='Y'
Minha ideia inicial era iterar df.groupby(by=['Site','EmployeeID'])
e usar .iloc[]
para obter os próximos valores de data, subtrair 1 dia, verificar se é EndDate
maior que 7/1/24 e, em seguida, definir Importar para Y
ou N
conforme necessário. O problema é que este é um conjunto de dados muito grande (~300 mil linhas) e esta operação levaria muito tempo.
Converta datas para data e hora, para que você possa
groupby
usar["Site", "EmployeeID"]
etransform
conforme necessário.Você pode usar
groupby.shift
, subtrair 1 dia comTimedelta
. Crie a coluna Import comnumpy.where
:Saída: