大数据帧中的条带间隔(不一致)的开始和结束日期

时间:2019-05-29 17:49:16

标签: python pandas dataframe

我有一个由2列组成的数据框。 日期-季度日期 指标值-给定日期的范围从1到-1。

Date(Quarter)   Indicator Value    

1872-12-31        0.5                  
1873-03-31       -0.2                  
1873-06-30       -0.15                 
1873-09-30        0.7                  
1873-12-31        0.4                  
1874-03-31        0.9                 
1874-06-30       -0.3                  
1874-09-30       -0.1                  
1874-12-31        0.8                  

我对负值周期感兴趣。我想获取所有负值的开始日期和结束日期,但不能单独获取。例如,

First one starts at 1873/01/01 and ends in 1873/06/30
The second one starts at 1874/04/01 and ends in 1874/09/30

我尝试创建二进制值。例如,所有正数仍为零,负数仍为1。然后,我可以删除较小的数据框并获取日期。

似乎我在加倍努力。

def f(row):
    if row['Indicator value'] < 0:
        val = 1
    else:
        val = 0
    return val

df['Binary Value'] = df3.apply(f, axis = 1)

数据框看起来像这样:

    Date(Quaterly)   Indicator Value    Binary Value 

1872-12-31        0.5                  0
1873-03-31       -0.2                  1
1873-06-30       -0.15                 1
1873-09-30        0.7                  0
1873-12-31        0.4                  0
1874-03-31        0.9                  0
1874-06-30       -0.3                  1
1874-09-30       -0.1                  1
1874-12-31        0.8                  0

在这之后我有点卡住了。我不知道从这里去哪里。

我要创建开始日期和结束日期列表

Start Date     End date 
1873/01/01     1873/06/30 
1874/04/01     1874/09/30

1 个答案:

答案 0 :(得分:1)

g = (df['Indicator Value'].gt(0) == df['Indicator Value'].lt(0).shift()).cumsum()
g.name = 'value'

df = df.groupby(g).apply(lambda x: x.iloc[np.r_[0:1, -1:0]])

allneg = df[df['Indicator Value'].lt(0)].reset_index().drop(columns = ['value','level_1'])

pd.DataFrame(np.hstack([allneg.loc[::2, 'Date(Quarter)'].values.reshape(-1,1), allneg.loc[1::2, 'Date(Quarter)'].values.reshape(-1,1)]))\
  .rename(columns = {0:'Start Date', 1:'End Date'})

    Start Date   End Date
0   1873-03-31  1873-06-30
1   1874-06-30  1874-09-30

g是我们要为“指标值”列创建的分组的创建。每当符号改变时,该值就会上升。

然后我们将g分组,然后应用一个函数,该函数在每个组中采用第一个值和最后一个值(因此,如果一行中有3个或更多的neg值,则只会采用第一个和最后一个)。

接下来,我们过滤掉正值并进行一些清洁。最后,我们操纵allneg来获取开始日期和结束日期,并使其成为新的数据框。

对于我的开始日期,我使用最初的负数,我不确定你从哪里来的。