pandas之时间重采样笔记

 周期由高频率转向低频率称为降采样:例如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')  # 将上一行的值再以季度频率重采样

 

posted @ 2019-08-30 12:05  yg_staring  阅读(900)  评论(0编辑  收藏  举报