Как рассчитать разницу во времени между записями? - PullRequest
0 голосов
/ 06 мая 2018

Предположим, у меня есть следующий DataFrame Pandas. Я хочу вычислить время (в секундах) с момента последнего наблюдения каждого ip. Обратите внимание, что данные не обязательно упорядочены.

dict = {'ip':[123, 326, 123, 326], 'hour': [14, 12, 12, 1], 'minute': [54, 23, 41, 8], 'second': [45, 29, 19, 33]}

df = pd.DataFrame(dict, columns = dict.keys())

       ip  hour  minute  second
0  123    14      54      45
1  326    12      23      29
2  123    12      41      19
3  326     1       8      33

Например, я хотел бы добавить столбец к первой записи, говоря, что когда ip 123 был захвачен во второй раз, эквивалент в секундах (14:54:45 - 12:41:19) имел с момента последнего появления в наборе данных.

Я пытаюсь что-то с groupby, но безуспешно. Есть идеи?

Заранее спасибо !!!

Ответы [ 2 ]

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

Вы были близки с группой. Создание правильного столбца даты и времени, вероятно, было недостающим элементом:

from datetime import datetime
import pandas

def row_to_date(row):
    today = datetime.today()
    return datetime(
        today.year,
        today.month,
        today.day,
        row['hour'],
        row['minute'],
        row['second']
    )


data = {
    'ip':[123, 326, 123, 326],
    'hour': [14, 12, 12, 1],
    'minute': [54, 23, 41, 8],
    'second': [45, 29, 19, 33]
}


df = (
    pandas.DataFrame(data)
        .assign(date=lambda df: df.apply(row_to_date, axis=1))
        .groupby(by=['ip'])
        .apply(lambda g: g.diff()['date'].dt.total_seconds())
        .dropna()
        .to_frame('elapsed_seconds')
        .reset_index(level=1, drop=True)
)
df

И вот я получаю:

     elapsed_seconds
ip                  
123          -8006.0
326         -40496.0
0 голосов
/ 06 мая 2018

Вы можете преобразовать ваш столбец часов, минут, секунд в дату и время для мая, используя to_datetime, затем мы groupby и получим другое (diff)

df['Time']=pd.to_datetime(df.iloc[:,1:].astype(str).apply(''.join,1),format='%H%M%S')

df['Yourneed']=df.groupby('ip').Time.diff().dt.total_seconds()
df
    ip  hour  minute  second                Time  Yourneed
0  123    14      54      45 1900-01-01 14:54:45       NaN
1  326    12      23      29 1900-01-01 12:23:29       NaN
2  123    12      41      19 1900-01-01 12:41:19   -8006.0
3  326     1       8      33 1900-01-01 18:03:03   20374.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...