所以我正在使用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__'
答案 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