分享

Python数据处理分析(1):日期型数据处理

 鹰兔牛熊眼 2019-01-24

摘要: 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:///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-2017

 1data = 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的一个接口返回的数据,介绍了日期型数据的转换和处理。

本文完。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多