Pandas DateTimeIndex - 移动索引
Pandas DateTimeIndex - Shifting over index
所以我正在使用 Pandas 进行一些技术分析,但是我正在努力处理 DateTimeIndex,因为很多财务数据没有一致的频率。
我使用 pandas_datareader 获取包含 DateTimeIndex、Open、Close、High、Low 和 Volume 价格的雅虎财经数据。接下来我正在计算一些我想开始分析的日期。我的问题是,一旦我有了这些日期,我就很难 'access' 对应于前一个交易日和下一个交易日的值。数据框上的 Shift 仅适用于数据框本身,不会移动索引。 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 仍然很容易找到这些值,而且我还想获得 'next in line'.
的 datetimeindex
非常感谢对此问题的任何帮助。
--- 编辑
我有一个包含多个日期的索引 'series',我想为该系列中的每个日期找到 'next rows'。
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__'
你可以使用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
所以我正在使用 Pandas 进行一些技术分析,但是我正在努力处理 DateTimeIndex,因为很多财务数据没有一致的频率。
我使用 pandas_datareader 获取包含 DateTimeIndex、Open、Close、High、Low 和 Volume 价格的雅虎财经数据。接下来我正在计算一些我想开始分析的日期。我的问题是,一旦我有了这些日期,我就很难 'access' 对应于前一个交易日和下一个交易日的值。数据框上的 Shift 仅适用于数据框本身,不会移动索引。 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 仍然很容易找到这些值,而且我还想获得 'next in line'.
非常感谢对此问题的任何帮助。
--- 编辑 我有一个包含多个日期的索引 'series',我想为该系列中的每个日期找到 'next rows'。
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__'
你可以使用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