Python 计算特定列的增量时间

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

我正在从显示时间戳和状态(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       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')