Pandas Resample: форсирование определенного времени начала временных баров - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть некоторый временной ряд data (pandas.DataFrame), и я повторно делаю его в '600S' барах:

import numpy as np
data.resample('600S', level='time').aggregate({'abc':np.sum})

Я получаю что-то вроде этого:

                   abc
time                
09:30:01.446000  19836
09:40:01.446000   8577
09:50:01.446000  29746
10:00:01.446000  29340
10:10:01.446000   5197
...

Как я могу заставить временные полосы начинаться с 09:30:00.000000 вместо времени 1-й строки в данных?Т.е. вывод должен быть примерно таким:

                   abc
time                
09:30:00.000000  *****
09:40:00.000000   ****
09:50:00.000000  *****
10:00:00.000000  *****
10:10:00.000000   ****
...

Спасибо за помощь!

Ответы [ 2 ]

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

.resample немного подстановочный знак.С datetime64[ns] и timedelta64[ns] он ведет себя довольно по-разному, поэтому лично я считаю более надежным работать с groupby, когда просто выполняю такие операции, как .sum или .first.

Пример данных

import pandas as pd
import numpy as np

n = 1000
np.random.seed(123)
df = pd.DataFrame({'time': pd.date_range('2018-01-01 01:13:43', '2018-01-01 23:59:59', periods=n),
                   'abc': np.random.randint(1,1000,n)})

Когда dtype равен datetime64[ns], он будет выполнять повторную выборку в "округленные" ячейки:

df.dtypes
#time    datetime64[ns]
#abc              int32
#dtype: object

df.set_index('time').resample('600S').sum()
                      abc
time                     
2018-01-01 01:10:00  2572
2018-01-01 01:20:00  2257
2018-01-01 01:30:00  2470
2018-01-01 01:40:00  3131
2018-01-01 01:50:00  3402

При timedelta64[ns] вместо этого он начинает ячейки на основе вашего первого наблюдения:

df['time'] = pd.to_timedelta(df.time.dt.time.astype('str'))
df.dtypes
#time    timedelta64[ns]
#abc               int32
#dtype: object

df.set_index('time').resample('600S').sum()
           abc
time          
01:13:43  3432
01:23:43  2447
01:33:43  2588
01:43:43  3202
01:53:43  2547

Так что в случае столбца timedelta64[ns] я бы посоветовал вам пойти с groupby, создавая ячейки из .dt.floor, чтобы создать ваши 10-минутные ячейки, которые идут от [XX:00:00 - XX:10:00]

df.groupby(df.time.dt.floor('600S')).sum()
#           abc
#time          
#01:10:00  2572
#01:20:00  2257
#01:30:00  2470
#01:40:00  3131
#01:50:00  3402

Это тот же результат, который мы получили в первом случае с типом datetime64[ns] d, который связан с "круглыми" ячейками.

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

Вы можете добавить Series.dt.floor к вашему коду:

df.time = df.time.dt.floor('10 min')

              time    abc
0 2018-12-05 09:30:00  19836
1 2018-12-05 09:40:00   8577
2 2018-12-05 09:50:00  29746
3 2018-12-05 10:00:00  29340
4 2018-12-05 10:10:00   5197
...