Pandas DateTimeIndex - 转移索引

时间:2017-10-02 20:39:52

标签: pandas date dataframe datetimeindex

所以我正在使用Pandas进行一些技术分析,但我很难与DateTimeIndex斗争,因为很多财务数据并没有一致的频率。

我使用pandas_datareader获取包含DateTimeIndex,Open,Close,High,Low和Volume价格的yahoo财务数据。接下来我计算一些我想要开始分析的日期。我的问题是,一旦我有了这些日期,我就很难进入'对应于前一个和下一个交易日的值。数据框上的移位仅适用于数据框本身,并且不会移动索引。 DateTimeIndex上的Shift只能以一致的频率工作。

            Open    High    Low Close   Adj Close   Volume
Date                        
2017-05-11  160.330002  160.520004  157.550003  158.539993  158.539993  5677400
2017-05-12  159.110001  160.839996  158.509995  160.809998  160.809998  5092900
2017-05-15  160.250000  161.779999  159.759995  160.020004  160.020004  4972000
2017-05-16  160.500000  161.179993  159.330002  159.410004  159.410004  3464900
2017-05-17  158.089996  158.779999  153.000000  153.199997  153.199997  8184500
2017-05-18  153.610001  156.889999  153.240005  155.699997  155.699997  6802700
2017-05-19  156.149994  158.050003  155.910004  157.020004  157.020004  4091500
2017-05-22  157.860001  158.600006  156.429993  157.160004  157.160004  3744100
2017-05-23  157.750000  158.309998  156.800003  157.949997  157.949997  3370900
2017-05-24  158.350006  158.479996  157.169998  157.750000  157.750000  2970800

例如,在日期2017-05-19的情况下,我希望能够访问日期2017-05-18以及2017-05-22的行。不仅是值,因为使用原始df上的shift仍然很容易找到这些值,但我还想获得'下一行的datetimeindex。

非常感谢任何有关此问题的帮助。

---编辑 我有一个索引'系列'这包含多个日期,我想找到下一行'对于该系列中的每个日期。

tmp = data.iloc[8:15, :1]
print(tmp)

h, l = momentum_gaps(data)
print(h)

print( tmp.iloc[ tmp.index.get_loc[h] ] )

此代码生成输出

                  Open
Date                  
2017-05-23  157.750000
2017-05-24  158.350006
2017-05-25  161.000000
2017-05-26  162.839996
2017-05-30  163.600006
2017-05-31  163.610001
2017-06-01  163.520004
DatetimeIndex(['2017-05-25', '2017-07-12', '2017-07-18'], dtype='datetime64[ns]', name=u'Date', freq=None)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-159-a3f58efdc9d2> in <module>()
      5 print(h)
      6 
----> 7 print( tmp.iloc[ tmp.index.get_loc[h] ] )

TypeError: 'instancemethod' object has no attribute '__getitem__'

1 个答案:

答案 0 :(得分:1)

您可以使用get_loc和iloc

t = '2017-05-19'
req_row = df.index.get_loc(t)

现在获取数据帧的切片

df.iloc[[req_row-1, req_row,req_row+1]]

你得到了

            Open        High        Low         Close       Adj_Close   Volume
Date                        
2017-05-18  153.610001  156.889999  153.240005  155.699997  155.699997  6802700
2017-05-19  156.149994  158.050003  155.910004  157.020004  157.020004  4091500
2017-05-22  157.860001  158.600006  156.429993  157.160004  157.160004  3744100

编辑: 假设你有一个系列,在列表中获取指数tmp。

tmp = df.iloc[4:8].index.tolist()

现在为每个日期获取下一行

req_rows = [df.index.get_loc(t)+1 for t in tmp]
df.iloc[req_rows]

你得到了

            Open        High        Low         Close       Adj_Close   Volume
Date                        
2017-05-18  153.610001  156.889999  153.240005  155.699997  155.699997  6802700
2017-05-19  156.149994  158.050003  155.910004  157.020004  157.020004  4091500
2017-05-22  157.860001  158.600006  156.429993  157.160004  157.160004  3744100
2017-05-23  157.750000  158.309998  156.800003  157.949997  157.949997  3370900