Python Pandas:每月或每周拆分TimeSerie

时间:2017-01-12 23:45:07

标签: python pandas time-series

我有一个跨越几年的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'])

5 个答案:

答案 0 :(得分:5)

groupbypd.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'))}

答案 1 :(得分:3)

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设置为索引

,如果时间戳是多索引的一部分,您可以使用level参数引用它(例如pd.Grouper(level='timestamp', freq='W') )。比@jtromans更好。

答案 2 :(得分:1)

timestamp列转换为DateTimeIndex,然后您可以通过多种方式切入其中。

答案 3 :(得分:1)

我会使用group by,假设df存储数据

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

然后生成的组将包含您要查找的所有数据帧。 这个答案在这里引用

How to group DataFrame by a period of time?

答案 4 :(得分:0)

TimeGrouper的概念是正确的,但是该语法似乎不适用于熊猫的最新版本。这是我在Pandas 1.1.3

上的工作代码
df_Time = df.copy()
df_Time = df_Time.groupby(pd.Grouper(key='time', freq='M')).agg({
    'polarity': 'mean',
})

pd.Grouper(key='time', freq='M')是您所需要的。 key是存在时间/时间戳记的列,而freq可以采用非常有用的选项获取多个值。偏移别名(频率选项)的完整列表可以在here

中找到

主要是

B: business day frequency
C: custom business day frequency
D: calendar day frequency
W: weekly frequency
M: month end frequency