Resample/Upsample Period Index и использование обоих крайних временных границ данных

У меня есть следующий DataFrame, еженедельная временная серия данных о ценах с индексом периода. Давайте назовем это df

                            timestamp         open        high        low        close  volume
timestamp                       
2009-02-01/2009-02-07   733442.166309   830.540773  832.586910  828.788627  830.706009  48401.952790
2009-02-08/2009-02-14   733449.166309   839.945279  841.763948  837.812232  839.742489  53429.330472
2009-02-15/2009-02-21   733456.245777   790.733108  792.399775  788.897523  790.549550  50671.887387
2009-02-22/2009-02-28   733463.166309   760.586910  762.640558  758.234979  760.428112  60565.506438

Если я попытаюсь повторить это с df.resample('30min').mean() данные заканчиваются на 2009-02-22, Я хотел бы, чтобы это закончилось на 2009-02-28пока еще начинаю 2009-02-01, Как я могу это сделать?
Я подозреваю, что это связано с closed а также label значения resample функции, но это не очень хорошо объяснено в док.

Вот фрагмент кода для восстановления кадра данных:

import pandas as pd
from pandas import Period
dikt={'volume': {Period('2009-02-01/2009-02-07', 'W-SAT'): 48401.952789699571, Period('2009-02-08/2009-02-14', 'W-SAT'): 53429.330472103007, Period('2009-02-15/2009-02-21', 'W-SAT'): 50671.887387387389, Period('2009-02-22/2009-02-28', 'W-SAT'): 60565.506437768243}, 'close': {Period('2009-02-01/2009-02-07', 'W-SAT'): 830.70600858369096, Period('2009-02-08/2009-02-14', 'W-SAT'): 839.74248927038627, Period('2009-02-15/2009-02-21', 'W-SAT'): 790.54954954954951, Period('2009-02-22/2009-02-28', 'W-SAT'): 760.42811158798281}, 'open': {Period('2009-02-01/2009-02-07', 'W-SAT'): 830.54077253218884, Period('2009-02-08/2009-02-14', 'W-SAT'): 839.94527896995703, Period('2009-02-15/2009-02-21', 'W-SAT'): 790.73310810810813, Period('2009-02-22/2009-02-28', 'W-SAT'): 760.58690987124464}, 'high': {Period('2009-02-01/2009-02-07', 'W-SAT'): 832.58690987124464, Period('2009-02-08/2009-02-14', 'W-SAT'): 841.76394849785413, Period('2009-02-15/2009-02-21', 'W-SAT'): 792.39977477477476, Period('2009-02-22/2009-02-28', 'W-SAT'): 762.64055793991417}, 'low': {Period('2009-02-01/2009-02-07', 'W-SAT'): 828.78862660944208, Period('2009-02-08/2009-02-14', 'W-SAT'): 837.8122317596567, Period('2009-02-15/2009-02-21', 'W-SAT'): 788.89752252252254, Period('2009-02-22/2009-02-28', 'W-SAT'): 758.23497854077254}, 'timestamp': {Period('2009-02-01/2009-02-07', 'W-SAT'): 733442.16630901292, Period('2009-02-08/2009-02-14', 'W-SAT'): 733449.16630901292, Period('2009-02-15/2009-02-21', 'W-SAT'): 733456.24577702698, Period('2009-02-22/2009-02-28', 'W-SAT'): 733463.16630901292}}
pd.DataFrame(dikt, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])

1 ответ

Решение

Поскольку вы хотите включить start_time соответствует первому PeriodIndex а также end_time соответствующие последнему, ключевые аргументы присутствуют в DF.resample здесь мало что поможет, так как они работают как единое целое / взаимоисключающие по своей природе (то есть изменение любого аргумента может повлиять на start_time или же end_time но не оба).

Вместо этого вы можете уменьшить их, чтобы взять дневную частоту, "D" а затем выполнить агрегацию среднего для каждой группы в течение 30 минут.

df.resample('D').asfreq().resample('30T').mean()

convention Arg мог бы быть использован, если пересчет через start_time или же end_time специально должны были быть выполнены.


Проверять:

resamp_start = df.resample('30min').mean()
resamp_all = df.resample('D').asfreq().resample('30T').mean().head(resamp_start.shape[0])
resamp_start.equals(resamp_all)
True

Если вам требуется только индекс с передискретизацией, а не его агрегация, то имеет смысл уменьшить частоту дискретизации его текущей частоты до самой низкой целочисленной частоты, соответствующей частоте, которая должна быть пересчитана в течение [Здесь, 1 минута], а затем взять кусочки каждые 30 строк, чтобы вычислить это для каждой 30-минутной выборки.

df.resample('T').asfreq().iloc[::30]

Это даст вам образцы для всего 2009-02-28 по сравнению с более ранним случаем, когда даты до и не включая 2009-02-28 были рассмотрены в связи с их нормализацией (с поправкой на полночь), введенной в .resample('D') операция.

Другие вопросы по тегам