Суммируйте значения в течение 1 секунды после отметки времени текущей строки - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть данные в следующем формате

Ввод>

import pandas as pd
dataframe = pd.DataFrame({'value':[1,2,3,4,5], 'groupings':['groupa','groupa','groupa','groupa','groupb'], 'timestamp':['yyyy-mm-dd 00:16:35.111','yyyy-mm-dd 00:16:45.111','yyyy-mm-dd 00:16:30.111','yyyy-mm-dd 00:16:35.411','yyyy-mm-dd 00:16:35.211']})

Ввод>

    groupings   timestamp   value
0   groupa  yyyy-mm-dd 00:16:35.111 1
1   groupa  yyyy-mm-dd 00:16:45.111 2
2   groupa  yyyy-mm-dd 00:16:30.111 3
3   groupa  yyyy-mm-dd 00:16:35.411 4
4   groupb  yyyy-mm-dd 00:16:35.211 5

Я хотел бы создать в другом столбце сумму всех значений в1 секунда метки времени, в той же группе, например

    groupings   timestamp         value  sum
0   groupa  yyyy-mm-dd 00:16:35.111 1     5
1   groupa  yyyy-mm-dd 00:16:45.111 2     2
2   groupa  yyyy-mm-dd 00:16:30.111 3     3
3   groupa  yyyy-mm-dd 00:16:35.411 4     5
4   groupb  yyyy-mm-dd 00:16:35.211 5     5

Как мне добиться этого?Заранее спасибо,

РЕДАКТИРОВАТЬ: Чтобы быть ясным, я не имею в виду просто сумму всех значений этой точной секунды.Например, значение в 00: 16: 34.899 все еще находится в пределах 1 секунды от 00: 16: 35.011.

1 Ответ

0 голосов
/ 10 декабря 2018

Попробуйте скопировать dataframe в качестве новой переменной df, и в df сделать столбец 'timestamp' все секунды каждой даты / времени, затем создать новый столбец 'sum' в dataframe и сделать егосумма каждой группы 'value' столбец groupby:

df=dataframe.copy()
df['timestamp']=pd.to_datetime(df['timestamp'].str.split().apply(lambda x: x[-1])).dt.second
dataframe['sum']=df.groupby(['groupings','timestamp'])['value'].transform('sum')

Обновление:

Наконец-то все заработало, как и ожидалось:

df=dataframe.copy()
df['timestamp']=pd.to_datetime(df['timestamp'].str.split().apply(lambda x: x[-1]))
threshold = pd.Timedelta(seconds=1)
dataframe['sum'] = df.groupby('groupings',as_index=False).apply(lambda df: [df.loc[(df['timestamp'] - t).abs() < threshold, 'value'].sum()
             for t in df['timestamp']])
dataframe['sum']=[x for i in dataframe['sum'].fillna('').tolist() for x in i]

Сейчас:

print(dataframe)

Требуется вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...