Python Pandas:每月或每周拆分TimeSerie

Rad*_*dar 7 python time-series pandas

我有一个跨越几年的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
Run Code Online (Sandbox Code Playgroud)

将数据帧拆分为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'])
Run Code Online (Sandbox Code Playgroud)

piR*_*red 8

使用groupbypd.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'))]
Run Code Online (Sandbox Code Playgroud)

您可以根据需要重置索引

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'))]
Run Code Online (Sandbox Code Playgroud)

在一个 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'))}
Run Code Online (Sandbox Code Playgroud)


tot*_*ico 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'))]
Run Code Online (Sandbox Code Playgroud)

这样,您还可以避免设置timestampas索引


另外,如果您的时间戳记是多重索引的一部分,则可以使用level参数(例如pd.Grouper(level='timestamp', freq='W'))来引用它。比起@jtromans,要注意了。

  • 如果您为时间戳使用多索引,则可以参考适当的级别 pd.Grouper(level='TM_ID',freq='M'),在我的情况下,TM_ID 是适当的日期时间表示。 (2认同)