Meine Daten können an einem bestimmten Datum mehrere Ereignisse oder an einem Datum KEINE Ereignisse enthalten. Ich nehme diese Ereignisse, zähle sie nach Datum und zeichne sie auf. Wenn ich sie jedoch zeichne, stimmen meine beiden Serien nicht immer überein.
idx = pd.date_range(df['simpleDate'].min(), df['simpleDate'].max())
s = df.groupby(['simpleDate']).size()
Im obigen Code wird idx zu einem Bereich von beispielsweise 30 Daten. 09-01-2013 bis 09-30-2013 S kann jedoch nur 25 oder 26 Tage haben, da für ein bestimmtes Datum keine Ereignisse aufgetreten sind. Ich erhalte dann einen AssertionError, da die Größen nicht übereinstimmen, wenn ich versuche zu zeichnen:
fig, ax = plt.subplots()
ax.bar(idx.to_pydatetime(), s, color='green')
Was ist der richtige Weg, um dies anzugehen? Möchte ich Datumsangaben ohne Werte aus IDX entfernen oder (was ich lieber tun möchte) das fehlende Datum mit einer Anzahl von 0 zur Serie hinzufügen? Ich möchte lieber ein vollständiges Diagramm von 30 Tagen mit 0 Werten haben. Wenn dieser Ansatz richtig ist, gibt es Vorschläge für den Einstieg? Benötige ich eine Art Dynamik?reindex
Funktion?
Hier ist ein Ausschnitt von S ( df.groupby(['simpleDate']).size()
), beachten Sie keine Einträge für 04 und 05.
09-02-2013 2
09-03-2013 10
09-06-2013 5
09-07-2013 1
reindex
ist eine erstaunliche Funktion. Es kann (1) vorhandene Daten neu anordnen, um sie mit einem neuen Satz von Beschriftungen abzugleichen, (2) neue Zeilen einfügen, in denen zuvor keine Beschriftung vorhanden war, (3) Daten für fehlende Beschriftungen füllen (einschließlich durch Vorwärts- / Rückwärtsfüllung) (4) Zeilen auswählen per Etikett!idx = pd.date_range(df.index.min(), df.index.max())
Eine schnellere Problemumgehung ist die Verwendung
.asfreq()
. Dies erfordert nicht die Erstellung eines neuen Index zum Aufrufen.reindex()
.quelle
date_range
da implizit der erste und der letzte Index als Start und Ende verwendet werden (was Sie fast immer wollen würden).Ein Problem ist, dass dies
reindex
fehlschlägt, wenn doppelte Werte vorhanden sind. Angenommen, wir arbeiten mit zeitgestempelten Daten, die wir nach Datum indizieren möchten:ergibt
Aufgrund des doppelten
2016-11-16
Datums wurde versucht, neu zu indizieren:schlägt fehl mit:
(Dies bedeutet, dass der Index Duplikate enthält und nicht, dass er selbst ein Dup ist.)
Stattdessen können wir
.loc
Einträge für alle Daten im Bereich nachschlagen:ergibt
fillna
kann für die Spaltenreihe verwendet werden, um bei Bedarf Lücken zu füllen.quelle
Blanks
oder enthältNULLS
?df.loc[all_days]
wird in diesem Fall nicht funktionieren.Ein alternativer Ansatz besteht darin
resample
, zusätzlich zu fehlenden Daten auch doppelte Daten zu verarbeiten. Beispielsweise:resample
ist eine verzögerte Operation wie diese,groupby
daher müssen Sie eine weitere Operation ausführen. In diesem Fallmean
gut funktioniert, aber Sie können auch viele andere Pandas Methoden wie verwendenmax
,sum
etc.Hier sind die Originaldaten, jedoch mit einem zusätzlichen Eintrag für '2013-09-03':
Und hier sind die Ergebnisse:
Ich habe die fehlenden Daten als NaNs belassen, um zu verdeutlichen, wie dies funktioniert. Sie können jedoch hinzufügen
fillna(0)
, um NaNs durch Nullen zu ersetzen, wie vom OP angefordert, oder alternativ so etwas wieinterpolate()
das Füllen mit Werten ungleich Null basierend auf den benachbarten Zeilen verwenden.quelle
Hier ist eine schöne Methode fehlenden Daten in einem Datenrahmen zu füllen, mit Ihrer Wahl
fill_value
,days_back
in zu füllen, und Sortierreihenfolge (date_order
) , mit der die Datenrahmen zu sortieren:quelle