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网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 Python
python中日期和时间格式化输出的方法小结
Mar 19 Python
详解Python的Flask框架中的signals信号机制
Jun 13 Python
Python使用sorted排序的方法小结
Jul 28 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
Python3 批量扫描端口的例子
Jul 25 Python
Django结合ajax进行页面实时更新的例子
Aug 12 Python
python3实现微型的web服务器
Sep 03 Python
python socket 聊天室实例代码详解
Nov 14 Python
Django集成celery发送异步邮件实例
Dec 17 Python
Django关于admin的使用技巧和知识点
Feb 10 Python
利用Python pandas对Excel进行合并的方法示例
Nov 04 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
PHPMailer 中文使用说明小结
2010/01/22 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
2015/09/25 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
Ext grid 添加右击菜单
2009/11/26 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
vue.js中created方法作用
2018/03/30 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
详解vue 不同环境配置不同的打包命令
2019/04/07 Javascript
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
[01:17:55]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
python先序遍历二叉树问题
2017/11/10 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
html5跨域通讯之postMessage的用法总结
2013/11/07 HTML / CSS
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
小学数学国培感言
2014/03/10 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
银行催款通知书
2015/04/17 职场文书
保护校园环境倡议书
2015/04/28 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书