Pandas 日期时间索引-转换索引
因此,我正在使用Pandas进行一些技术分析,但是我在DateTimeIndex方面遇到了困难,因为很多财务数据的频率并不一致Pandas 日期时间索引-转换索引,pandas,date,dataframe,datetimeindex,Pandas,Date,Dataframe,Datetimeindex,因此,我正在使用Pandas进行一些技术分析,但是我在DateTimeIndex方面遇到了困难,因为很多财务数据的频率并不一致 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.11
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
我使用pandas_datareader获取雅虎财务数据,包括DateTimeIndex、开盘价、收盘价、高价、低价和成交量价格。接下来我要计算一些我想开始分析的日期。我的问题是,一旦我有了这些日期,我真的很难“访问”上一个交易日和下一个交易日对应的值。数据帧上的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仍然可以很容易地找到这些值,而且我还希望获得“下一行”的datetimeindex
在此问题上的任何帮助都将不胜感激
---编辑
我有一个包含多个日期的索引“series”,我想找到该系列中每个日期的“下一行”
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__'
打开
日期
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回溯(最近一次调用上次)
在()
5打印(h)
6.
---->7打印(tmp.iloc[tmp.index.get_loc[h]]
TypeError:“instancemethod”对象没有属性“\uuu getitem\uuu”
您可以使用get\u 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
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
编辑:
假设你有一个系列,在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
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
啊,你又以5秒的优势击败了我,你的回答与我的回答完全相同。@cᴏʟᴅsᴘᴇᴇᴅ, 如果我告诉你这件事总是发生在我身上,你会感觉好点吗?:)啊,这真的帮了大忙!显然我已经有了这个,但它对我不起作用,因为我有一个具有多个日期时间的
对象,它不能将其转换为一个时间戳。如果t
包含多个日期,您对如何为每个元素“获取下一个日期”有什么建议吗?我希望我能说是,但是…;-)@MrBobJamesBob一个重现你问题的MCVE在这里会很有帮助。