суммируя столбец временного ряда сам с условием - PullRequest
0 голосов
/ 29 января 2019

В настоящее время я работаю с некоторыми данными, которые я получаю от машиностроительного завода, эти данные (примерно) выглядят следующим образом:

    df = pd.DataFrame({'ID' : np.random.randint(1,25,size=5),
'on/off' : np.random.randint(0,2,size=5),
'Time' : pd.date_range(start='01/01/2019',periods=5,freq='5s')})
     print(df)
    ID  on/off  Time
0   17  0   2019-01-01 00:00:00 
1   21  0   2019-01-01 00:00:05 
2   12  1   2019-01-01 00:00:10 
3   12  1   2019-01-01 00:00:15 
4   12  0   2019-01-01 00:00:20 

0 и 1 в столбце включения / выключения соответствуютчтобы когда машина была включена или выключена (0 = вкл. 1 = выключена)

в настоящее время, я использую следующую строку красивого кода, чтобы получить разницу между моим столбцом, когда данные катятся

df['Time Difference'] = (df.time - df.time.shift()) 
print(df)
    ID  on/off  Time    Time Difference
0   17  0   2019-01-01 00:00:00 NaT
1   21  0   2019-01-01 00:00:05 00:00:05
2   12  1   2019-01-01 00:00:10 00:00:05
3   12  1   2019-01-01 00:00:15 00:00:05
4   12  0   2019-01-01 00:00:20 00:00:05

теперь, поскольку этот фрейм данных довольно многословен (каждую неделю я получу около 150 тыс. Строк)

что будет лучшим способом суммировать количество времени, в течение которого машина выключена (где df ['on / off]== 1) пока не придет следующий 0?поэтому в приведенном выше примере 1 января 2019 года машина с идентификатором 12 не работала в течение 15 секунд, пока не возобновила работу в 00:00: 20

Я действительно очень озадачен этим!я могу сгруппировать это по идентификатору, включению-выключению, датам, временным меткам, но я не уверен, как работать с частями данных в одном столбце.Любая помощь или совет высоко ценится.

DN.

1 Ответ

0 голосов
/ 29 января 2019

Вот подход, который работает для простого примера одной машины, которая меняется между включением и выключением в течение одного дня.Он работает независимо от того, находится ли компьютер в состоянии 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
  1. Сначала я убедился, что для столбца 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...