Вот подход, который работает для простого примера одной машины, которая меняется между включением и выключением в течение одного дня.Он работает независимо от того, находится ли компьютер в состоянии on
или off
в первой строке.
df = pd.DataFrame({'ID': [12, 12, 12, 12, 12],
'on/off': [0,0,1,0,1],
'Time': ['2019-01-01 00:00:00', '2019-01-01 00:00:05', '2019-01-01 00:00:10','2019-01-01 00:00:15','2019-01-01 00:00:20']
})
ID on/off Time
0 12 0 2019-01-01 00:00:00
1 12 0 2019-01-01 00:00:05
2 12 1 2019-01-01 00:00:10
3 12 0 2019-01-01 00:00:15
4 12 1 2019-01-01 00:00:20
- Сначала я убедился, что для столбца
Time
dtype указан тип datetime64:
df['Time'] = pd.to_datetime(df['Time'])
Затем я получаю индексы всех строк, где изменилось состояние (либо с
off
на
on
, либо с
on
на
off
:
s = df[df['on/off'].shift(1) != df['on/off']].index
df = df.loc[s]
Затем я создаю столбец с именем
time shift
, который показывает метку времени самой последней строки, в которой изменилось состояние питания:
df['time shift'] = df['Time'].shift(1)
В этот момент кадр данных выглядит следующим образом:
ID on/off Time time shift
0 12 0 2019-01-01 00:00:00 NaT
2 12 1 2019-01-01 00:00:10 2019-01-01 00:00:00
3 12 0 2019-01-01 00:00:15 2019-01-01 00:00:10
4 12 1 2019-01-01 00:00:20 2019-01-01 00:00:15
Теперь, так как мы хотим подсчитать время, в течение которого машина была выключена, я смотрю только на индексы строк, в которых состояние стало
on
:
r = df[df['on/off'] == 1].index
df = df.loc[r]
На этом этапедатафрейм выглядит так, как показано ниже.Обратите внимание, что в столбце time shift
отображается точка, в которой аппарат был выключен в последний раз, до того, как время отображается в столбце Time
, который является отметкой времени при включении машины.Нахождение разницы между этими двумя столбцами даст нам продолжительность каждого периода, в течение которого машина была выключена в течение дня:
ID on/off Time time shift
2 12 1 2019-01-01 00:00:10 2019-01-01 00:00:00
4 12 1 2019-01-01 00:00:20 2019-01-01 00:00:15
Следующая строка вычисляет общее время отключения путем суммирования длительностей каждого периода, в течение которого аппарат находился в состоянии
off
:
(df['Time'] - df['time shift']).sum()
Какие выходные данные:
Timedelta('0 days 00:00:15')
Некоторый дополнительный контекст о том, как работает метод Pandas .shift()
:
Shift берет все строки в столбце и перемещает их вперед или назад на определенную величину..shift(1)
говорит пандам сместить индекс каждой строки вперед или вверх на 1. .shift(-1)
говорит пандам сместить индекс каждой строки назад или вниз на 1. С другой стороны, .shift(1)
позволяет вам посмотреть назначение столбца в индексе предыдущей строки, а .shift(-1)
позволяет вам посмотреть значение столбца в индексе следующей строки относительно данной строки в столбце.Это удобный способ сравнения значений столбца в разных строках без использования циклов for.