Python 计算特定列的增量时间
我正在从显示时间戳和状态(0或1)的传感器数据处理下面的示例。我可以计算具有相同状态的每行之间的时间差,但我想计算每个状态(0和1)的总时间长度 结果是:Python 计算特定列的增量时间,python,pandas,numpy,datetime,Python,Pandas,Numpy,Datetime,我正在从显示时间戳和状态(0或1)的传感器数据处理下面的示例。我可以计算具有相同状态的每行之间的时间差,但我想计算每个状态(0和1)的总时间长度 结果是: 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
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)。您可以使用
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秒(否则,状态1应该是13,则会得到12)不应该是24秒?(15:00:29-15:00:05)所以状态0长度是从00:05到00:09计算的,继续00:26到00:29好的,把它包括在问题中会很有用。另外,(9-5)+(29-26)=7,而不是10(?)
t[np.where(t == np.timedelta64(0,'s'))] = np.timedelta64(1,'s')