我有一个跨越几年的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
将数据帧拆分为1周或1个月数据的多个数据帧的最简单方法是什么?77
编辑:作为一个例子,包含1年数据的数据帧将被分成52个包含一周数据的数据帧,并作为52个数据帧的列表返回
(数据可以用下面的公式重建)
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'])
piRSquared.. 8
使用groupby
与pd.TimeGrouper
和list解析
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'))}
toto_tico.. 6
将pd.TimeGrouper
被弃用,并且将被删除,您可以使用pd.Grouper
来代替。
weeks = [g for n, g in df.groupby(pd.Grouper(key='timestamp',freq='W'))] months = [g for n, g in df.groupby(pd.Grouper(key='timestamp',freq='M'))]
这样,您还可以避免设置timestamp
as索引。
另外,如果您的时间戳记是多重索引的一部分,则可以使用level
参数(例如pd.Grouper(level='timestamp', freq='W')
)来引用它。比起@jtromans,要注意了。
使用groupby
与pd.TimeGrouper
和list解析
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'))}
将pd.TimeGrouper
被弃用,并且将被删除,您可以使用pd.Grouper
来代替。
weeks = [g for n, g in df.groupby(pd.Grouper(key='timestamp',freq='W'))] months = [g for n, g in df.groupby(pd.Grouper(key='timestamp',freq='M'))]
这样,您还可以避免设置timestamp
as索引。
另外,如果您的时间戳记是多重索引的一部分,则可以使用level
参数(例如pd.Grouper(level='timestamp', freq='W')
)来引用它。比起@jtromans,要注意了。