如何在时间序列数据中获得idmax-admin的分布?

时间:2015-04-10 19:32:31

标签: python python-2.7 pandas time-series dataframe

这是我数据的简化外观:

                        Open     High      Low    Close
2005-09-06 09:00:00  1234.25  1234.50  1234.00  1234.25
2005-09-06 12:00:00  1234.50  1234.75  1234.25  1234.50
2005-09-06 16:00:00  1234.50  1234.50  1234.25  1234.50
2005-09-07 09:00:00  1234.25  1234.50  1234.00  1234.25
2005-09-07 12:00:00  1234.25  1234.50  1234.25  1234.50
2005-09-07 16:00:00  1234.25  1234.75  1234.25  1234.25
2005-09-08 09:00:00  1234.25  1234.25  1234.00  1234.25
2005-09-08 12:00:00  1234.25  1234.25  1233.75  1234.25
2005-09-08 16:00:00  1234.25  1234.50  1234.00  1234.00

我想每天获得最大和最小的小时。最大值是列的最大值'高',最小值是列的最小值'低'。在此示例中,输出将为:

           Max_Time  Min_Time    
2005-09-06 12:00:00  09:00:00
2005-09-07 16:00:00  09:00:00
2005-09-08 16:00:00  12:00:00

由于这个摘要会很长,所以总结它以获得每个时间戳的分布是有用的,但是使用每小时的分区,所以它看起来像:

          Max  Min
09:00:00   0    2  
12:00:00   1    1
16:00:00   2    0

我将如何做到这一点?

2 个答案:

答案 0 :(得分:3)

假设索引已经是DatetimeIndex,我会尝试类似:

>>> g = df.groupby(df.index.date) # groupby date
>>> max_min = pd.DataFrame({'Max_Time': g['High'].idxmax().dt.time, 
                            'Min_Time': g['Low'].idxmin().dt.time})
>>> max_min
            Max_Time  Min_Time
2005-09-06  12:00:00  09:00:00
2005-09-07  16:00:00  09:00:00
2005-09-08  16:00:00  12:00:00

(如果你只想要小时,而不是全职,你可以使用dt.hour。)

要获取每列中各个时间的个别计数,您可以拨打pd.value_counts

>>> pd.DataFrame({'Max': max_min.Max_Time.value_counts(), 
                  'Min': max_min.Min_Time.value_counts()})
          Max  Min
09:00:00  NaN    2
12:00:00    1    1
16:00:00    2  NaN

答案 1 :(得分:3)

import pandas as pd
import numpy as np

我们将从dat中的数据开始。我刚刚将您的数据复制到实验中。

您希望按照索引中的日期对数据框进行分组,因为您希望每个日期的分数和最大值。这可以通过以下方式完成:

gb=dat.groupby(dat.index.date)

然后,由于您要查找每个min和max的索引,您可以在每个groupby系列(gb.High和gb.Low)上使用idxmax和idxmin来获取每个日期的最大值和最小值的索引。这些将首先包括日期和时间,因为它们都在索引中。您可以使用.dt.time来获取时间。

mm=pd.DataFrame({ 'Max_Time': gb.High.idxmax().dt.time, 
                  'Min_Time': gb.Low.idxmin().dt.time } )

mm这将是您想要的第一件事。现在,为了获得计数,每列上的value_counts将给出一系列次数和时间显示的次数。但是,它不包括从未在最大/最小值中显示的时间,因此当您将最大和最小计数组合到数据帧中时,您将获得一些NaN值。您可以使用fillna删除它们并将其替换为0。

pd.DataFrame( { 'Max': mm.Max_Time.value_counts(), 
                'Min': mm.Min_Time.value_counts() } ).fillna(0)