如何从Pandas时间序列生成每日列表

1 投票
1 回答
1945 浏览
提问于 2025-04-18 11:54

我有一个用时间作为索引的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

撰写回答