如何从Pandas时间序列生成每日列表
我有一个用时间作为索引的pandas数据框:(使用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
如果能给我一些高效的方法建议,我会非常感激。
1 个回答
4
假设你有一个Pandas的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的技巧:
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