周期由高频率转向低频率称为降采样:例如5分钟股票交易数据转换为日交易数据
相反,周期也可以由低频转向高频称为升采样
其他重采样:例如每周三(W-WED)转换为每周五(W-FRI)
1 import pandas as pd
2 import numpy as np
3
4 # 创建一个时间戳序列
5 s = pd.Series(np.random.randn(5),
6 index=pd.date_range('2016-04-01',periods=5,freq='M'))
7 # 注意它给的起始时间,与输出的时间对比,
8 # 它给定的频率为月份输出的月份从每个月的最后一天算起
9 # 输出
10 2016-04-30 -0.487238
11 2016-05-31 0.376708
12 2016-06-30 -1.830840
13 2016-07-31 -0.426218
14 2016-08-31 1.913151
15 Freq: M, dtype: float64
16
17 # 将时间戳的序列转换为时期序列,
18 s.to_period()
19 # 输出
20 2016-04 -0.487238
21 2016-05 0.376708
22 2016-06 -1.830840
23 2016-07 -0.426218
24 2016-08 1.913151
25 Freq: M, dtype: float64
26
27 # 创建周期频率为天的时间序列
28 ts = pd.Series(np.random.randn(5),
29 index=pd.date_range('2016-12-29',periods=5,freq='D'))
30 # 这个时间序列与第5行的不同,它的频率变以天为单位
31
32 # 当转换为时期序列,它的频率也是默认天为单位
33 ts.to_period() # 与28行的结果相同
34
35 pts = ts.to_period(freq='M')
36 # 把频率变为月时原来的总时间没变只是频率变了它将输出
37 2016-12 -0.525272
38 2016-12 -2.610914
39 2016-12 1.094692
40 2017-01 -1.721324
41 2017-01 0.631946
42 Freq: M, dtype: float64
43
44 # 也可以再转为时间戳序列
45 pts.to_timestamp()
46 # 输出
47 2016-12-01 0.797379
48 2016-12-01 -0.085046
49 2016-12-01 -0.271226
50 2017-01-01 1.320668
51 2017-01-01 0.168546
52 dtype: float64
53
54 pts.to_timestamp(how='end') # 可以输出每月的最后结束时间
55 # 输出
56 2016-12-31 23:59:59.999999999 0.797379
57 2016-12-31 23:59:59.999999999 -0.085046
58 2016-12-31 23:59:59.999999999 -0.271226
59 2017-01-31 23:59:59.999999999 1.320668
60 2017-01-31 23:59:59.999999999 0.168546
61 dtype: float64
62
63 # 创建以周期频率为分的时间序列
64 ts = pd.Series(np.random.randint(0,50,60),
65 index=pd.date_range('2016-04-25 09:30',periods=60,freq='T'))
66 # 通过降采样,降低时间频率
67 ts.resample('5min',how='sum') # how='sum',表示对降采样的时间段求和
68 # 输出 它是以时间开始的时候为准,即时间轴的左端
69 2016-04-25 09:30:00 135
70 2016-04-25 09:35:00 120
71 2016-04-25 09:40:00 138
72 2016-04-25 09:45:00 101
73 ......
74
75 ts.resample('5min',how='sum',label='right') # 也可以以末尾时间为准,即时间轴右端
76 # 输出
77 2016-04-25 09:35:00 135
78 2016-04-25 09:40:00 120
79 2016-04-25 09:45:00 138
80 2016-04-25 09:50:00 101
81 ......
82
83 ts.resample('5min',how='ohlc')
84 # 它创建了一个DataFrame,以时间为行索引,分别以open、high、low、close
85 # 为列索引,how='ohlc'就是前面每个列索引的首字母
86
87 ts = pd.Series(np.random.randint(0,50,100),
88 index=pd.date_range('2016-03-01',periods=100,freq='D'))
89
90 ts.groupby(lambda x: x.month).sum()
91 # lambda表达式中的x为ts,把ts中的月份进行分组并求每月的总量
92 ts.groupby(ts.index.to_period('M')).sum() # 与上一行效果相同
1 import pandas as pd
2 import numpy as np
3
4 df = pd.DataFrame(np.random.randint(1,50,2),
5 index=pd.date_range('2016-04-22',periods=2,freq='W-FRI'))
6 # 它的周期频率为星期五
7
8 df.resample('D',fill_method='ffill')
9 # 用升采样的方式,将频率提高的每天,
10 # fill_method='ffill',表示向上填充值,即所要填充的值与上一行相同
11
12 df.resample('D',fill_method='ffill',limit=3)
13 # limit=3表示最后3行被限制不填入值,默认填NaN
14
15 df.resample('W-MON',fill_method='ffill')
16 # 表示以以周一为频率重新采样
17
18
19 df = pd.DataFrame(np.random.randint(2,30,(24,4)),
20 index=pd.period_range('2015-01','2016-12',freq='M'),
21 columns=list('ABCD')
22
23 df.resample('A-DEC',how='sum') # 用年频率重采样
24
25 df.resample('A-MAR',how='sum') # 用财年重采样,每年的三月分
26
27 pdf = df.resample('A-DEC',how='mean') # 用年频率重采样,算出每年的均值
28
29 pdf.resample('Q-DEC',fill_method='ffill') # 将上一行的值再以季度频率重采样