#pandas #dataframe #time #timestamp
#панды #фрейм данных #время #временная метка
Вопрос:
У меня есть фрейм данных, который выглядит следующим образом:
index status counting
2018-02-11 10:00:00 close 0
2018-02-11 10:00:01 close 0
2018-02-11 10:00:02 close 0
2018-02-11 10:00:03 open 1
2018-02-11 10:00:04 open 2
2018-02-11 10:00:05 open 3
2018-02-11 10:00:06 close 0
2018-02-11 10:00:07 close 0
2018-02-11 10:00:08 close 0
2018-02-11 10:00:09 open 1
2018-02-11 10:00:10 open 2
2018-02-11 10:00:11 open 3
2018-02-11 10:00:12 open 4
2018-02-11 10:00:13 open 5
2018-02-11 10:00:14 open 6
2018-02-11 10:00:15 close 0
2018-02-11 10:00:16 close 0
2018-02-11 10:00:17 close 0
Я хочу рассчитать среднюю продолжительность последовательного «открытого» интервала. Либо
- Доступ к индексу как начала, так и конца этих интервалов или
- Получение самого высокого числа подсчета для каждого открытого блока..
У кого-нибудь есть идея?
Ответ №1:
Вы можете сравнивать значения по open
, затем инвертировать маску по ~
с кумулятивной суммой для групп и фильтровать только open
строки, последний переход к groupby
:
m = df['status'].eq('open')
s = df.groupby((~m).cumsum()[m])['counting'].max()
print (s)
status
3.0 3
6.0 6
Name: counting, dtype: int64
Если нужно mean
:
s = df.groupby((~m).cumsum()[m])['counting'].mean()
print (s)
status
3.0 2.0
6.0 3.5
Name: counting, dtype: float64
Если нужны минимальные и максимальные значения:
df = df.reset_index()
m = df['status'].eq('open')
df1 = df.groupby((~m).cumsum()[m])['index'].agg(['min','max'])
print (df1)
min max
status
3.0 2018-02-11 10:00:03 2018-02-11 10:00:05
6.0 2018-02-11 10:00:09 2018-02-11 10:00:14
Подробные сведения:
print ((~m).cumsum())
0 1
1 2
2 3
3 3
4 3
5 3
6 4
7 5
8 6
9 6
10 6
11 6
12 6
13 6
14 6
15 7
16 8
17 9
Name: status, dtype: int32
print ((~m).cumsum()[m])
3 3
4 3
5 3
9 6
10 6
11 6
12 6
13 6
14 6
Name: status, dtype: int32