【问题标题】:Pandas DateTimeIndex - Shifting over indexPandas DateTimeIndex - 移动索引
【发布时间】:2018-03-13 23:46:39
【问题描述】:

所以我正在使用 Pandas 进行一些技术分析,但是我在 DateTimeIndex 方面遇到了困难,因为许多财务数据的频率不一致。

我使用 pandas_datareader 获取包含 DateTimeIndex、Open、Close、High、Low 和 Volume 价格的 yahoo 财务数据。接下来我正在计算一些我想开始分析的日期。我的问题是,一旦我有了这些日期,我就很难“访问”对应于前一个和下一个交易日的值。数据帧上的移位仅适用于数据帧本身,不会移位索引。 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.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-182017-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__'

【问题讨论】:

    标签: pandas date dataframe datetimeindex


    【解决方案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
    

    【讨论】:

    • 啊啊啊,你又比我快了5秒,又是一模一样的答案。
    • @cᴏʟᴅsᴘᴇᴇᴅ,如果我告诉你这件事一直发生在我身上,你会感觉好点吗?:)
    • 啊,这实际上帮助了很多人!所以显然我已经有了这个,但它对我不起作用,因为我有一个具有多个日期时间的&lt;class 'pandas.core.indexes.datetimes.DatetimeIndex'&gt; 对象,它无法将其转换为一个时间戳。如果t 包含多个日期,您对如何为每个元素“获取下一个日期”有任何建议吗?
    • 我希望我能说是,但是... ;-)
    • @MrBobJamesBob 重现您的问题的 MCVE 在这里会很有帮助。
    猜你喜欢
    • 2016-05-07
    • 2016-12-05
    • 1970-01-01
    • 2018-06-02
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多