【问题标题】:How to obtain the distribution of idmax-idmin in timeseries data?如何获取时间序列数据中idmax-idmin的分布?
【发布时间】:2015-06-16 15:22:49
【问题描述】:

这是我的数据的简化外观:

                        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

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

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

我该怎么做呢?

【问题讨论】:

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


    【解决方案1】:
    import pandas as pd
    import numpy as np
    

    我们将从dat 中的数据开始。我刚刚复制了你的数据进行实验。

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

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

    然后,由于您想找到每个最小值和最大值的索引,您可以在每个 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 将为您提供一系列时间以及该时间出现的次数。但是,它不包括从未出现在 max/min 中的时间,因此当您将 max 和 min 计数组合到一个数据帧中时,您将获得一些 NaN 值。您可以使用 fillna 删除这些并用 0 替换它们。

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

    【讨论】:

    • 呵呵——我们的答案是一样的 :-)
    • 基本上,是的:似乎有一种明显的方法可以做到这一点,而且显然是最适合发布它的特定分钟。
    【解决方案2】:

    假设索引已经是 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
    

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 1970-01-01
      • 2020-01-31
      • 2020-11-08
      • 2015-06-23
      • 1970-01-01
      • 2021-04-17
      • 2019-04-05
      • 1970-01-01
      相关资源
      最近更新 更多