Ich habe Börsendaten für ein einzelnes Wertpapier, die 20 Jahre zurückreichen. Die Daten befinden sich derzeit in einem Pandas DataFrame im folgenden Format:
Das Problem ist, dass ich keine Handelsdaten außerhalb der Geschäftszeiten in meinem DataFrame haben möchte. Der betreffende Markt ist von 9:30 bis 16:00 Uhr (09:30 bis 16:00 Uhr an jedem Handelstag) geöffnet. Ich möchte alle Datenzeilen löschen, die nicht innerhalb dieses Zeitrahmens liegen.
Mein Instinkt ist es, eine Pandas-Maske zu verwenden, die ich zu tun weiß, wenn ich bestimmte Stunden an einem einzigen Tag haben möchte:
mask = (df['date'] > '2015-07-06 09:30:0') & (df['date'] <= '2015-07-06 16:00:0')
sub = df.loc[mask]
Ich habe jedoch keine Ahnung, wie ich eine Daten auf revolvierender Basis verwenden soll, um die Daten für bestimmte Tageszeiten über einen Zeitraum von 20 Jahren zu entfernen.
date
. Könnten Sie diesen Befehl ausführenprint(df['date'].map(type))
und seine Ausgabe an die Frage senden?Antworten:
Problem hier ist, wie Sie Daten importieren. Es gibt keine Anzeige, ob 04:00 Uhr oder Uhr ist? Aufgrund Ihrer Kommentare müssen wir jedoch davon ausgehen, dass es sich um eine PM handelt. Die Eingabe zeigt es jedoch als AM an.
Um dies zu lösen, müssen wir zwei Bedingungen in die OR-Klausel aufnehmen.
Eingang:
Oben ist keine gute Praxis, und ich rate dringend davon ab, diese Art von mehrdeutigen Daten zu verwenden. Langzeitlösung besteht darin, Daten korrekt mit am / pm zu füllen.
Bei korrektem Datenformat können wir dies auf zwei Arten erreichen:
1) mit datetime
2) Verwenden zwischen Zeit, die nur mit Datetime Index funktioniert
Wenn Sie immer noch auf Fehler stoßen, bearbeiten Sie Ihre Frage zeilenweise und mit genauem Fehler.
quelle
TypeError: Index must be DatetimeIndex
between_time
dass der Datenrahmen ein Datetime-Index sein muss. OP kann es auf DataFrame-Ebene versuchen :day_df = df.set_index('date').between_time('9:30', '16:00')
.TypeError: Index must be DatetimeIndex
.TypeError: Index must be DatetimeIndex
.Ich denke, die Antwort ist bereits in den Kommentaren (@ Parfaits .between_time ), aber dass sie bei Debugging-Problemen verloren gegangen ist. Es scheint, dass Ihre
df['date']
Spalte noch nicht vom TypDatetime
ist.Dies sollte ausreichen, um dies zu beheben und das erforderliche Ergebnis zu erzielen:
quelle
Dieser Beispielcode fasst die Antworten von Bhavesh Ghodasara, Parfait und jorijnsmit in einem vollständigen, kommentierten Beispiel zusammen:
quelle