У меня есть некоторые данные, упорядоченные по дате, в виде datetime index .Затем я задаю его так, чтобы оно было нерегулярным:
date_rng = pd.date_range(start='1/1/2018', end='1/8/2018', freq='H')
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(0,100,size=(len(date_rng)))
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date', drop=True)
df = df[df['data'] > 75]
В моем сервисе (это не для интерактивного использования) мне дают строку, которую я передаю pandas.resample
, чтобы агрегировать мои данные времени на любом уровне.Строка передается непосредственно в аргумент rule
и может иметь значения типа 'H'
, '3T'
, 'Q'
, 'M'
Я хотел бы использовать эту же строку для создания jsonкоторая похожа на следующую структуру:
{'my_aggregate_level_1': {'2018-01-01 03:00:00', '2018-01-01 07:00:00'},
'my_aggregate_level_2':{'2018-01-08 03:00:00'}}
Массив будет 'рваным', т.е. будут присутствовать не все записи, и не все ключи в json будут иметь одинаковую длину массива.
Цели для хорошего решения:
my_aggregate_level
- это уровень, установленный тем же строковым параметром, который задан для resample
- массива на уровне агрегатавсегда будут необработанные, ежечасные значения даты и времени
- В идеале строковый параметр не связан с кучей «правил перевода», таких как «Если
'D'
, тогда используйте .strftime
, как это, но если 'H'
использовать это и если 'M'
использовать это 'H'
просто вернет один массив, из необработанных значений
Так на практике, если 'D'
поставляется:
{'2018-01-01': {'2018-01-01 03:00:00', '2018-01-01 07:00:00'},
'2018-01-08':{'2018-01-08 03:00:00'}}
Обратите внимание, что на дневном уровне есть две клавиши, сЗначения в массиве делятся на правильный день.
Если указано 'M'
:
{'2018-01': {'2018-01-01 03:00:00', '2018-01-01 07:00:00', '2018-01-08 03:00:00'}}
Обратите внимание, что это означает, что содержимое массива значений в этом примере будет равно 3,так как все 3 даты находятся в одном и том же месяце
Вещи, которые я пробовал / смотрел, которые я не сделал хорошо:
Groupers
, они выглядят так, как будто онитолько агрегирование, основанное на некоторых правилах.Мне, в частности, необходимо вернуть фактические записи - . Технически сработает анализ нового столбца на основе аргумента
rule
, но это кажется неправильным, поскольку мне придется начинать преобразование каждого rule
в strftime
илианалогичный.Я еще не нашел функцию, которая принимает ту же строку символов и также не выполняет агрегирование - Является ли установка многоиндексных решений для этого?Возможно, но я не уверен, как его заполнить в отношении пункта выше о
'D'
, 'M'
и т. Д. - настраиваемый ресэмплер:
def custom_resampler(array_like):
return array_like
df.resample('W').apply(custom_resampler)
Что не работает.
Я понимаю, может быть, это не решаемо с правилами, приведенными выше, но я, вероятно, недостаточно хорош в pandas
, чтобы понять это.