计算特定列的增量时间

时间:2018-12-10 05:21:27

标签: python pandas numpy datetime

我正在下面的示例中通过传感器数据显示时间戳和状态(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 :(得分: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)