我的数据框如下:
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 up
和2019-01-01 01:27:00 crossing down
之间的时间,再加上3 2019-01-01 01:55:00 crossing up
和2 2019-01-01 01:42:00 crossing down
之间的时间,等等。所有下降趋势的数组,因此介于1 2019-01-01 01:36:00 crossing up
和2 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]'
答案 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]