2017-01-05 5 views
0

У меня есть DataFrame, содержащий временные ряды, такие как следующие:Создание нескольких подмножеств временных рядов на основе периода

enter image description here

Я хотел бы создать несколько подмножеств этого DataFrame, что бы каждый из которых содержит по недельная стоимость данных, начиная с воскресенья с утра до субботы 0 утра.

Я могу придумать способ сделать это с помощью RRule с timeutil, но, похоже, может быть более интуитивный/прямой метод с использованием периодов Pandas.

Однако я совершенно новичок в этом, поэтому не знаю, с чего начать искать. В идеале было бы что-то вроде:

Period= Sun 0am to Sat 0am 
Subsets=[] 
for Period in DataFrame: 
    Subsets.append(DataFrame[Period]) 

Что-то в этом роде .....

данные:

Pd.DataFrame(dict, columns=['timestamp','open','high','low','close','volume']) 

dict={'volume': {Timestamp('2005-03-06 19:00:00'): 521.0, Timestamp('2005-03-06 20:00:00'): 234.0, Timestamp('2005-03-06 20:30:00'): 164.0, Timestamp('2005-03-06 21:00:00'): 99.0, Timestamp('2005-03-06 17:30:00'): 1603.0, Timestamp('2005-03-06 21:30:00'): 389.0, Timestamp('2005-03-06 18:00:00'): 590.0, Timestamp('2005-03-06 17:00:00'): 1668.0, Timestamp('2005-03-06 19:30:00'): 79.0, Timestamp('2005-03-06 18:30:00'): 213.0}, 'low': {Timestamp('2005-03-06 19:00:00'): 1226.25, Timestamp('2005-03-06 20:00:00'): 1226.0, Timestamp('2005-03-06 20:30:00'): 1226.0, Timestamp('2005-03-06 21:00:00'): 1226.0, Timestamp('2005-03-06 17:30:00'): 1225.75, Timestamp('2005-03-06 21:30:00'): 1225.5, Timestamp('2005-03-06 18:00:00'): 1226.75, Timestamp('2005-03-06 17:00:00'): 1225.0, Timestamp('2005-03-06 19:30:00'): 1226.25, Timestamp('2005-03-06 18:30:00'): 1226.75}, 'timestamp': {Timestamp('2005-03-06 19:00:00'): 732011.79166666663, Timestamp('2005-03-06 20:00:00'): 732011.83333333337, Timestamp('2005-03-06 20:30:00'): 732011.85416666663, Timestamp('2005-03-06 21:00:00'): 732011.875, Timestamp('2005-03-06 17:30:00'): 732011.72916666663, Timestamp('2005-03-06 21:30:00'): 732011.89583333337, Timestamp('2005-03-06 18:00:00'): 732011.75, Timestamp('2005-03-06 17:00:00'): 732011.70833333337, Timestamp('2005-03-06 19:30:00'): 732011.8125, Timestamp('2005-03-06 18:30:00'): 732011.77083333337}, 'open': {Timestamp('2005-03-06 19:00:00'): 1227.0, Timestamp('2005-03-06 20:00:00'): 1226.25, Timestamp('2005-03-06 20:30:00'): 1226.5, Timestamp('2005-03-06 21:00:00'): 1226.0, Timestamp('2005-03-06 17:30:00'): 1225.75, Timestamp('2005-03-06 21:30:00'): 1225.75, Timestamp('2005-03-06 18:00:00'): 1227.0, Timestamp('2005-03-06 17:00:00'): 1225.75, Timestamp('2005-03-06 19:30:00'): 1226.25, Timestamp('2005-03-06 18:30:00'): 1227.25}, 'high': {Timestamp('2005-03-06 19:00:00'): 1227.0, Timestamp('2005-03-06 20:00:00'): 1226.5, Timestamp('2005-03-06 20:30:00'): 1226.5, Timestamp('2005-03-06 21:00:00'): 1226.25, Timestamp('2005-03-06 17:30:00'): 1227.5, Timestamp('2005-03-06 21:30:00'): 1226.0, Timestamp('2005-03-06 18:00:00'): 1227.5, Timestamp('2005-03-06 17:00:00'): 1226.25, Timestamp('2005-03-06 19:30:00'): 1226.75, Timestamp('2005-03-06 18:30:00'): 1227.5}, 'close': {Timestamp('2005-03-06 19:00:00'): 1226.25, Timestamp('2005-03-06 20:00:00'): 1226.25, Timestamp('2005-03-06 20:30:00'): 1226.0, Timestamp('2005-03-06 21:00:00'): 1226.0, Timestamp('2005-03-06 17:30:00'): 1227.0, Timestamp('2005-03-06 21:30:00'): 1225.5, Timestamp('2005-03-06 18:00:00'): 1227.25, Timestamp('2005-03-06 17:00:00'): 1225.5, Timestamp('2005-03-06 19:30:00'): 1226.5, Timestamp('2005-03-06 18:30:00'): 1226.75}} 
+0

вы можете использовать реальные данные вместо изображений – e4c5

+0

@ e4c5 Я вставил несколько строк. Я попытался вставить пару недель данных, но, очевидно, слишком много. Возможно, используя меньший период, его можно проверить, хотя –

ответ

1

Вы можете использовать:

#sample dataframe 
start = pd.to_datetime('2016-12-28') 
rng = pd.date_range(start, periods=100, freq='100min') 
df = pd.DataFrame({'timestamp': rng, 'X': range(100), 
        'id': ['a'] * 30 + ['b'] * 30 + ['c'] * 40 }) 
df = df.set_index(['timestamp']) 
#print (df) 

Первый фильтр из уикэнды по dayofweek с boolean indexing при необходимости:

#df = df[df.index.dayofweek < 5] 
#print (df) 

Затем используйте period_range с недельной частотой:

#first date in index 
first_date = df.index[0] 
#last date in index 
last_date = df.index[-1] 
per = pd.period_range(first_date,last_date, freq='W') 
print (per) 
PeriodIndex(['2016-12-26/2017-01-01', 
      '2017-01-02/2017-01-08'], dtype='period[W-SUN]', freq='W-SUN') 

Последним создать Subsets по list comprehension с преобразованием каждого периода to_timestamp и выберите значения по loc:

Subsets = [ df.loc[x.to_timestamp('D', how='s'): x.to_timestamp('D', how='e')] for x in per] 
#print (Subsets) 

Если loc не может быть использован, так как конечные точки не включены в Dataetimeindexboolean indexing:

Subsets = [ df[(df.index > x.to_timestamp('D', how='s')) & 
       (df.index < x.to_timestamp('D', how='e'))] for x in per] 
#print (Subsets) 
Смежные вопросы