我有一个跨越几年的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'])
答案 0 :(得分:5)
将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'))}
答案 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'))
然后生成的组将包含您要查找的所有数据帧。 这个答案在这里引用
答案 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