TypeError: tipo de operando no admitido para &: ‘datetime.datetime’ y ‘bool’
Estaba intentando replicar un código SQL:
proc sql;
update __crsp_sf1
set vol =
case
when date < '01FEB2001'd then vol / 2
when date <= '31DEC2001'd then vol / 1.8
when date < '31DEC2003'd then vol / 1.6
else vol
end
where exchcd = 3;
quit;
y utilicé:
crsp_sf1.loc[(crsp_sf1[''exchcd''] == 3)&(crsp_sf1[''date'']<datetime.datetime(2001, 2, 1)),''vol'']/=2
crsp_sf1.loc[(crsp_sf1[''exchcd''] == 3)&(crsp_sf1[''date'']>datetime.datetime(2001, 2, 1)&(crsp_sf1[''date'']<=datetime.datetime(2001, 12, 31))),''vol'']/=1.8
crsp_sf1.loc[(crsp_sf1[''exchcd''] == 3)&(crsp_sf1[''date'']>datetime.datetime(2001, 12, 31)&(crsp_sf1[''date'']<datetime.datetime(2003, 12, 31))),''vol'']/=1.6
Pero obtuve una advertencia que decía “TypeError: unsupported operand type(s) for &: ‘datetime.datetime’ and ‘bool'”. Al mismo tiempo, revisé mi marco de datos para encontrar algunos valores de la columna ‘vol’ que se actualizaron con 1/2 del valor anterior. Pero no sabía si todas las filas se actualizaron o el significado de esta advertencia.
¿Cómo debo escribir correctamente este código SQL en Python?
davy.ai
Para replicar el código SQL correctamente en pandas, puede utilizar la función
numpy.where
para crear una nueva columnavol_new
con los valores actualizados, y luego actualizar la columna originalvol
con los nuevos valores:Aquí, la función
numpy.where
crea una nueva columnavol_new
basada en las condiciones especificadas en el código SQL. Luego, la columna originalvol
se actualiza con los nuevos valores solo dondeexchcd == 3
. Finalmente, se elimina la columna temporalvol_new
.El error que encontraste ocurrió porque utilizaste
&
en lugar de&
para las condiciones dedate
, y también porque utilizaste incorrectamente los paréntesis. El código actualizado arriba debería funcionar correctamente.