Вычитание значений из сгруппированных фреймов данных в Pandas - PullRequest
0 голосов
/ 11 мая 2018

У меня есть набор идентификаторов и временных меток, и я хочу вычислить «общее время, прошедшее на один идентификатор», получая разницу самых старых / самых ранних временных меток, сгруппированных по идентификатору.

Данные

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

Ожидаемый результат

( Я хочу, чтобы дельта конвертировалась в минуты )

id   delta
1    1
2    62

У меня есть цикл for, но он очень медленный (10+мин для 1M + рядов).Мне было интересно, если бы это было достижимо с помощью функций панд?

# 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

Подумываете попробовать следующее:
- Многопроцессорная

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Сначала убедитесь, что с датами все в порядке:

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

Теперь найдите количество минут в разнице между максимумом и минимумом для каждого идентификатора:

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
0 голосов
/ 11 мая 2018

Еще один:

import pandas as pd
import numpy as np
import datetime
ids = [1,1,2,2,2]
times = ['2018-02-01 03:00:00','2018-02-01 03:01:00','2018-02-02 
10:03:00','2018-02-02 10:04:00','2018-02-02 11:05:00']
df = pd.DataFrame({'id':ids,'timestamp':pd.to_datetime(pd.Series(times))})
df.set_index('id', inplace=True)
print(df.groupby(level=0).diff().sum(level=0)['timestamp'].dt.seconds/60)
0 голосов
/ 11 мая 2018

Вы можете отсортировать по id и tiemstamp, затем по группам 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...