Tengo datos del mercado de valores para un solo valor que se remonta a 20 años. Los datos se encuentran actualmente en un Pandas DataFrame, en el siguiente formato:
El problema es que no quiero ningún dato comercial "fuera de horario" en mi DataFrame. El mercado en cuestión está abierto de 9:30 a.m. a 4 p.m. (09:30 a 16:00 en cada día de negociación). Me gustaría descartar todas las filas de datos que no están dentro de este período de tiempo.
Mi instinto es usar una máscara de pandas, que sé cómo hacer si quisiera ciertas horas en un solo día:
mask = (df['date'] > '2015-07-06 09:30:0') & (df['date'] <= '2015-07-06 16:00:0')
sub = df.loc[mask]
Sin embargo, no tengo idea de cómo usar uno de forma rotativa para eliminar los datos de ciertos momentos del día durante un período de 20 años.
date
? ¿Podría ejecutar este comandoprint(df['date'].map(type))
y publicar su salida a la pregunta?Respuestas:
El problema aquí es cómo está importando datos. ¿No hay un indicador de si las 04:00 son am o pm? pero basándonos en sus comentarios, debemos asumir que es PM. Sin embargo, la entrada lo muestra como AM.
Para resolver esto, necesitamos incluir dos condiciones con la cláusula OR.
Entrada:
Lo anterior no es una buena práctica, y desaconsejo usar este tipo de datos ambiguos. La solución a largo plazo es llenar correctamente los datos con am / pm.
Podemos lograrlo de dos maneras en caso de formato de datos correcto:
1) usando datetime
2) uso entre tiempo, que solo funciona con índice de fecha y hora
Si aún enfrenta un error, edite su pregunta con el enfoque línea por línea y el error exacto.
fuente
TypeError: Index must be DatetimeIndex
between_time
el marco de datos debe ser un índice de fecha y hora. OP se puede tratar a nivel de trama de datos:day_df = df.set_index('date').between_time('9:30', '16:00')
.TypeError: Index must be DatetimeIndex
.TypeError: Index must be DatetimeIndex
.Creo que la respuesta ya está en los comentarios (@ Parfait's .between_time ) pero que se perdió en problemas de depuración. Parece que su
df['date']
columnaDatetime
aún no es de tipo .Esto debería ser suficiente para arreglar eso y obtener el resultado requerido:
fuente
Este código de ejemplo consolida las respuestas proporcionadas por Bhavesh Ghodasara, Parfait y jorijnsmit en un ejemplo completo y comentado:
fuente