Moje dane mogą mieć wiele wydarzeń w określonym dniu lub ŻADNYCH wydarzeń w danym dniu. Biorę te wydarzenia, liczę według daty i wykreślam je. Jednak kiedy je wykreślam, moje dwie serie nie zawsze pasują.
idx = pd.date_range(df['simpleDate'].min(), df['simpleDate'].max())
s = df.groupby(['simpleDate']).size()
W powyższym kodzie idx staje się zakresem powiedzmy 30 dat. 09-01-2013 do 09-30-2013 Jednak S może mieć tylko 25 lub 26 dni, ponieważ żadne wydarzenia nie miały miejsca w danym dniu. Otrzymuję wtedy AssertionError, ponieważ rozmiary nie pasują do siebie, gdy próbuję wykreślić:
fig, ax = plt.subplots()
ax.bar(idx.to_pydatetime(), s, color='green')
Jaki jest właściwy sposób rozwiązania tego problemu? Czy chcę usunąć daty bez wartości z IDX, czy (co wolałbym zrobić) dodać do serii brakującą datę z liczbą 0. Wolałbym mieć pełny wykres 30 dni z 0 wartościami. Jeśli to podejście jest słuszne, czy masz jakieś sugestie, jak zacząć? Czy potrzebuję jakiejś reindex
funkcji dynamicznej ?
Oto fragment S ( df.groupby(['simpleDate']).size()
), nie zauważ żadnych wpisów dla 04 i 05.
09-02-2013 2
09-03-2013 10
09-06-2013 5
09-07-2013 1
reindex
to niesamowita funkcja. Może (1) zmienić kolejność istniejących danych, aby dopasować je do nowego zestawu etykiet, (2) wstawić nowe wiersze, w których wcześniej nie istniała żadna etykieta, (3) wypełnić dane dla brakujących etykiet, (w tym przez wypełnienie do przodu / do tyłu) (4) wybrać wiersze według etykiety!idx = pd.date_range(df.index.min(), df.index.max())
Szybszym obejściem jest użycie
.asfreq()
. Nie wymaga to tworzenia nowego indeksu do wywołania.reindex()
.źródło
date_range
ponieważ niejawnie używa pierwszego i ostatniego indeksu jako początku i końca (co prawie zawsze chcesz).Jednym z problemów jest
reindex
niepowodzenie, jeśli istnieją zduplikowane wartości. Załóżmy, że pracujemy z danymi ze znacznikiem czasu, które chcemy indeksować według daty:plony
Ze względu na zduplikowaną
2016-11-16
datę próba ponownego zindeksowania:zawodzi z:
(przez to oznacza, że indeks ma duplikaty, a nie że sam jest dupkiem)
Zamiast tego możemy użyć
.loc
do wyszukania wpisów dla wszystkich dat w zakresie:plony
fillna
może być użyty w serii kolumn do wypełnienia pustych miejsc w razie potrzeby.źródło
Blanks
lubNULLS
?df.loc[all_days]
nie zadziała w takim przypadku.Alternatywnym podejściem jest to
resample
, że oprócz brakujących dat można obsłużyć zduplikowane daty. Na przykład:resample
jest operacją odroczoną,groupby
więc musisz po niej wykonać inną operację. W tym przypadkumean
działa dobrze, ale można również korzystać z wielu innych metod, takich jak pandymax
,sum
itpOto oryginalne dane, ale z dodatkowym wpisem „2013-09-03”:
A oto wyniki:
Pozostawiłem brakujące daty jako NaN, aby wyjaśnić, jak to działa, ale możesz dodać,
fillna(0)
aby zastąpić NaN zerami zgodnie z żądaniem OP lub alternatywnie użyć czegoś takiego, jakinterpolate()
wypełnienie wartościami niezerowymi na podstawie sąsiednich wierszy.źródło
Oto fajna metoda wypełniania brakujących dat w ramce danych, z wyborem
fill_value
,days_back
wypełnieniem i kolejnością sortowania (date_order
), według której sortować ramkę danych:źródło