2012-07-06 111 views
4

我正在使用熊貓分析財務記錄。在日期範圍內切片熊貓數據框

我有一個來自一個CSV文件看起來像這樣一個DataFrame

<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 800 entries, 2010-10-27 00:00:00 to 2011-07-12 00:00:00 
Data columns: 
debit      800 non-null values 
transaction_type   799 non-null values 
transaction_date_raw  800 non-null values 
credit      800 non-null values 
transaction_description 800 non-null values 
account_number    800 non-null values 
sort_code     800 non-null values 
balance     800 non-null values 
dtypes: float64(3), int64(1), object(4) 

我基於交易量選擇一個子集:

c1 = df['credit'].map(lambda x: x > 1000) 
milestones = df[c1].sort() 

,並希望創建的切片原始DF基於里程碑之間的日期:

delta = dt.timedelta(days=1) 
for i in range(len(milestones.index)-1): 
     start = milestones.index[i].date() 
     end = milestones.index[i+1].date() - delta 
     rng = date_range(start, end) 

th將生成一個新的系列,其中包含我的里程碑之間的日期。

<class 'pandas.tseries.index.DatetimeIndex'> 
[2010-11-29 00:00:00, ..., 2010-12-30 00:00:00] 
Length: 32, Freq: D, Timezone: None 

我跟了幾種方法使用這些新系列(RNG)切開我的DF,但都失敗了:

df.ix[start:end] or 
df.ix[rng] 

這引起了:IndexError:無效片

df.reindex(rng) or df.reindex(index=rng) 

提出:例外:Reindexing只對唯一有價值的索引對象有效

x = [v for v in rng if v in df.index] 
df[x] 
df.ix[x] 
df.index[x] 

這也引起了無效片,也是如此:

df.truncate(start, end) 

我是新來的大熊貓,我正在關注的書從奧賴利的提前釋放,充分地享受它。任何指針將不勝感激。

回答

1

我已經成功地規避一些問題上面強調,這裏是一個「解決方案」,直到她常提到的錯誤都解決了。

我從以前的原始TimeSeries索引DataFrame開始。我對df進行排序,按日期排序記錄(使用TimeSeries索引)。

df = df.sort() 

一旦排序我替換df。用數字索引的索引

df.index = range(len(df)) 

隨後,我像以前提取我的里程碑與區別,現在這些都將有一個指數,這是一個積極的int和創建索引列表:

milestones_list = milestones_df.index.tolist() 

和提取從原始我的里程碑之間的數據DF用數字指標像這樣:

datasets = {} 
    for milestone in milestones_list: 
     milestone_index = milestones_list.index(milestone) 
     print "milestone {0} index {1}".format(milestone, milestone_index) 
     if milestone_index < len(milestones_list) -1: 
      x = df[milestones_df.index[milestone_index]:milestones_df.index[milestone_index+1]] 
     else: 
      x = df[milestones_df.index[milestone_index]:df.index.max()] 

     n = str(int(x.index.min())) +'-'+ str(int(x.index.max())) 
     datasets[n] = x 

這創造了一個字典與DataFrames爲命名爲印出每個里程碑時間間隔x代表它們的間隔。

print datasets.keys() 
['592-650', '448-527', '382-447', '264-318', '319-381', '118-198', '528-591', '728-798', '54-117', '199-263', '651-727'] 

雖然承認不是理想的解決方案,但我希望它能幫助有類似問題的人。