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如何实现守护进程的方法示例
Feb 08 Python
python利用socketserver实现并发套接字功能
Jan 26 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
Pandas Shift函数的基础入门学习笔记
Nov 16 Python
python 产生token及token验证的方法
Dec 26 Python
Python代码太长换行的实现
Jul 05 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
python取均匀不重复的随机数方式
Nov 27 Python
解决torch.autograd.backward中的参数问题
Jan 07 Python
Django数据结果集序列化并展示实现过程
Apr 22 Python
Windows下pycharm安装第三方库失败(通用解决方案)
Sep 17 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
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
JavaScript中的逻辑判断符&&、||与!介绍
2014/12/31 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
2016/03/07 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
canvas实现刮刮卡效果
2017/03/14 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
详解Django中间件执行顺序
2018/07/16 Python
Python3.5装饰器原理及应用实例详解
2019/04/30 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
python多线程爬取西刺代理的示例代码
2021/01/30 Python
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
美国爆米花工厂:The Popcorn Factory
2019/09/14 全球购物
缴纳养老保险的证明
2014/01/10 职场文书
新郎新娘婚礼答谢词
2014/01/11 职场文书
班级学习计划书
2014/04/27 职场文书
植物生产学专业求职信
2014/08/08 职场文书
2016应届毕业生就业指导课心得体会
2016/01/15 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL