在Pandas中的分组数据帧中减去值

时间:2018-05-11 17:22:53

标签: python pandas dataframe data-analysis

我有一组ID和时间戳,并希望通过获取按ID分组的最旧/最早时间戳的差异来计算“每个ID经过的总时间”。

数据

id   timestamp
1    2018-02-01 03:00:00
1    2018-02-01 03:01:00
2    2018-02-02 10:03:00
2    2018-02-02 10:04:00
2    2018-02-02 11:05:00

预期结果

我希望将delta转换为分钟

id   delta
1    1
2    62

我有一个for循环,但它非常慢(1M +行的10+分钟)。我想知道这是否可以通过熊猫功能实现?

# gb returns a DataFrameGroupedBy object, grouped by ID
gb = df.groupby(['id'])

# Create the resulting df
cycletime = pd.DataFrame(columns=['id','timeDeltaMin'])

def calculate_delta():
    for id, groupdf in gb:
        time = groupdf.timestamp
        # returns timestamp rows for the current id

        time_delta = time.max() - time.min()

        # convert Timedelta object to minutes
        time_delta = time_delta / pd.Timedelta(minutes=1) 

        # insert result to cycletime df
        cycletime.loc[-1] = [id,time_delta]
        cycletime.index += 1

想下一次尝试:
- 多处理

2 个答案:

答案 0 :(得分:2)

首先确保日期时间正常:

df.timestamp = pd.to_datetime(df.timestamp)

现在找到每个id的最大值和最小值之间的分钟数:

import numpy as np

>>> (df.timestamp.groupby(df.id).max() - df.timestamp.groupby(df.id).min()) / np.timedelta64(1, 'm')
id
1     1.0
2    62.0
Name: timestamp, dtype: float64

答案 1 :(得分:1)

您可以按idtiemstamp排序,然后按id分组,然后找出每组最小和最大时间戳之间的差异。

df['timestamp'] = pd.to_datetime(df['timestamp'])
result = df.sort_values(['id']).groupby('id')['timestamp'].agg(['min', 'max'])
result['diff'] = (result['max']-result['min']) / np.timedelta64(1, 'm')
result.reset_index()[['id', 'diff']]

输出:

    id  diff
0   1   1.0
1   2   62.0