我正在下面的示例中通过传感器数据显示时间戳和状态(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)。
答案 0 :(得分:1)
您可以将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')
它将1秒的间隔替换为0秒的间隔(由于连续有单个连续的序列,所以有一行),否则状态1将得到12,而状态1应该为13)