摘要: Python数据处理分析中,日期型数据的处理是相对复杂且非常重要的一环。本文以调用Tushare包获得股票的各种信息数据为案例,介绍日期数据的处理。
文章目录:
1. 获取数据2. 日期型数据处理2.1. 按日期切片筛选数据2.1.1. 按年度2.1.2. 按月度2.1.3. 按具体天2.2. to_period按日期显示数据2.2.1. 按年度2.2.2. 按季度2.2.3. 按月度2.3. resample按日期统计数据2.3.1. 按年度2.3.2. 按季度2.3.3. 按月度2.4. 统计和显示结合
之前的的一篇文章:10行代码爬取全国所有A股/港股/新三板上市公司信息,用爬虫实现了上市公司信息的抓取。但还有更简单的方法,就是调用Tushare包,可以很便捷地拿到干净的各种股市数据。
强烈推荐一下这款由国内团队开发的包,Github上目前Star数 6000+。Tushare是一个开源免费、强大的python金融财经数据接口包。调用该包返回的数据格式基本是Pandas DataFrame类型,非常便于后续处理分析。包的数据来源于新浪财经、腾讯财经、上交所和深交所,比较齐全,质量也很可靠。参考:
https://tushare.pro/document/2
https://github.com/waditu/Tushare
下面我们就来简单体检一下这款包的便利,然后利用它返回的数据处理其中的日期型数据。
1. 获取数据
接口使用前提:首先在官网注册成功后获得token,然后通过下面命令下载Tushare包,然后在程序中调用就可以使用了。
1 pip instasll tushare
可以获得的信息接口非常多,包括:行情数据、基础数据、财务数据板块等。
下面就简单使用下部分接口。首先,获取国内股票列表数据。1import tushare as ts
2ts.set_token('你的token')
3pro = ts.pro_api()
4data = pro.stock_basic(exchange_id='', is_hs='', fields='symbol,name,is_hs,list_date,list_status')
5print(data)
6# ''表示获取全部
exchange_id表示股票代码,可以获取特定股票的基础信息,为空则获取全部;is_hs表示是否沪深港通,为空表示提取所有股市;fields表示想要提取的信息列表。
结果如下:
1 ts_code symbol name list_status list_date is_hs
20 000001.SZ 000001 平安银行 L 19910403 S
31 000002.SZ 000002 万科A L 19910129 S
42 000004.SZ 000004 国农科技 L 19910114 N
53 000005.SZ 000005 世纪星源 L 19901210 N
64 000006.SZ 000006 深振业A L 19920427 S
75 000007.SZ 000007 全新好 L 19920413 N
86 000008.SZ 000008 神州高铁 L 19920507 S
97 000009.SZ 000009 中国宝安 L 19910625 S
108 000010.SZ 000010 美丽生态 L 19951027 N
119 000011.SZ 000011 深物业A L 19920330 S
1210 000012.SZ 000012 南玻A L 19920228 S
13···
143532 603987.SH 603987 康德莱 L 20161121 N
153533 603988.SH 603988 中电电机 L 20141104 N
163534 603989.SH 603989 艾华集团 L 20150515 H
173535 603990.SH 603990 麦迪科技 L 20161208 N
183536 603991.SH 603991 至正股份 L 20170308 N
193537 603993.SH 603993 洛阳钼业 L 20121009 H
203538 603996.SH 603996 中新科技 L 20151222 N
213539 603997.SH 603997 继峰股份 L 20150302 H
223540 603998.SH 603998 方盛制药 L 20141205 N
233541 603999.SH 603999 读者传媒 L 20151210 N
很轻松地就能获得3542家上市公司的基本情况。下面就将这个数据作为日期型处理的基础数据。
2. 日期型数据处理
查看一下数据结构:1RangeIndex: 3542 entries, 0 to 3541
2Data columns (total 6 columns):
3ts_code 3542 non-null object
4symbol 3542 non-null object
5name 3542 non-null object
6list_status 3542 non-null object
7list_date 3542 non-null object
8is_hs 3542 non-null object
9dtypes: object(6)
所有列都是object字符型。这里想对日期做数据分析,比如可以统计一下历年上市公司数量。需更改日期型数据字符型为日期型。
1data['list_date'] = pd.to_datetime(data['list_date'])
pd.to_datetime将'list_date'列格式改为datetime格式,再来看一下:1RangeIndex: 3542 entries, 0 to 3541
2Data columns (total 6 columns):
3ts_code 3542 non-null object
4symbol 3542 non-null object
5name 3542 non-null object
6list_status 3542 non-null object
7list_date 3542 non-null datetime64[ns]
8is_hs 3542 non-null object
9dtypes: object(6)
2.1. 按日期切片筛选数据
有时候我们需要按年、季度、月、日这样的日期格式来筛选提取相应的数据。
2.1.1. 按年度获取单一年份数据,比如2017年
1data = data.set_index(data['list_date'])
2data = data['2017']
3print(data.head())
4# 结果
5 ts_code symbol name list_status list_date is_hs
6list_date
72017-12-25 001965.SZ 001965 招商公路 L 2017-12-25 S
82017-03-24 002774.SZ 002774 快意电梯 L 2017-03-24 N
92017-01-12 002824.SZ 002824 和胜股份 L 2017-01-12 N
102017-01-06 002838.SZ 002838 道恩股份 L 2017-01-06 N
112017-01-24 002839.SZ 002839 张家港行 L 2017-01-24 S获取多个年份,比如2015-20171data = data['2015':'2017']
2print(data.head())
3# 结果
4 ts_code symbol name list_status list_date is_hs
5list_date
62015-01-26 000166.SZ 000166 申万宏源 L 2015-01-26 S
72017-12-25 001965.SZ 001965 招商公路 L 2017-12-25 S
82015-12-30 001979.SZ 001979 招商蛇口 L 2015-12-30 S
92015-01-27 002734.SZ 002734 利民股份 L 2015-01-27 N
102015-01-22 002739.SZ 002739 万达电影 L 2015-01-22 S
2.1.2. 按月度
1data = data['2017-1']
2print(data.head())
3# 结果
4 ts_code symbol name list_status list_date is_hs
5list_date
62017-01-12 002824.SZ 002824 和胜股份 L 2017-01-12 N
72017-01-06 002838.SZ 002838 道恩股份 L 2017-01-06 N
82017-01-24 002839.SZ 002839 张家港行 L 2017-01-24 S
92017-01-10 002840.SZ 002840 华统股份 L 2017-01-10 N
102017-01-19 002841.SZ 002841 视源股份 L 2017-01-19 S
2.1.3. 按具体天1data = data['2017-1-12']
2print(data.head())
3# 结果
4 ts_code symbol name list_status list_date is_hs
5list_date
62017-01-12 002824.SZ 002824 和胜股份 L 2017-01-12 N
72017-01-12 300584.SZ 300584 海辰药业 L 2017-01-12 N
82017-01-12 603628.SH 603628 清源股份 L 2017-01-12 H
92017-01-12 603639.SH 603639 海利尔 L 2017-01-12 H
2.2. to_period按日期显示数据
dataframe.to_period方法只是用于显示数据,但不会进行统计。
2.2.1. 按年度
1data = data.to_period('A') # 'A'默认是从'A-DEC'开始算,也可以根据情况设置为'A-JAN'
2print(data.head())
3# 结果
4 ts_code symbol name list_status list_date is_hs
5list_date
61991 000001.SZ 000001 平安银行 L 1991-04-03 S
71991 000002.SZ 000002 万科A L 1991-01-29 S
81991 000004.SZ 000004 国农科技 L 1991-01-14 N
91990 000005.SZ 000005 世纪星源 L 1990-12-10 N
101992 000006.SZ 000006 深振业A L 1992-04-27 S
可以看到,相比上面筛选数据时是按原始的日期,这里利用to_period方法,设置参数为'A'后,可以直接显示为年,这在后期可视化绘图时非常有用。
2.2.2. 按季度1data = data.to_period('Q') # 'Q'默认是从'Q-DEC'开始算,也可以根据情况设置为“Q-SEP”,“Q-FEB”等
2print(data.head())
3# 结果
4 ts_code symbol name list_status list_date is_hs
5list_date
61991Q2 000001.SZ 000001 平安银行 L 1991-04-03 S
71991Q1 000002.SZ 000002 万科A L 1991-01-29 S
81991Q1 000004.SZ 000004 国农科技 L 1991-01-14 N
91990Q4 000005.SZ 000005 世纪星源 L 1990-12-10 N
101992Q2 000006.SZ 000006 深振业A L 1992-04-27 S
2.2.3. 按月度
1data = data.to_period('M')
2print(data.head())
3# 结果
4 ts_code symbol name list_status list_date is_hs
5list_date
61991-04 000001.SZ 000001 平安银行 L 1991-04-03 S
71991-01 000002.SZ 000002 万科A L 1991-01-29 S
81991-01 000004.SZ 000004 国农科技 L 1991-01-14 N
91990-12 000005.SZ 000005 世纪星源 L 1990-12-10 N
101992-04 000006.SZ 000006 深振业A L 1992-04-27 S
2.3. resample按日期统计数据
按日期进行统计数据,可以利用resample方法。
2.3.1. 按年度1data = data.resample('AS').count()['name'] # count对各年上市公司数量进行计数
2print(data.head())
3# 结果
4list_date
51990-01-01 7
61991-01-01 4
71992-01-01 37
81993-01-01 106
91994-01-01 99
2.3.2. 按季度
1data = data.resample('Q').count()['name']
2print(data.head())
3# 结果
4list_date
51990-12-31 7
61991-03-31 2
71991-06-30 2
81991-09-30 0
91991-12-31 0
2.3.3. 按月度1data = data.resample('M').count()['name']
2print(data.head())
3# 结果
4list_date
51990-12-31 7
61991-01-31 2
71991-02-28 0
81991-03-31 0
91991-04-30 1
2.4. 统计和显示结合
利用前面的resample和to.period方法,可以按年、季度、月份汇总数据。
1# 汇总各年上市公司数量
2data = data.set_index(['list_date'])
3data = data.resample('AS').count()['ts_code']
4data = data.to_period('A')
5print(data.head())
6print(data.tail())
结果如下:1list_date
21990 7
31991 4
41992 37
51993 106
61994 99
7Freq: A-DEC, Name: name, dtype: int64
8list_date
92014 124
102015 223
112016 227
122017 438
132018 78
14Freq: A-DEC, Name: name, dtype: int64
基于上述数据,可以利用matplotlib绘制出历年上市公司数量的折线图:
折线图的具体绘制方法,见后续文章。
以上就是简单利用了Tushare的一个接口返回的数据,介绍了日期型数据的转换和处理。
本文完。