2014-07-02 2 views
0

У меня есть панд dataframe индексированной по времени: (используя питон 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, содержащий значения (одно значение для каждого часа дня). И все они должны быть упакованы вместе в список.

Таким образом, данные [0] предоставят мне список, содержащий 24 значения потребления в первый день.

Что я сделал еще:

За один месяц вместо целого года, это может выглядеть следующим образом:

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

За весь год это может быть сделано аналогично с более чем один для петли или оператора case switch, чтобы учитывать разные месяцы (28/29/30/31 дней).

Но я уверен, что должен быть более простой способ из-за индекса времени. Я также пытался использовать, но без успеха

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

Я был бы очень рад, что для некоторых подсказок, как сделать это эффективно

ответ

2

Учитывая Панды DataFrame, индекс которого является 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 
Смежные вопросы