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

2024-04-29 15:35:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个按时间索引的pandas数据帧:(使用python3.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

我只需要一个列表,其中包含每小时分辨率的消耗值:

^{pr2}$

换句话说:我需要一个每天的列表:包含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 

对于全年,可以类似地使用多个For loop或switch case语句来完成,以考虑不同月份(28/29/30/31天)。在

但我很肯定,由于时间指数的关系,肯定会有更简单的方法。 我也试过使用,但没有成功

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

我很乐意为您提供一些如何有效地做到这一点的提示


Tags: 数据inpandas列表fordata时间分辨率
1条回答
网友
1楼 · 发布于 2024-04-29 15:35:01

给定一个索引为DatetimeIndex的Pandas数据帧,您可以使用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

^{pr2}$

这是更快的,因为它不必关注索引,但它确实依赖于每天正好有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

相关问题 更多 >