如果在彼此的180个工作日内标记元素,则

时间:2019-05-02 20:35:53

标签: pandas

假设我有以下数据。

我要标记彼此之间180个工作日内的所有条目。

1    2009-01-16
2    2010-01-22
3    2010-02-26
4    2010-06-18
5    2013-09-11
Name: date, dtype: datetime64[ns]

在正常的 天内,我已经可以通过一些diff的移位和布尔逻辑来做到这一点,但对于商务场合则不能,如下所示:

def check_dates(l):
    OVERLAP_DT = 180  # edited
    diff0 = l.diff(periods=-1).fillna(pd.Timedelta('528491 hours'))  # filler for some number greater than 180 days for NAs
    diff1 = l.diff(periods=1).fillna(pd.Timedelta('528491 hours'))
    return ((np.abs(diff0.dt.days) > OVERLAP_DT) & (np.abs(diff1.dt.days) > OVERLAP_DT)).astype(int)

以上内容输出以下内容,其中1为“好,继续”,并且在几天内正确。但是,我不确定如何在工作日内完成这项工作。

1    1
2    0
3    0
4    0
5    1
Name: Announcement_Date, dtype: int32

编辑:将索引从原始副本更改为1, 2, 3, ...,因为这很令人困惑。

2 个答案:

答案 0 :(得分:0)

也许您可以尝试以下方法:

'1/1/2018' in pd.bdate_range(start = '1/1/2018', periods = 180)

答案 1 :(得分:0)

我相信您正在寻找:

df.Date > df.Date.shift() + pd.tseries.offsets.BDay(180)

下面的输出比您的输出更有意义,即179和955的日期不在前一天规定的180 bday窗口之内。

19     False
179     True
194    False
261    False
955     True
Name: Date, dtype: bool

或者,如果您想标记第19天和261天:

df.Date < df.Date.shift(-1) - pd.tseries.offsets.BDay(180)

并输出:

19      True
179    False
194    False
261     True
955    False
Name: Date, dtype: bool