python Pandas库基础分析之时间序列的处理详解


Posted in Python onJuly 13, 2019

前言

在使用Python进行数据分析时,经常会遇到时间日期格式处理和转换,特别是分析和挖掘与时间相关的数据,比如量化交易就是从历史数据中寻找股价的变化规律。Python中自带的处理时间的模块有datetime,NumPy库也提供了相应的方法,Pandas作为Python环境下的数据分析库,更是提供了强大的日期数据处理的功能,是处理时间序列的利器。

1、生成日期序列

主要提供pd.data_range()和pd.period_range()两个方法,给定参数有起始时间、结束时间、生成时期的数目及时间频率(freq='M'月,'D'天,‘W',周,'Y'年)等。

两种主要区别在于pd.date_range()生成的是DatetimeIndex格式的日期序列;pd.period_range()生成的是PeriodIndex格式的日期序列。

以下通过生成月时间序列和周时间序列来对比下:

date_rng = pd.date_range('2019-01-01', freq='M', periods=12)
print(f'month date_range():
{date_rng}')
"""
date_range():
DatetimeIndex(['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30',
 '2019-05-31', '2019-06-30', '2019-07-31', '2019-08-31',
 '2019-09-30', '2019-10-31', '2019-11-30', '2019-12-31'],
 dtype='datetime64[ns]', freq='M')
"""
period_rng = pd.period_range('2019/01/01', freq='M', periods=12)
print(f'month period_range():
{period_rng}')
"""
period_range():
PeriodIndex(['2019-01', '2019-02', '2019-03', '2019-04', '2019-05', '2019-06',
 '2019-07', '2019-08', '2019-09', '2019-10', '2019-11', '2019-12'],
 dtype='period[M]', freq='M')
"""
date_rng = pd.date_range('2019-01-01', freq='W-SUN', periods=12)
print(f'week date_range():
{date_rng}')
"""
week date_range():
DatetimeIndex(['2019-01-06', '2019-01-13', '2019-01-20', '2019-01-27',
 '2019-02-03', '2019-02-10', '2019-02-17', '2019-02-24',
 '2019-03-03', '2019-03-10', '2019-03-17', '2019-03-24'],
 dtype='datetime64[ns]', freq='W-SUN')
"""
period_rng=pd.period_range('2019-01-01',freq='W-SUN',periods=12)
print(f'week period_range():
{period_rng}')
"""
week period_range():
PeriodIndex(['2018-12-31/2019-01-06', '2019-01-07/2019-01-13',
 '2019-01-14/2019-01-20', '2019-01-21/2019-01-27',
 '2019-01-28/2019-02-03', '2019-02-04/2019-02-10',
 '2019-02-11/2019-02-17', '2019-02-18/2019-02-24',
 '2019-02-25/2019-03-03', '2019-03-04/2019-03-10',
 '2019-03-11/2019-03-17', '2019-03-18/2019-03-24'],
 dtype='period[W-SUN]', freq='W-SUN')
"""
date_rng = pd.date_range('2019-01-01 00:00:00', freq='H', periods=12)
print(f'hour date_range():
{date_rng}')
"""
hour date_range():
DatetimeIndex(['2019-01-01 00:00:00', '2019-01-01 01:00:00',
 '2019-01-01 02:00:00', '2019-01-01 03:00:00',
 '2019-01-01 04:00:00', '2019-01-01 05:00:00',
 '2019-01-01 06:00:00', '2019-01-01 07:00:00',
 '2019-01-01 08:00:00', '2019-01-01 09:00:00',
 '2019-01-01 10:00:00', '2019-01-01 11:00:00'],
 dtype='datetime64[ns]', freq='H')
"""
period_rng=pd.period_range('2019-01-01 00:00:00',freq='H',periods=12)
print(f'hour period_range():
{period_rng}')
"""
hour period_range():
PeriodIndex(['2019-01-01 00:00', '2019-01-01 01:00', '2019-01-01 02:00',
 '2019-01-01 03:00', '2019-01-01 04:00', '2019-01-01 05:00',
 '2019-01-01 06:00', '2019-01-01 07:00', '2019-01-01 08:00',
 '2019-01-01 09:00', '2019-01-01 10:00', '2019-01-01 11:00'],
 dtype='period[H]', freq='H')
"""

2、生成Timestamp对象及转换

创建一个Timestamp时间戳对象有pd.Timestamp()方法和pd.to_datetime()方法。如下所示:

ts=pd.Timestamp(2019,1,1)
print(f'pd.Timestamp()-1:{ts}')
#pd.Timestamp()-1:2019-01-01 00:00:00
ts=pd.Timestamp(dt(2019,1,1,hour=0,minute=1,second=1))
print(f'pd.Timestamp()-2:{ts}')
#pd.Timestamp()-2:2019-01-01 00:01:01
ts=pd.Timestamp("2019-1-1 0:1:1")
print(f'pd.Timestamp()-3:{ts}')
#pd.Timestamp()-3:2019-01-01 00:01:01
print(f'pd.Timestamp()-type:{type(ts)}')
#pd.Timestamp()-type:<class 'pandas._libs.tslibs.timestamps.Timestamp'>
#dt=pd.to_datetime(2019,1,1) 不支持
dt=pd.to_datetime(dt(2019,1,1,hour=0,minute=1,second=1))
print(f'pd.to_datetime()-1:{dt}')
#pd.to_datetime()-1:2019-01-01 00:01:01
dt=pd.to_datetime("2019-1-1 0:1:1")
print(f'pd.to_datetime()-2:{dt}')
#pd.to_datetime()-2:2019-01-01 00:01:01
print(f'pd.to_datetime()-type:{type(dt)}')
#pd.to_datetime()-type:<class 'pandas._libs.tslibs.timestamps.Timestamp'>
#pd.to_datetime生成自定义时间序列
dtlist=pd.to_datetime(["2019-1-1 0:1:1", "2019-3-1 0:1:1"])
print(f'pd.to_datetime()-list:{dtlist}')
#pd.to_datetime()-list:DatetimeIndex(['2019-01-01 00:01:01', '2019-03-01 00:01:01'], dtype='datetime64[ns]', freq=None)
#时间戳转换为period月时期
pr = ts.to_period('M')
print(f'ts.to_period():{pr}')
#ts.to_period():2019-01
print(f'pd.to_period()-type:{type(pr)}')
#pd.to_period()-type:<class 'pandas._libs.tslibs.period.Period'>

3、生成period对象及转换

#定义时期period
per=pd.Period('2019')
print(f'pd.Period():{per}')
#pd.Period():2019
per_del=pd.Period('2019')-pd.Period('2018')
print(f'2019和2018间隔{per_del}年')#可以直接+、-整数(代表年)
#2019和2018间隔1年
#时期转换为时间戳
print(per.to_timestamp(how='end'))#2019-12-31 00:00:00
print(per.to_timestamp(how='start'))#2019-01-01 00:00:00

4、生成时间间隔Timedelta

#生成时间间隔Timedelta
print(pd.Timedelta(days=5, minutes=50, seconds=20, milliseconds=10, microseconds=10, nanoseconds=10))
#5 days 00:50:20.010010
#获取当前时间
now=pd.datetime.now()
#计算当前时间往后50天的日期
dt=now+pd.Timedelta(days=50)
print(f'当前时间是{now}, 50天后时间是{dt}')
#当前时间是2019-06-08 17:59:31.726065, 50天后时间是2019-07-28 17:59:31.726065
#只显示年月日
print(dt.strftime('%Y-%m-%d'))#2019-07-28

5、重采样及频率转换

#asfreq 按季度显示索引值
#'DatetimeIndex' object has no attribute 'asfreq'
date=pd.date_range('1/1/2018', periods=20, freq='D')
tsdat_series=pd.Series(range(20),index=date)
tsp_series=tsdat_series.to_period('D')
print(tsp_series.index.asfreq('Q'))
date=pd.period_range('1/1/2018', periods=20, freq='D')
tsper_series=pd.Series(range(20),index=date)
print(tsper_series.index.asfreq('Q'))
"""
PeriodIndex(['2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1',
 '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1',
 '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1',
 '2018Q1', '2018Q1'],
 dtype='period[Q-DEC]', freq='Q-DEC')
"""
#resample 按季度统计并显示
print(tsdat_series.resample('Q').sum().to_period('Q'))
"""
2018Q1 190
Freq: Q-DEC, dtype: int64
"""
#groupby 按周进行汇总求平均值
print(tsdat_series.groupby(lambda x:x.weekday).mean())
"""
0 7.0
1 8.0
2 9.0
3 10.0
4 11.0
5 12.0
6 9.5
dtype: float64
"""

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
go和python调用其它程序并得到程序输出
Feb 10 Python
详解Python中的条件判断语句
May 14 Python
Python连接PostgreSQL数据库的方法
Nov 28 Python
Python调用C# Com dll组件实战教程
Oct 12 Python
Django项目中用JS实现加载子页面并传值的方法
May 28 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
python 定时器每天就执行一次的实现代码
Aug 14 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
python实现输出一个序列的所有子序列示例
Nov 18 Python
Python时间差中seconds和total_seconds的区别详解
Dec 26 Python
Visual Studio Code搭建django项目的方法步骤
Sep 17 Python
Python可视化神器pyecharts之绘制箱形图
Jul 07 Python
简单了解python反射机制的一些知识
Jul 13 #Python
Python3内置模块之base64编解码方法详解
Jul 13 #Python
Python3enumrate和range对比及示例详解
Jul 13 #Python
基于Python的ModbusTCP客户端实现详解
Jul 13 #Python
Python Numpy库datetime类型的处理详解
Jul 13 #Python
Python3内置模块random随机方法小结
Jul 13 #Python
简单了解python的一些位运算技巧
Jul 13 #Python
You might like
判断PHP数组是否为空的代码
2011/09/08 PHP
php中长文章分页显示实现代码
2012/09/29 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
PHP使用反向Ajax技术实现在线客服系统详解
2019/07/01 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
2013/03/06 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
2014/08/24 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
浅析JavaScript动画模拟拖拽原理
2016/12/09 Javascript
一个炫酷的Bootstrap导航菜单
2016/12/28 Javascript
JavaScript 中 apply 、call 的详解
2017/03/21 Javascript
vue组件与复用详解
2018/04/08 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
JS实现水平移动与垂直移动动画
2019/12/19 Javascript
Python给图像添加噪声具体操作
2019/03/03 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
python实现单机五子棋
2020/08/28 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
Python日志打印里logging.getLogger源码分析详解
2021/01/17 Python
技校个人求职信范文
2014/01/25 职场文书
经典洗发水广告词
2014/03/13 职场文书
继承公证书
2014/04/09 职场文书
专业见习报告范文
2014/11/03 职场文书
2014年技术员工作总结
2014/11/18 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
公司财务管理制度
2015/08/04 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
html5调用摄像头实例代码
2021/06/28 HTML / CSS