【问题标题】:How to generate daily lists from pandas time series如何从 pandas 时间序列生成每日列表
【发布时间】:2014-07-02 17:19:02
【问题描述】:

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

对于全年而言,可以使用多个 for 循环或 switch case 语句来完成类似的操作,以考虑不同的月份(28/29/30/31 天)。

但由于时间索引,我很确定必须有一种更简单的方法。 我也尝试过使用但没有成功

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

我很高兴有一些提示如何有效地做到这一点

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-05-29
      • 2016-04-07
      • 2022-12-14
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 2018-11-29
      • 2020-05-10
      相关资源
      最近更新 更多