python时间日期函数与利用pandas进行时间序列处理详解


Posted in Python onMarch 13, 2018

python标准库包含于日期(date)和时间(time)数据的数据类型,datetime、time以及calendar模块会被经常用到。

datetime以毫秒形式存储日期和时间,datetime.timedelta表示两个datetime对象之间的时间差。

下面我们先简单的了解下python日期和时间数据类型及工具

给datetime对象加上或减去一个或多个timedelta,会产生一个新的对象

from datetime import datetime
from datetime import timedelta

now = datetime.now()
now

datetime.datetime(2017, 6, 27, 15, 56, 56, 167000)

datetime参数:datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])

delta = now - datetime(2017,6,27,10,10,10,10)
delta

datetime.timedelta(0, 20806, 166990)

delta.days

 0

delta.seconds

 20806

delta.microseconds

 166990

datetime模块中的数据类型

类型 说明
date 以公历形式存储日历日期(年、月、日)
time 将时间存储为时、分、秒、毫秒
datetime 存储日期和时间
timedelta 表示两个datetime值之间的差(日、秒、毫秒)

字符串和datetime的相互转换

1)python标准库函数

日期转换成字符串:利用str 或strftime

字符串转换成日期:datetime.strptime

stamp = datetime(2017,6,27)

str(stamp)

 '2017-06-27 00:00:00'

stamp.strftime('%y-%m-%d')#%Y是4位年,%y是2位年

 '17-06-27'

#对多个时间进行解析成字符串

date = ['2017-6-26','2017-6-27']

datetime2 = [datetime.strptime(x,'%Y-%m-%d') for x in date]

datetime2

 [datetime.datetime(2017, 6, 26, 0, 0), datetime.datetime(2017, 6, 27, 0, 0)]

2)第三方库dateutil.parser的时间解析函数

from dateutil.parser import parse

parse('2017-6-27')

 datetime.datetime(2017, 6, 27, 0, 0)

parse('27/6/2017',dayfirst =True)

 datetime.datetime(2017, 6, 27, 0, 0)

3)pandas处理成组日期

pandas通常用于处理成组日期,不管这些日期是DataFrame的轴索引还是列,to_datetime方法可以解析多种不同的日期表示形式。

date

 ['2017-6-26', '2017-6-27']

import pandas as pd

pd.to_datetime(date)



 DatetimeIndex(['2017-06-26', '2017-06-27'], dtype='datetime64[ns]', freq=None)

datetime 格式定义

代码 说明
%Y 4位数的年
%y 2位数的年
%m 2位数的月[01,12]
%d 2位数的日[01,31]
%H 时(24小时制)[00,23]
%l 时(12小时制)[01,12]
%M 2位数的分[00,59]
%S 秒[00,61]有闰秒的存在
%w 用整数表示的星期几[0(星期天),6]
%F %Y-%m-%d简写形式例如,2017-06-27
%D %m/%d/%y简写形式

pandas时间序列基础以及时间、日期处理

pandas最基本的时间序列类型就是以时间戳(时间点)(通常以python字符串或datetime对象表示)为索引的Series:

dates = ['2017-06-20','2017-06-21',\
   '2017-06-22','2017-06-23','2017-06-24','2017-06-25','2017-06-26','2017-06-27']


import numpy as np
ts = pd.Series(np.random.randn(8),index = pd.to_datetime(dates))


ts

 2017-06-20 0.788811
 2017-06-21 0.372555
 2017-06-22 0.009967
 2017-06-23 -1.024626
 2017-06-24 0.981214
 2017-06-25 0.314127
 2017-06-26 -0.127258
 2017-06-27 1.919773
 dtype: float64

ts.index

 DatetimeIndex(['2017-06-20', '2017-06-21', '2017-06-22', '2017-06-23',
     '2017-06-24', '2017-06-25', '2017-06-26', '2017-06-27'],
     dtype='datetime64[ns]', freq=None)

pandas不同索引的时间序列之间的算术运算会自动按日期对齐

ts[::2]#从前往后每隔两个取数据

 2017-06-20 0.788811
 2017-06-22 0.009967
 2017-06-24 0.981214
 2017-06-26 -0.127258
 dtype: float64

ts[::-2]#从后往前逆序每隔两个取数据

 2017-06-27 1.919773
 2017-06-25 0.314127
 2017-06-23 -1.024626
 2017-06-21 0.372555
 dtype: float64

ts + ts[::2]#自动数据对齐

 2017-06-20 1.577621
 2017-06-21   NaN
 2017-06-22 0.019935
 2017-06-23   NaN
 2017-06-24 1.962429
 2017-06-25   NaN
 2017-06-26 -0.254516
 2017-06-27   NaN
 dtype: float64

索引为日期的Series和DataFrame数据的索引、选取以及子集构造

方法:
1).index[number_int]

