2017-01-12 3 views
2

У меня есть Timeserie, который охватывает несколько года, в следующем формате:Python Панда: Разделить TimeSerie в месяц или неделю

   timestamp open high low close volume 
0 2009-01-02 05:00:00 900.00 906.75 898.00 904.75 15673.0 
1 2009-01-02 05:30:00 904.75 907.75 903.75 905.50 4600.0 
2 2009-01-02 06:00:00 905.50 907.25 904.50 904.50 3472.0 
3 2009-01-02 06:30:00 904.50 905.00 903.25 904.75 6074.0 
4 2009-01-02 07:00:00 904.75 905.50 897.00 898.25 12538.0 

Что бы самый простой способ разделить этот dataframe на несколько dataframes 1 неделю или 1 месяц стоимость данных 77

EDIT: в качестве примера dataframe, содержащий 1 год данных будет разделен на 52 dataframes содержащего неделю данных и возвращается в виде списка из 52 dataframes

(данные могут быть восстановлены по следующей формуле:

import pandas as pd 
from pandas import Timestamp 
dikt={'close': {0: 904.75, 1: 905.5, 2: 904.5, 3: 904.75, 4: 898.25}, 'low': {0: 898.0, 1: 903.75, 2: 904.5, 3: 903.25, 4: 897.0}, 'open': {0: 900.0, 1: 904.75, 2: 905.5, 3: 904.5, 4: 904.75}, 'high': {0: 906.75, 1: 907.75, 2: 907.25, 3: 905.0, 4: 905.5}, 'volume': {0: 15673.0, 1: 4600.0, 2: 3472.0, 3: 6074.0, 4: 12538.0}, 'timestamp': {0: Timestamp('2009-01-02 05:00:00'), 1: Timestamp('2009-01-02 05:30:00'), 2: Timestamp('2009-01-02 06:00:00'), 3: Timestamp('2009-01-02 06:30:00'), 4: Timestamp('2009-01-02 07:00:00')}} 
pd.DataFrame(dikt, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) 
+0

Когда вы говорите, «раскол», как вы хотите, расколы доставлены? Вы хотите их в словаре? В другом кадре данных? Вы должны потратить время, чтобы указать, что вы ожидаете увидеть. – piRSquared

+0

@ piRSquared как пример, кадр данных, содержащий 1 год данных, будет разделен на 52 кадра данных недели и будет представлен как список из 52 фреймов данных. – Radar

ответ

2

использование groupby с pd.TimeGrouper и списковых

weeks = [g for n, g in df.set_index('timestamp').groupby(pd.TimeGrouper('W'))] 
months = [g for n, g in df.set_index('timestamp').groupby(pd.TimeGrouper('M'))] 

Вы можете сбросить индекс, если вам нужно

weeks = [g.reset_index() 
     for n, g in df.set_index('timestamp').groupby(pd.TimeGrouper('W'))] 
months = [g.reset_index() 
      for n, g in df.set_index('timestamp').groupby(pd.TimeGrouper('M'))] 

в dict

weeks = {n: g.reset_index() 
     for n, g in df.set_index('timestamp').groupby(pd.TimeGrouper('W'))} 
months = {n: g.reset_index() 
      for n, g in df.set_index('timestamp').groupby(pd.TimeGrouper('M'))} 
+0

Фантастический ответ, место на! Большое спасибо. Я знал, что есть способ сделать его очень кратким. Я пытался лучше понять метод groupby, но одна из трудностей, с которыми я сталкиваюсь, заключается в том, что невозможно проверить, что внутри объекта groupBy ... Почему это так? Или есть способ на самом деле сделать это? – Radar

+0

Объект groupby - это устройство, помогающее в этих групповых действиях. Он содержит информацию о том, где можно разделить фрейм данных, уникальные имена для каждой группы и ручные методы. На самом деле это не структура данных (я уверен, что вы можете интерпретировать ее как одну). Итерацией через нее, как я это делал, класс groupby говорит, чтобы он дал имя группы и срез блока данных для каждого имени. Вот почему я спросил, как вы этого хотели. – piRSquared

+0

Где можно найти документацию по «ручным методам» для объекта groupby? Страница документации не перечисляет их: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html – Radar

0

Преобразование timestamp столбца в DateTimeIndex, то вы можете нарезать его в различных направлениях.

1

Я хотел бы использовать группу, для этого, предположу, что Df хранит данные

df = df.set_index('timestamp') 
df.groupby(pd.TimeGrouper(freq='D') 

затем результирующие группы будут содержать все dataframes вы ищете. этот ответ упоминается здесь

How to group DataFrame by a period of time?