Я работаю над этим примером ниже, используя данные датчика, показывающие метку времени и состояние (0 или 1).Мне удалось вычислить дельту времени между каждой строкой с одинаковым статусом, но я хочу вычислить общую продолжительность времени каждого статуса (0 и 1).
df = pd.DataFrame(data=[['2018/02/16 15:00:05', 0],
['2018/02/16 15:00:08', 0],
['2018/02/16 15:00:09', 0],
['2018/02/16 15:00:14', 1],
['2018/02/16 15:00:26', 0],
['2018/02/16 15:00:28', 0],
['2018/02/16 15:00:29', 0],
['2018/02/16 15:00:31', 1],
['2018/02/16 15:00:33', 1],
['2018/02/16 15:00:34', 1],
['2018/02/16 15:00:37', 1],
['2018/02/16 15:00:39', 1],
['2018/02/16 15:00:40', 1],
['2018/02/16 15:00:41', 1],
['2018/02/16 15:00:43', 1]],
columns=['Datetime', 'Status'])
# convert to datetime object
df.Datetime = pd.to_datetime(df['Datetime'])
# find when the state changes
run_change = df['Status'].diff()
# get the step lengths
step_length = df['Datetime'].diff()
# loop and get the change since last state change
since_change = []
current_delta = 0
for is_change, delta in zip(run_change, step_length):
current_delta = 0 if is_change != 0 else \
current_delta + delta.total_seconds()
since_change.append(current_delta)
# add this data to the data frame
df['Run_Change'] = run_change
df['Step_Length'] = step_length
df['Time_Since_Change(sec)'] = pd.Series(since_change).values
, и получилось так:
Datetetime Status Run_Change Step_Length Time_Since_Change
0 2018-02-16 15:00:05 0 NaN NaT 0.0
1 2018-02-16 15:00:08 0 0.0 00:00:03 3.0
2 2018-02-16 15:00:09 0 0.0 00:00:01 4.0
3 2018-02-16 15:00:14 1 1.0 00:00:05 0.0
4 2018-02-16 15:00:26 0 -1.0 00:00:12 0.0
5 2018-02-16 15:00:28 0 0.0 00:00:02 2.0
6 2018-02-16 15:00:29 0 0.0 00:00:01 3.0
7 2018-02-16 15:00:31 1 1.0 00:00:02 0.0
8 2018-02-16 15:00:33 1 0.0 00:00:02 2.0
9 2018-02-16 15:00:34 1 0.0 00:00:01 3.0
10 2018-02-16 15:00:37 1 0.0 00:00:03 6.0
Мне нужно общее количество времени в секундах для целых данных, например, для статуса 0 общая длина составляет 7 секунд (длина статуса 0 рассчитывается с 00:05 до 00:09, продолжение с 00:26 до 00:29).