【问题标题】:detecting jumps on pandas index dates检测 pandas 索引日期的跳跃
【发布时间】:2013-07-31 11:01:58
【问题描述】:

我设法加载了大量金融工具数据系列的历史数据,并按日期编制索引。

我正在绘制数量、价格信息,没有任何问题。

我现在想要实现的是确定日期是否有任何大的跳跃,看看我是否缺少大量数据。

我的想法是以某种方式绘制索引中两个连续日期之间的差异,以及该数字是否优于 3 或 4(大于周末和周五或周一的银行假日) ) 那么就有问题了。

问题是我可以弄清楚如何简单地计算 df[next day]-df[day],其中 df 是按天索引的

【问题讨论】:

    标签: indexing pandas


    【解决方案1】:

    您可以使用shift Series 方法(注意 DatetimeIndex 方法按频率移动):

    In [11]: rng = pd.DatetimeIndex(['20120101', '20120102', '20120106']) # DatetimeIndex like df.index
    
    In [12]: s = pd.Series(rng)  # df.index instead of rng
    
    In [13]: s - s.shift()
    Out[13]:
    0                NaT
    1   1 days, 00:00:00
    2   4 days, 00:00:00
    dtype: timedelta64[ns]
    
    In [14]: s - s.shift() > pd.offsets.Day(3).nanos
    Out[14]:
    0    False
    1    False
    2     True
    dtype: bool
    

    根据您的需要,也许您可​​以做任何事情,或者找到有问题的值...

    In [15]: (s - s.shift() > pd.offsets.Day(3).nanos).any()
    Out[15]: True
    
    In [16]: s[s - s.shift() > pd.offsets.Day(3).nanos]
    Out[16]:
    2   2012-01-06 00:00:00
    dtype: datetime64[ns]
    

    或者也许找到最大跳跃(以及它在哪里):

    In [17]: (s - s.shift()).max()  # it's weird this returns a Series...
    Out[17]:
    0   4 days, 00:00:00
    dtype: timedelta64[ns]
    
    In [18]: (s - s.shift()).idxmax()
    Out[18]: 2
    

    如果您真的想绘制此图,只需绘制差异即可:

    (s - s.shift()).plot()
    

    【讨论】:

    • 来自未来的注意:在以后的pandas版本中,我认为pd.offsets.Day的使用应该替换为pd.Timedelta(3,'D')
    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多