【问题标题】:python groupby per second not functionning每秒python groupby不起作用
【发布时间】:2017-09-14 14:09:45
【问题描述】:

不得不承认这对我来说是一个美好的时刻:在花了这么多时间阅读论坛之后,我终于在 stackoverflow 中发布了一个问题。

拥有包含一天中完成的交易订单列表的 csv 文件,有时 1 秒内超过 100 行

data1

>CO1 Comdty              A      B       C   D       
>2017-08-10 00:00:00    TRADE   52.70   1   NaN
>2017-08-10 00:00:00    TRADE   52.70   1   NaN
>2017-08-10 00:00:00    TRADE   52.70   1   NaN
>2017-08-10 00:00:00    TRADE   52.84   1   NaN
........................
>2017-08-10 00:00:02    TRADE   52.90   1   NaN
>2017-08-10 00:00:02    TRADE   52.92   1   NaN

Index 是一个 Datetime 对象,如下所示:

DatetimeIndex(['2017-08-10 00:00:00', '2017-08-10 00:00:00',
           '2017-08-10 00:00:00', '2017-08-10 00:00:00',
           '2017-08-10 00:00:00', '2017-08-10 00:00:00',
           '2017-08-10 00:00:00', '2017-08-10 00:00:00',
           '2017-08-10 00:00:00', '2017-08-10 00:00:00',
           ...
           '2017-08-21 23:58:00', '2017-08-21 23:58:00',
           '2017-08-21 23:58:00', '2017-08-21 23:58:00',
           '2017-08-21 23:58:00', '2017-08-21 23:58:00',
           '2017-08-21 23:58:00', '2017-08-21 23:58:00',
           '2017-08-21 23:58:00', '2017-08-21 23:58:00'],
          dtype='datetime64[ns]', name=u'CO1 Comdty', length=1005276, freq=None)

我使用 groupby 函数来获取每秒的平均值

dataG1 = data1.groupby([data1.index.month,data1.index.day,data1.index.hour,data1.index.minute,data1.index.second])['B'].mean()

结果是给我一个 MultiIndex Serie,在 Second 0 时按分钟分组

8  10  0   0   0    52.702941
           1   0    52.700000
           2   0    52.704333
           3   0    52.690000
           4   0    52.689691
           5   0    52.690000
           7   0    52.700000
           8   0    52.700000
           9   0    52.704444
           10  0    52.710652
           ....................

所以你可以看到最后一列的价格是每分钟(和秒 0)给出的,我想要平均每一秒! (列是月/日/时/分/秒)

当我尝试按月、日、小时和分钟分组时,它计算正确。

在任何地方都找不到解决方案,有人可以帮忙吗?

谢谢!

回答 Parfait 的 cmets :

++++++++++++++++++++++++++++++++++++++++++++++++++ ++++

是的,您可以通过以下链接下载 csv 文件:

https://wetransfer.com/downloads/99bac8dbdba2a95aad347500b70da96e20170917073900/a12761f7bca3bd4f40efeaf76015787c20170917073900/31f902

data1 = pd.read_csv('data1.csv',sep=',', parse_dates=[0], index_col=0,infer_datetime_format=True)

dataG1 = data1.groupby([data1.index.month,data1.index.day,data1.index.hour, data1.index.minute,data1.index.second])['B'].mean()

dataG1

那么您应该会看到相同的结果。

再次感谢!

【问题讨论】:

  • 您的索引看起来全为零秒且有遗漏。如果没有完整的reproducible example,我们将无法提供更多帮助。
  • 谢谢,我在原始消息中添加了一个链接以下载 csv 文件。

标签: python datetime group-by


【解决方案1】:

我下载了 CSV 文件,但它似乎根本不在您的数据中:

CO1 Comdty  A   B   C   D   
08-10-17 00:00  TRADE   52.7    1       
08-10-17 00:00  TRADE   52.7    1       
08-10-17 00:00  TRADE   52.7    1       
08-10-17 00:00  TRADE   52.7    1       
... 
08-10-17 00:01  TRADE   52.7    1       
08-10-17 00:01  TRADE   52.7    1       
08-10-17 00:01  TRADE   52.7    1

如果您真的想按秒分组,则必须重新索引您的数据。但是,请注意这一点,因为您似乎每分钟没有相同数量的样本,所以我假设您有一个任意间隔,可以为您提供下一个样本。


这就是您重新索引的样子:

import pandas as pd
import numpy as np

data1 = pd.DataFrame.from_csv('data1.csv')

data_end = data1[::-1].index[0] + pd.Timedelta(minutes=1)
tmp = data1.groupby(data1.index.minute)['B'].count()
tmp = tmp.append(pd.DataFrame([0], index=[data_end.minute]))[0]

indices = list()
start = data1.index[0]

for s, e in zip(tmp[:len(tmp)-1].iteritems(), tmp[1:].iteritems()):  
    smin, sint = s
    emin, eint = e

    start = data1.index[0] + pd.Timedelta(minutes=smin)
    end = data1.index[0] + pd.Timedelta(minutes=emin)

    indices.append( pd.to_datetime(np.linspace(start.value, end.value, sint)) )
    start = end

data1.index = np.hstack(indices)

这将简单地通过每分钟平均分配所有样本来重新索引所有样本。但是,这是一个很大的假设,您必须知道这是否有效。

8  10  0  0  0     52.700
             1     52.700
             3     52.700
             5     52.700
             7     52.700
             9     52.700
             10    52.700
             12    52.700
             14    52.710
             16    52.710
             18    52.700
             20    52.710
...

【讨论】:

    【解决方案2】:

    感谢您的帮助,这对我来说不是一个方便的解决方案,因为我每分钟的样本量总是不同的。此外,我还需要精确秒的平均价格。

    我意识到 csv 文件中缺少信息;因为当我将数据作为“日期时间”从 excel 粘贴到 csv 时,它丢失了索引的小数部分,秒、毫秒等在哪里。

    通过将值粘贴为浮点值找到解决方案,然后使用以下转换将其转换为日期时间:

    import pandas as pd
    import numpy as np
    
    data1 = pd.DataFrame.from_csv('data1.csv')
    
    data1.index = pd.to_datetime(1000000000*86400*(data1.index-25569))
    
    dataG1 = data1.groupby([data1.index.month,data1.index.day,data1.index.hour, 
    data1.index.minute,data1.index.second])['B'].mean()
    
    dataG1 = dataG1.reset_index()
    
    dataG1
    
    
     8  10  0   0   0     52.701818
                    1     52.710000
                    8     52.700000
                    10    52.700000
                    13    52.703889
                    59    52.700000
                1   59    52.700000
                2   5     52.708462
                    7     52.710000
                    15    52.700000
      .............................
    

    不过,我的平均价格略有不同...例如,第一行 8/10/0/0 和第二行 0 的平均价格为 52.701818 而不是 52.70231

    而且我也不相信我的解决方案,我希望按照您的示例具有相同的间隔,并在丢失时保持相同的值。如果您有更好的想法,很想听听。

    [https://wetransfer.com/downloads/df4f8526ddc711e08f556245fac093ac20170918121109/f2928133e8c17a9de98a0460483747c320170918121109/3857ff][1]

    多谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 2019-03-27
      • 1970-01-01
      相关资源
      最近更新 更多