2)[一个可以被解析为日期的字符串]

3)对于,较长的时间序列,只需传入‘年'或‘年月'可返回对应的数据切片

4)通过时间范围进行切片索引

ts

 2017-06-20 0.788811
 2017-06-21 0.372555
 2017-06-22 0.009967
 2017-06-23 -1.024626
 2017-06-24 0.981214
 2017-06-25 0.314127
 2017-06-26 -0.127258
 2017-06-27 1.919773
 dtype: float64

ts[ts.index[2]]

 0.0099673896063391908

ts['2017-06-21']#传入可以被解析成日期的字符串

 0.37255538918121028

ts['21/06/2017']

 0.37255538918121028

ts['20170621']

 0.37255538918121028

ts['2017-06']#传入年或年月

 2017-06-20 0.788811
 2017-06-21 0.372555
 2017-06-22 0.009967
 2017-06-23 -1.024626
 2017-06-24 0.981214
 2017-06-25 0.314127
 2017-06-26 -0.127258
 2017-06-27 1.919773
 dtype: float64

ts['2017-06-20':'2017-06-23']#时间范围进行切片

 2017-06-20 0.788811
 2017-06-21 0.372555
 2017-06-22 0.009967
 2017-06-23 -1.024626
 dtype: float64

带有重复索引的时间序列

1).index.is_unique检查索引日期是否是唯一的

2)对非唯一时间戳的数据进行聚合,通过groupby,并传入level = 0(索引的唯一一层)

dates = pd.DatetimeIndex(['2017/06/01','2017/06/02','2017/06/02','2017/06/02','2017/06/03'])
dates

 DatetimeIndex(['2017-06-01', '2017-06-02', '2017-06-02', '2017-06-02',
     '2017-06-03'],
     dtype='datetime64[ns]', freq=None)

dup_ts = pd.Series(np.arange(5),index = dates)
dup_ts

 2017-06-01 0
 2017-06-02 1
 2017-06-02 2
 2017-06-02 3
 2017-06-03 4
 dtype: int32

dup_ts.index.is_unique

 False

dup_ts['2017-06-02']

 2017-06-02 1
 2017-06-02 2
 2017-06-02 3
 dtype: int32

grouped = dup_ts.groupby(level=0).mean()

grouped

 2017-06-01 0
 2017-06-02 2
 2017-06-03 4
 dtype: int32

dup_df = pd.DataFrame(np.arange(10).reshape((5,2)),index = dates )
dup_df

0 1
2017-06-01 0 1
2017-06-02 2 3
2017-06-02 4 5
2017-06-02 6 7
2017-06-03 8 9
grouped_df = dup_df.groupby(level=0).mean()##针对DataFrame

grouped_df

0 1
2017-06-01 0 1
2017-06-02 4 5
2017-06-03 8 9

本文总结了以下4个知识点

1)字符串、日期的转换方法

2)日期和时间的主要python,datetime、timedelta、pandas.to_datetime等

3)以时间为索引的Series和DataFrame的索引、切片

4)带有重复时间索引时的索引,.groupby(level=0)应用

Python 相关文章推荐
给Python中的MySQLdb模块添加超时功能的教程
May 05 Python
python3中bytes和string之间的互相转换
Feb 09 Python
Python PyQt5实现的简易计算器功能示例
Aug 23 Python
python3结合openpyxl库实现excel操作的实例代码
Sep 11 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
pytorch多GPU并行运算的实现
Sep 27 Python
python3 xpath和requests应用详解
Mar 06 Python
Python绘制全球疫情变化地图的实例代码
Apr 20 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
Python paramiko使用方法代码汇总
Nov 20 Python
Python 绘制多因子柱状图
May 11 Python
python用户管理系统
Mar 13 #Python
Windows环境下python环境安装使用图文教程
Mar 13 #Python
Python Numpy 数组的初始化和基本操作
Mar 13 #Python
python 中的list和array的不同之处及转换问题
Mar 13 #Python
python2.7安装图文教程
Mar 13 #Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
Mar 13 #Python
Django使用Celery异步任务队列的使用
Mar 13 #Python
You might like
PHP rsa加密解密使用方法
2015/04/27 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
2015/03/01 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
javascript数据类型中的一些小知识点(推荐)
2019/04/18 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
[04:00]黄浦江畔,再会英雄——完美世界DOTA2 TI9应援视频
2019/07/31 DOTA
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
Django自定义manage命令实例代码
2018/02/11 Python
Django-Rest-Framework 权限管理源码浅析(小结)
2018/11/12 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
携程英文网站:Trip.com
2017/02/07 全球购物
2014年入党积极分子党校培训心得体会
2014/07/08 职场文书
公司租房协议书
2014/10/14 职场文书
公司辞职信模板
2015/05/13 职场文书
军训决心书范文
2015/09/22 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python