确定特定时间段内熊猫的最小值和最大值

时间:2020-05-03 19:09:18

标签: python pandas time-series

我有一个类似于以下内容的数据框:

df = pd.DataFrame({'ticker':['A', 'A', 'A', 'A', 'A', 
                             'B', 'B', 'B', 'B', 'B'], 
                   'date':['2020-05-01 09:30:00', '2020-05-01 09:31:00', '2020-05-01 09:32:00', '2020-05-01 09:33:00', '2020-05-01 09:34:00', 
                           '2020-05-01 09:30:00', '2020-05-01 09:31:00', '2020-05-01 09:32:00', '2020-05-01 09:33:00', '2020-05-01 09:34:00'], 
                   'datetime':['2020-05-01 09:30:00', '2020-05-01 09:31:00', '2020-05-01 09:32:00', '2020-05-01 09:33:00', '2020-05-01 09:34:00', 
                               '2020-05-01 09:30:00', '2020-05-01 09:31:00', '2020-05-01 09:32:00', '2020-05-01 09:33:00', '2020-05-01 09:34:00'], 
                   'low':[10.00, 11.00, 12.00, 11.00, 11.50,
                          15.00, 14.00, 13.00, 12.00, 12.50], 
                   'high':[10.25, 11.25, 12.25, 11.25, 11.75,
                          15.25, 14.25, 13.25, 12.25, 12.75], 
                   'close':[10.20, 11.20, 12.20, 11.20, 11.70,
                          15.20, 14.20, 13.20, 12.20, 12.75]})

df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d %H:%M')
df['datetime'] = pd.to_datetime(df['datetime'], format='%Y-%m-%d %H:%M')
df = df.set_index(['ticker', 'date'])

我试图弄清楚如何在给定的时间点在数据框中创建具有最低报价和最高报价的列。也就是说,在当天的第一时间到给定行的当前时间之间。

  • 例如,在09:32:00,代码B的最低价格为13.0(在该分钟内发生),但是代码A的最低价格为10.0(发生在09:30:00)。
  • li>
  • 类似地,在09:32:00,代码B的最高价格为11.25(在那一分钟发生),但是代码A的最高价格为15.25(在09:30:00的开放时间发生)

我尝试了各种不同的.groupby和.loc语句,但似乎找不到正确的语句。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

您要与.min().max()结合使用.expanding(),例如:

df.groupby('ticker')[['low', 'high', 'close']].expanding().min()
                                    low   high  close
ticker ticker date                                   
A      A      2020-05-01 09:30:00  10.0  10.25   10.2
              2020-05-01 09:31:00  10.0  10.25   10.2
              2020-05-01 09:32:00  10.0  10.25   10.2
              2020-05-01 09:33:00  10.0  10.25   10.2
              2020-05-01 09:34:00  10.0  10.25   10.2
B      B      2020-05-01 09:30:00  15.0  15.25   15.2
              2020-05-01 09:31:00  14.0  14.25   14.2
              2020-05-01 09:32:00  13.0  13.25   13.2
              2020-05-01 09:33:00  12.0  12.25   12.2
              2020-05-01 09:34:00  12.0  12.25   12.2

基本上像.rolling(),但它的长度不断增加,而不是窗口的大小固定。

答案 1 :(得分:0)

我不确定您到底想要什么,但是我认为以下代码可以工作:

df[['date','low']].loc[df['ticker']=='A'].min()

输出:

date    2020-05-01 09:30:00
low                      10

您无需将索引设置为tickerdate