Tenho dados do mercado de ações para uma única segurança que remonta a 20 anos. Os dados estão atualmente em um DataFrame do Pandas, no seguinte formato:
O problema é que eu não quero nenhum dado comercial "fora do horário comercial" no meu DataFrame. O mercado em questão está aberto das 9:30 às 16:00 (09:30 às 16:00 em cada dia de negociação). Gostaria de eliminar todas as linhas de dados que não estão dentro desse período.
Meu instinto é usar uma máscara de pandas, que eu sei fazer se quisesse certas horas em um único dia:
mask = (df['date'] > '2015-07-06 09:30:0') & (df['date'] <= '2015-07-06 16:00:0')
sub = df.loc[mask]
No entanto, não tenho idéia de como usá-lo em uma base rotativa para remover os dados para determinadas horas do dia durante um período de 20 anos.
date
. Você poderia executar este comandoprint(df['date'].map(type))
e postar sua saída na pergunta?Respostas:
O problema aqui é como você está importando dados. Não há indicador se 04:00 é am ou pm? mas com base nos seus comentários, precisamos assumir que é PM. No entanto, a entrada está mostrando como AM.
Para resolver isso, precisamos incluir duas condições com a cláusula OR.
Entrada:
Acima não é uma boa prática, e eu desencorajo fortemente a usar esse tipo de dados ambíguos. A solução de longo prazo é preencher corretamente os dados com am / pm.
Podemos alcançá-lo de duas maneiras, no caso de formato de dados correto:
1) usando datetime
2) usando entre o tempo, que funciona apenas com o índice de data e hora
Se você ainda enfrentar um erro, edite sua pergunta com abordagem linha a linha e erro exato.
fonte
TypeError: Index must be DatetimeIndex
between_time
quadro de dados é um índice de data e hora. OP pode tentar a nível trama de dados:day_df = df.set_index('date').between_time('9:30', '16:00')
.TypeError: Index must be DatetimeIndex
.TypeError: Index must be DatetimeIndex
.Acho que a resposta já está nos comentários (@ parfait's .between_time ), mas que se perdeu em problemas de depuração. Parece que sua
df['date']
coluna ainda não é do tipoDatetime
.Isso deve ser suficiente para corrigir isso e obter o resultado necessário:
fonte
Este código de exemplo consolida as respostas fornecidas por Bhavesh Ghodasara, Parfait e jorijnsmit em um exemplo completo e comentado:
fonte