Агрегируйте метку времени для каждых 15 минут и вычисляйте сумму соответствующего значения с помощью панд - PullRequest
0 голосов
/ 23 января 2019

У меня есть набор данных, который содержит два столбца (метка времени, значение).

Теперь мне нужно агрегировать значение метки времени каждые 15 минут (создать новый фрейм данных, имеющий два столбца: один - новую метку времени для каждых 15 минут, а второй - общее значение) и вычислить сумму значения, соответствующего каждой метке времени. новое общее значение второго столбца в новом фрейме данных.

Вот как выглядит мой примерный набор данных:

timestamp           value
2018-03-30 23:59:13.000 647
2018-03-30 23:53:12.000 1297
2018-03-30 23:51:35.000 647
2018-03-30 23:54:21.000 1502
2018-03-30 23:52:40.000 287
2018-03-30 23:45:52.000 1287
2018-03-30 23:51:42.000 636
2018-03-30 23:46:28.000 310
2018-03-30 23:46:04.000 511
2018-03-30 23:48:16.000 292
2018-03-30 23:44:34.000 343
2018-03-30 23:44:53.000 288
2018-03-30 23:37:41.000 287
2018-03-30 23:37:40.000 356
2018-03-30 23:40:38.000 647
2018-03-30 23:40:29.000 288
2018-03-30 23:36:18.000 597
2018-03-30 23:33:28.000 307
2018-03-30 23:35:14.373 287

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

timestamp               totalValue
2018-03-30 23:59:59.000 7416
2018-03-30 23:45:00.000 3400

Фактический набор данных содержит ~ 20000000 строк

Я разработал решение, которое работает так, как ожидалось, но на его выполнение уходит много времени. Ниже мое решение:

# prepare and group the data
from itertools import groupby
from datetime import datetime, timedelta

def get_key(d):
    # group by 15 minutes
    k = d + timedelta(minutes=-(d.minute % 15))
    return datetime(k.year, k.month, k.day, k.hour, k.minute, 0)

g = groupby(sorted(inputData['dt_ts_when']), key=get_key)

aggregateTimeIntervalList = []

for key, items in g:
    tempList = []
    count = 0
    for item in items:
        item = item.strftime("%Y-%m-%d %H:%M:%S")
        timerequiredSeries = (inputData[inputData['timestamp'].str.contains(item, regex=False, na=False)]['value']).tolist()        
        for val in timerequiredSeries:
            count += val
    tempList.append(count)
    tempList.append(key)
    aggregateTimeIntervalList.append(tempList)
print("Done")

, где

inputData['timestamp'] - столбец отметки времени, а inputData['value'] - столбец значения.

Пожалуйста, помогите мне найти лучшее решение

...