熊猫:对于具有特定索引的循环重复

时间:2019-02-26 15:01:40

标签: python pandas

我的数据框如下:

    time                 event  
  2019-01-01 01:27:00   crossing down           
1 2019-01-01 01:36:00   crossing up         
2 2019-01-01 01:42:00   crossing down           
3 2019-01-01 01:55:00   crossing up     
4 2019-01-01 01:58:00   crossing down   
5 2019-01-01 01:59:00   crossing up         
6 2019-01-01 02:00:00   crossing down       
7 2019-01-01 02:17:00   crossing up     

我需要做的是计算趋势之间的平均时间(从向下到向上穿越“上升趋势”,或者向上或向下穿越“下降趋势”)。我需要的是所有上升趋势的数组,因此1 2019-01-01 01:36:00 crossing up2019-01-01 01:27:00 crossing down之间的时间,再加上3 2019-01-01 01:55:00 crossing up2 2019-01-01 01:42:00 crossing down之间的时间,等等。所有下降趋势的数组,因此介于1 2019-01-01 01:36:00 crossing up2 2019-01-01 01:42:00 crossing down之间的时间,等等。。。到目前为止,我尝试过:

for index,row in df_trend.iterrows():
    if df_trend.loc[0, 'event'] == 'crossing down':    
        up_trend_time = np.append(up_trend_time,(df_trend.loc[index+1, 'time'] - df_trend.loc[index, 'time']))

    elif df_trend.loc[0, 'event'] == 'crossing up':  
        down_trend_time = np.append(up_trend_time,(df_trend.loc[index+1, 'time'] - df_trend.loc[index, 'time']))

但是它没有给我期望的输出:数组up_trend_time=[9,7,1,17]down_trend_time=[6,3,1],有什么帮助吗?谢谢!

加上我的当前代码有以下错误:

'the label [1676] is not in the [index]'

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

up_trend_time = (df.groupby((df['event'] == 'crossing down').cumsum())['time'].diff()
                   .dropna().dt.total_seconds().floordiv(60).tolist())

down_trend_time = (df.groupby((df['event'] == 'crossing up').cumsum())['time'].diff()
                     .dropna().dt.total_seconds().floordiv(60).tolist())

up_trend_time
[9.0, 13.0, 1.0, 17.0]

down_trend_time
[6.0, 3.0, 1.0]

答案 1 :(得分:0)

time = np.array([])
up = np.array([])
down = np.array([])

for index in range(len(df_trend) -1):
    if df_trend.loc[0, 'event'] == 'crossing down':    
        time = np.append(time,(df_trend.loc[index+1, 'time'] - df_trend.loc[index, 'time']))

    elif df_trend.loc[0, 'event'] == 'crossing up':  
        time = np.append(time,(df_trend.loc[index+1, 'time'] - df_trend.loc[index, 'time']))


if df_trend.loc[0, 'event'] == 'crossing down': 
    up =  time[::2]
    down = time[1:][::2]
else: 
    up = time[1:][::2]
    down = time[::2]