2012-11-13 31 views
15

Mam nazwę słownika date_dict, wpisaną przez daty datetime z wartościami odpowiadającymi liczbie całkowitych obserwacji. Konwertuję to na rzadką serię/ramkę danych z ocenzurowanymi obserwacjami, które chciałbym dołączyć lub przekonwertować na serię/ramkę danych z ciągłymi datami. Złe zrozumienie list jest moim hackem, aby obejść fakt, że pandy najwyraźniej nie będą automatycznie ukrywać datetime obiektów do odpowiedniego indeksu DateTime.Wypełnianie ramki danych pandy ciągłej z rozproszonej ramki danych

df1 = pd.DataFrame(data=date_dict.values(), 
        index=[datetime.datetime.combine(i, datetime.time()) 
          for i in date_dict.keys()], 
        columns=['Name']) 
df1 = df1.sort(axis=0) 

Ten przykład zawiera 1258 obserwacji, a indeks DateTime obejmuje okres od 2003-06-24 do 2012-11-07.

df1.head() 
      Name 
Date 
2003-06-24 2 
2003-08-13 1 
2003-08-19 2 
2003-08-22 1 
2003-08-24 5 

można utworzyć puste dataframe z ciągłą wskaźnika DateTime, ale wprowadza to kolumny niepotrzebne i wydaje niezgrabne. Mam wrażenie, że brakuje mi bardziej eleganckiego rozwiązania, które wiąże się z dołączeniem.

df2 = pd.DataFrame(data=None,columns=['Empty'], 
        index=pd.DateRange(min(date_dict.keys()), 
             max(date_dict.keys()))) 
df3 = df1.join(df2,how='right') 
df3.head() 
      Name Empty 
2003-06-24 2 NaN 
2003-06-25 NaN NaN 
2003-06-26 NaN NaN 
2003-06-27 NaN NaN 
2003-06-30 NaN NaN 

istnieje prostszy i bardziej elegancki sposób, aby wypełnić ciągły dataframe z rzadkim dataframe tak, że nie jest (1) Ciągła indeks (2) nieliczby są 0s, (3), nie ma to pozostawiona pusta kolumna w ramce danych?

  Name 
2003-06-24 2 
2003-06-25 0 
2003-06-26 0 
2003-06-27 0 
2003-06-30 0 

Odpowiedz

20

Możesz po prostu użyć reindeksu w szeregach czasowych przy użyciu zakresu dat. Wygląda też na to, że lepiej byłoby użyć TimeSeries zamiast DataFrame (patrz documentation), ale ponowne indeksowanie jest również poprawną metodą dodawania brakujących wartości indeksów do DataFrames.

Na przykład, zaczynając od:

date_index = pd.DatetimeIndex([pd.datetime(2003,6,24), pd.datetime(2003,8,13), 
     pd.datetime(2003,8,19), pd.datetime(2003,8,22), pd.datetime(2003,8,24)]) 

ts = pd.Series([2,1,2,1,5], index=date_index) 

Daje szereg czasowy jak głowa swoim przykładzie dataframe za:

2003-06-24 2 
2003-08-13 1 
2003-08-19 2 
2003-08-22 1 
2003-08-24 5 

prostu robi

ts.reindex(pd.date_range(min(date_index), max(date_index))) 

następnie daje kompletny indeks , z NaN dla twoich brakujących wartości (możesz użyć fillna, jeśli chcesz wypełnić wartości ssania z pewnymi innymi wartościami - patrz here):

2003-06-24  2 
2003-06-25 NaN 
2003-06-26 NaN 
2003-06-27 NaN 
2003-06-28 NaN 
2003-06-29 NaN 
2003-06-30 NaN 
2003-07-01 NaN 
2003-07-02 NaN 
2003-07-03 NaN 
2003-07-04 NaN 
2003-07-05 NaN 
2003-07-06 NaN 
2003-07-07 NaN 
2003-07-08 NaN 
2003-07-09 NaN 
2003-07-10 NaN 
2003-07-11 NaN 
2003-07-12 NaN 
2003-07-13 NaN 
2003-07-14 NaN 
2003-07-15 NaN 
2003-07-16 NaN 
2003-07-17 NaN 
2003-07-18 NaN 
2003-07-19 NaN 
2003-07-20 NaN 
2003-07-21 NaN 
2003-07-22 NaN 
2003-07-23 NaN 
2003-07-24 NaN 
2003-07-25 NaN 
2003-07-26 NaN 
2003-07-27 NaN 
2003-07-28 NaN 
2003-07-29 NaN 
2003-07-30 NaN 
2003-07-31 NaN 
2003-08-01 NaN 
2003-08-02 NaN 
2003-08-03 NaN 
2003-08-04 NaN 
2003-08-05 NaN 
2003-08-06 NaN 
2003-08-07 NaN 
2003-08-08 NaN 
2003-08-09 NaN 
2003-08-10 NaN 
2003-08-11 NaN 
2003-08-12 NaN 
2003-08-13  1 
2003-08-14 NaN 
2003-08-15 NaN 
2003-08-16 NaN 
2003-08-17 NaN 
2003-08-18 NaN 
2003-08-19  2 
2003-08-20 NaN 
2003-08-21 NaN 
2003-08-22  1 
2003-08-23 NaN 
2003-08-24  5 
Freq: D, Length: 62 
+2

Dzięki! Użyłem ts.reindex (pd.date_range (min (date_index), max (date_index)), fill_value = 0) –

Powiązane problemy