2012-12-11 46 views
1

目的:上預製的指數數據清洗後果

要創建容納預先存在的一系列價格數據從CSV文件的索引。我可以使用列表推導構建一個索引。如果以這種方式完成的話,那麼施工會給我一個長度爲86,772的過濾清單 - 當運行超過1/3/2007-8/30/2012 42次時(即10分鐘間隔)。但是,我的csv價格數據長度爲62,034。請注意,長度差異是由於數據清理問題

這就是說,我不知道如何克服真實數據和這個預建(列表比較)數據幀之間的明顯不匹配。

嘗試:我使用的前兩行不正確

是誰?

data=pd.read_csv('___.csv', parse_dates={'datetime':[0,1]}).set_index('datetime') 

dt_index = pd.DatetimeIndex([datetime.combine(i.date,i.time) for i in data.index]) 

ts = pd.Series(data.prices.values, dt_index) 

問題:

  1. 據我瞭解,我應該使用 '合併',因爲我想指數編制由我csv文件完全知情。並且,'combine'返回一個新的datetime對象,其日期分量等於給定的日期對象,並且其時間分量等於給定的時間對象。

  2. 當我parse_dates時,它是否把時間和日期合併在一起,並認爲它是'日期'?

  3. 有沒有更好的方法來實現既定目標?

回溯錯誤:

AttributeError: 'unicode' object has no attribute 'date'

+0

我添加了一個例子,我的答案,但我認爲這可能是添加的第一個有用你的數據集中有幾行(例如輸出數據[:3]')。您的日期或時間可能是畸形的,並且沒有正確轉換? –

回答

2

如下您可以整齊地寫:

ts = df1.prices 

下面是一個例子:

In [1]: df = pd.read_csv('prices.csv', 
        parse_dates={'datetime': [0,1]}).set_index('datetime') 

In [2]: df # dataframe 
Out[2]: 
        prices duty 
datetime     
2012-11-12 10:00:00  1  0 
2012-12-12 10:00:00  2  0 
2012-12-12 10:00:00  3  1 


In [3]: df.prices # timeseries 
Out[3]: 
datetime 
2012-11-12 10:00:00 1 
2012-12-12 10:00:00 2 
2012-12-12 11:00:00 3 
Name: prices 

In [4]: ts = df.prices 

可以GROUPBY日期像這樣(類似於this example from the docs):

In [5]: key = lambda x: x.date() 

In [6]: df.groupby(key).sum() 
Out[6]: 
      prices duty 
2012-11-12  1  0 
2012-12-12  5  1 

In [7]: ts.groupby(key).sum() 
Out[7]: 
2012-11-12 1 
2012-12-12 5 

prices.csv包含:

date,time,prices,duty 
11/12/2012,10:00,1,0 
12/12/2012,10:00,2,0 
12/12/2012,11:00,3,1 
+0

索引不被解析爲時間戳。看看錯誤消息:它是unicode。所以ts不會有時間序列。 – bmu

+0

你是對的,但OP的回溯表明這是一個unicode字符串。也許他使用不同的熊貓版本。也許是 – bmu

+0

。然而,我會upvote你的答案,因爲我不知道在這種情況下我不需要'index_col'。 – bmu