2013-10-01 9 views
16

mam czas indeksowane dane:pandy - Rozszerzenie indeksu elementu DataFrame ustawiającego wszystkie kolumny dla nowych wierszy na NaN?

df2 = pd.DataFrame({ 'day': pd.Series([date(2012, 1, 1), date(2012, 1, 3)]), 'b' : pd.Series([0.22, 0.3]) }) 
df2 = df2.set_index('day') 
df2 
       b 
day    
2012-01-01 0.22 
2012-01-03 0.30 

Jaki jest najlepszy sposób, aby rozszerzyć tę ramkę danych tak, że ma jeden wiersz dla każdego dnia w styczniu 2012 roku (powiedzmy), gdzie wszystkie kolumny są ustawione na NaN (tutaj tylko b) gdzie nie mamy danych?

więc pożądany rezultat byłby:

   b 
day    
2012-01-01 0.22 
2012-01-02 NaN 
2012-01-03 0.30 
2012-01-04 NaN 
... 
2012-01-31 NaN 

Dziękujemy!

Odpowiedz

3

Można resample dniem jak częstotliwość, bez określania fill_method parametrów brakujących wartości będzie NaN wypełniona jak pożądane

df3 = df2.asfreq('D') 
df3 

Out[16]: 
       b 
2012-01-01 0.22 
2012-01-02 NaN 
2012-01-03 0.30 

Aby odpowiedzieć na drugą część, nie mogę myśleć o bardziej elegancki sposób na moment:

df3 = DataFrame({ 'day': Series([date(2012, 1, 4), date(2012, 1, 31)])}) 
df3.set_index('day',inplace=True) 
merged = df2.append(df3) 
merged = merged.asfreq('D') 
merged 


Out[46]: 
       b 
2012-01-01 0.22 
2012-01-02 NaN 
2012-01-03 0.30 
2012-01-04 NaN 
2012-01-05 NaN 
2012-01-06 NaN 
2012-01-07 NaN 
2012-01-08 NaN 
2012-01-09 NaN 
2012-01-10 NaN 
2012-01-11 NaN 
2012-01-12 NaN 
2012-01-13 NaN 
2012-01-14 NaN 
2012-01-15 NaN 
2012-01-16 NaN 
2012-01-17 NaN 
2012-01-18 NaN 
2012-01-19 NaN 
2012-01-20 NaN 
2012-01-21 NaN 
2012-01-22 NaN 
2012-01-23 NaN 
2012-01-24 NaN 
2012-01-25 NaN 
2012-01-26 NaN 
2012-01-27 NaN 
2012-01-28 NaN 
2012-01-29 NaN 
2012-01-30 NaN 
2012-01-31 NaN 

To buduje drugą serię czasową, a następnie po prostu dołączyć i nazywają asfreq('D') jak poprzednio.

+0

Dzięki - to jest wielki, aby wypełnić dziury, ale w jaki sposób można przedłużyć do '2012-01-31' (mówić). – paul

+0

Hmmh. Ale jeśli mam wiele dziur/przerw w mojej oryginalnej serii czasowej, to to już nie działa. – paul

+0

@paul Tak, moja odpowiedź jest ograniczona pod tym względem, nie mogę wymyślić bardziej ogólnej metody. Byłoby lepiej stworzyć DataFrame ze wszystkimi oczekiwanymi wartościami w pierwszej kolejności, jeśli możesz, będę mieć możliwość obejścia i zobaczę, czy mogę wymyślić coś lepszego – EdChum

17

Użyj tego:

ix = pd.DatetimeIndex(start=date(2012, 1, 1), end=date(2012, 1, 31), freq='D') 
df2.reindex(ix) 

Co daje:

   b 
2012-01-01 0.22 
2012-01-02 NaN 
2012-01-03 0.30 
2012-01-04 NaN 
2012-01-05 NaN 
[...] 
2012-01-29 NaN 
2012-01-30 NaN 
2012-01-31 NaN 
2

Oto kolejna opcja: Pierwszy dodać NaN rekord w ostatnim dniu chcesz, a następnie ponowne próbkowanie. W ten sposób resampling wypełni brakujące daty dla ciebie.

Zaczynając Rama:

import pandas as pd 
import numpy as np 
from datetime import date 

df2 = pd.DataFrame({ 'day': pd.Series([date(2012, 1, 1), date(2012, 1, 3)]), 'b' : pd.Series([0.22, 0.3]) }) 
df2= df2.set_index('day') 
df2 

Out: 
        b 
    day 
    2012-01-01 0.22 
    2012-01-03 0.30 

Wypełniony Rama:

df2 = df2.set_value(date(2012,1,31),'b',np.float('nan')) 
df2.asfreq('D') 

Out: 
       b 
    day 
    2012-01-01 0.22 
    2012-01-02 NaN 
    2012-01-03 0.30 
    2012-01-04 NaN 
    2012-01-05 NaN 
    2012-01-06 NaN 
    2012-01-07 NaN 
    2012-01-08 NaN 
    2012-01-09 NaN 
    2012-01-10 NaN 
    2012-01-11 NaN 
    2012-01-12 NaN 
    2012-01-13 NaN 
    2012-01-14 NaN 
    2012-01-15 NaN 
    2012-01-16 NaN 
    2012-01-17 NaN 
    2012-01-18 NaN 
    2012-01-19 NaN 
    2012-01-20 NaN 
    2012-01-21 NaN 
    2012-01-22 NaN 
    2012-01-23 NaN 
    2012-01-24 NaN 
    2012-01-25 NaN 
    2012-01-26 NaN 
    2012-01-27 NaN 
    2012-01-28 NaN 
    2012-01-29 NaN 
    2012-01-30 NaN 
    2012-01-31 NaN 
Powiązane problemy