Как обновить значение индекса даты и времени для фрейма данных pandas?

1

У меня есть данные за час и на одну минуту, которые мы пересчитываем в 5-минутные бункеры: (В процессе производства мы не контролируем полученный файл данных. Это дает образец).

import numpy as np
import pandas as pd

rng = pd.date_range('7/29/2018 17:00', periods=61, freq='min')
ts = pd.DataFrame(np.ones(len(rng)), index=rng)

five_min_bins  = ts.resample('5min').sum()

Это (правильно) дает бит, начинающийся в 18:00:

five_min_bins[-3:]
Out[]: 
                       0
2018-07-29 17:50:00  5.0
2018-07-29 17:55:00  5.0
2018-07-29 18:00:00  1.0

Что такое хороший способ подтолкнуть последнюю точку данных в предыдущий бит?

Лучшее, что я придумал до сих пор, выглядит взломанным:

# hack, this question is how to improve this piece of code.
import datetime
ts = ts.reset_index(drop=False)
ts['index'].iloc[-1] = ts['index'].iloc[-1] - datetime.timedelta(milliseconds=1)
ts = ts.set_index('index')

Оно работает. Но знает ли кто-нибудь более элегантное решение?

ts[-1:]
Out[]: 
                     level_0    0
index                                
2018-07-29 17:59:59.999       60  1.0

ts.resample('5min').sum()[-3:]
Out[]: 
                 level_0    0
index                            
2018-07-29 17:45:00      235  5.0
2018-07-29 17:50:00      260  5.0
2018-07-29 17:55:00      345  6.0
Теги:
pandas

1 ответ

1
Лучший ответ

Аналогичная идея:

ts.index = ts.index[:-1].union([ts.index[-1] - pd.Timedelta(1, unit='ms')])

five_min_bins  = ts.resample('5min').sum()
print (five_min_bins)
                       0
2018-07-29 17:00:00  5.0
2018-07-29 17:05:00  5.0
2018-07-29 17:10:00  5.0
2018-07-29 17:15:00  5.0
2018-07-29 17:20:00  5.0
2018-07-29 17:25:00  5.0
2018-07-29 17:30:00  5.0
2018-07-29 17:35:00  5.0
2018-07-29 17:40:00  5.0
2018-07-29 17:45:00  5.0
2018-07-29 17:50:00  5.0
2018-07-29 17:55:00  6.0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню