2017-01-16 127 views
0

讓我們考慮一個包含每2010年1月的一個月中每天1列2個值的數據幀:Python中,熊貓:重新編制/切片數據幀重複的索引值

date_range = pd.date_range(dt(2010,1,1), dt(2010,1,31), freq='1D') 
df = pd.DataFrame(data = np.random.rand(len(date_range),2), index = date_range) 

與稀疏數據,另一個timeserie重複指數值:

observations = pd.DataFrame(data =np.random.rand(7,2), index = (dt(2010,1,12), 
dt(2010,1,18), dt(2010,1,20), dt(2010,1,20), dt(2010,1,22), dt(2010,1,22),dt(2010,1,28))) 

我分裂所述第一數據幀到df 5個DataFrames的列表,它們中的每含1周價值的數據從原始:df_weeks = [g for n, g in df.groupby(pd.TimeGrouper('W'))]

現在我想將第二個DataFrame的數據分割5周。即在那個特定情況下,這意味着結束於包含與df_weeks相同的時間範圍的5個DataFrame的變量obs_weeks,其中2個是空的。

我嘗試使用reindex如在這樣一個問題:Python, Pandas: Use the GroupBy.groups description to apply it to another grouping

和期間:

p1 =[x.to_period() for x in list(df.groupby(pd.TimeGrouper('W')).groups.keys())] 
p1 = sorted(p1) 
dfs=[] 
for p in p1: 
    dff = observations.truncate(p.start_time, p.end_time) 
    dfs.append(dff) 

(參照這樣的問題:Python, Pandas: Boolean Indexing Comparing DateTimeIndex to Period

的問題是,如果在索引中的某些值的observations是重複的(並且情況是這樣)沒有那些方法功能。我也嘗試將observations的索引更改爲普通列,並對該列進行切片,但我也收到了錯誤消息。

回答

1

你可以做一個簡單的過濾器實現這一目標:

p1 = [x.to_period() for x in list(df.groupby(pd.TimeGrouper('W')).groups.keys())] 
p1 = sorted(p1) 
dfs = [] 
for p in p1: 
    dff = observations.ix[ 
     (observations.index >= p.start_time) & 
     (observations.index < p.end_time)] 
    dfs.append(dff)