Рассчитать время дельты конкретного столбца - PullRequest
0 голосов
/ 10 декабря 2018

Я работаю над этим примером ниже, используя данные датчика, показывающие метку времени и состояние (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).

1 Ответ

0 голосов
/ 10 декабря 2018

Вы можете использовать groupby('Status') вместе с groupby(df2.index - np.arange(df2.shape[0])).Эта секунда groupby создает различные серии на основе последовательных индексов.Затем вы можете просто использовать groupby.last() и groupby.first() для вычисления разницы во времени.

gb = df.groupby('Status')
t_list = []
for key, gp in gb:
    df2 = gb.get_group(key)
    gb2 = df2.groupby(df2.index - np.arange(df2.shape[0]))
    t_f = gb2.last()['Datetime'].values.astype('datetime64[s]')
    t_i = gb2.first()['Datetime'].values.astype('datetime64[s]')
    t = t_f-t_i
    t[np.where(t == np.timedelta64(0,'s'))] = np.timedelta64(1,'s')
    t_list.append(np.sum(t))

print(t_list) # [numpy.timedelta64(7,'s'), numpy.timedelta64(13,'s')]

Обратите внимание на строку

t[np.where(t == np.timedelta64(0,'s'))] = np.timedelta64(1,'s')

, которая заменяет интервал 0 секунд (серия содна строка, поскольку существует один раз подряд) в течение 1 секунды (в противном случае вы получите 12 для статуса 1, где должно быть 13)

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