python groupby每秒不起作用

时间:2017-09-14 14:09:46

标签: python datetime group-by

不得不承认这对我来说是一个很棒的时刻:我花了这么多时间阅读论坛后,终于在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系列,按分钟在第二个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的评论:

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

是的,您可以通过以下链接下载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

然后你会看到相同的结果。

又来了!

2 个答案:

答案 0 :(得分:0)

我下载了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
...

答案 1 :(得分:0)

感谢您的帮助,对我来说这不是一个方便的解决方案,因为我每分钟都会有不同的样本量。另外,我需要准确的第二个平均价格。

我意识到csv文件中缺少信息;因为当我将数据粘贴为" datetime"从excel到csv,它丢失了索引的小数部分,其中包括秒,毫秒等。

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

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,第二行是平均值52.701818而不是52.70231

我也不相信我的解决方案,我希望你的例子有相同的间隔,并在缺少时保持相同的值。很想知道你是否有更好的想法。

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

很多人!