Python 大数据帧内的剥离间隔(不一致)开始和结束日期

Python 大数据帧内的剥离间隔(不一致)开始和结束日期,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个由两列组成的数据框。 日期-季度日期 指标值-给定日期的范围为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

我有一个由两列组成的数据框。 日期-季度日期 指标值-给定日期的范围为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 frow: 如果行['Indicator value']<0: val=1 其他: val=0 返回值 df['Binary Value']=df3.applyf,轴=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
g是我们想要为指标值列创建的分组。每当符号改变时,该值都会上升

然后,我们按g分组,然后应用一个函数,该函数在每组中取第一个值和最后一个值,因此,如果一行中有3个或更多neg值,则只取第一个值和最后一个值

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


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

你是对的,你让你的生活更艰难了。另外,如果第一个日期或最后一个日期的指示符值为负值,则情况如何?那么你希望得到什么样的结果呢?非常感谢你的回答。日期列表示每个季度的结束日期。我想要第一张底片的开始日期。例如,第一个负值对应于截至1873-03-31的季度。但是,我想要该季度的开始日期,即1873-01-01。如果我没有说清楚,我道歉。我仍然在检查代码,看看我是否可以自己做这件事。如果你有办法修改代码,那会很有帮助。再次谢谢。事实上,我已经猜出来了。谢谢你的帮助。
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