2014-07-02 40 views
0

我有一個熊貓據幀時間爲指標:(使用python 3.X)如何從大熊貓的時間序列每日清單

2012-01-01 00:00:00 38406  
2012-01-01 01:00:00 36501  
2012-01-01 02:00:00 35305 

... 

2012-12-31 09:00:00 43121  
2012-12-31 10:00:00 44549  
2012-12-31 11:00:00 45635 

所有我需要的是包含在每小時分辨率消耗值列表的列表:

data =[[ 38406, 36501, 35305,...], [ x, y, z,...], [ ],....[ ]] 

換句話說:我需要一個每天的列表:包含24個值(每天一個小時的一個值)。它們應該全部放在一個列表中。

所以data [0]會給我一個包含第一天的24個消耗值的列表。

什麼,我還沒有完成:

一個月,而不是整個一年中,它可能是這樣的:

clusterInput=[None]*31 
for i in range(31): 
    a="2012-1-"+str(i+1) 
    subset=data[a] 
    clusterInput[i]=subset.values 

就全年而言是可以做到類似與一個以上的循環或開關情況聲明考慮不同的月份(28/29/30/31天)。

但我非常確定,由於時間索引,必須有更簡單的方法。 我也曾嘗試使用,但沒有成功

[list(x) for x in dt.T.iterrows()] /tuples and /items 

,我會很高興獲得一些提示如何做到這一點有效

回答

2

給出一個熊貓據幀,其指數是一個DatetimeIndex,您可以使用groupby方法將所有的行,其指數是相同的日期:

import pandas as pd 
import numpy as np 

dates = pd.date_range('2012-01-01', periods=24*3, freq='H') 
values = np.random.randint(100, size=len(dates)) 
df = pd.DataFrame({'amount':values}, index=dates) 

data = [grp['amount'].values.tolist() for key, grp in df.groupby([df.index.date])] 

不過,如果你只是想組每24行在一起,你可以使用grouper recipe

data = zip(*[iter(df['amount'])]*24) 

這樣做更快,因爲它不需要關注索引,但它確實依賴於每天有精確的24行,並且要分組的行是連續的。


In [36]: %timeit zip(*[iter(df['amount'])]*24) 
100000 loops, best of 3: 15.2 µs per loop 

In [37]: %timeit [grp['amount'].values.tolist() for key, grp in df.groupby([df.index.date])] 
1000 loops, best of 3: 1.19 ms per loop 

In [38]: 1190/15.2 
Out[38]: 78.28947368421053