arrow:让Python的日期与时间变的更好
在处理数据的时候经常会碰见各种时间数据,但因为时间数据的格式不统一,所以导致数据处理的时候有一些麻烦。Python的标准库提供了相应模块,但可用性却不高,也不够人性化。本专栏之前已经有文章介绍过在R中如何处理时间数据(lubridate包),而Python中也有实现类似功能的包。这篇文章我们讲一下如何使用Python的第三方库Arrow来处理时间数据。
Arrow提供一种易用的智能的方式来创建、操作、格式化和转换时间数据。
基本使用
Arrow处理时间数据时需要先将数据转为Arrow对象,Arrow可以灵活的转化多种格式的时间数据,如以不同间隔符分隔的时间数据:
>>> arrow.get('2017-01-05')
<Arrow [2017-01-05T00:00:00+00:00]>
>>> arrow.get('2017.01.05')
<Arrow [2017-01-05T00:00:00+00:00]>
>>> arrow.get('2017/01/05')
<Arrow [2017-01-05T00:00:00+00:00]>
>>> arrow.get('2017/01.05')
<Arrow [2017-01-05T00:00:00+00:00]>
还有以不同顺序排列的时间数据:
>>> arrow.get('05/2017.01', 'DD/YYYY.MM')
<Arrow [2017-01-05T00:00:00+00:00]>
>>> arrow.get('05/01/2017', 'DD/MM/YYYY')
<Arrow [2017-01-05T00:00:00+00:00]>
>>> arrow.get('01.05.2017', 'MM.DD.YYYY')
<Arrow [2017-01-05T00:00:00+00:00]>
timestamps时间数据当然也可以:
>>> arrow.get('1586782011')
<Arrow [2020-04-13T12:46:51+00:00]>
>>> arrow.get('1586782011.123456')
<Arrow [2020-04-13T12:46:51.123456+00:00]>
>>> arrow.now().timestamp1586782011
字符串中的时间数据也可以获取:
>>> arrow.get('June was born in May 1980', 'MMMM YYYY')
<Arrow [1980-05-01T00:00:00+00:00]>
获取数据
转换为Arrow对象后,我们可以很方便的获取我们想要的各种时间数据,通过year、month、day、hour、minute、second、week等属性,如:
>>> now = arrow.now()
>>> now
<Arrow [2017-02-04T13:47:58.114342+08:00]>
>>> now.year
2017
>>> now.month
2
>>> now.day
4
>>> now.hour
13
>>> now.minute
47
>>> now.second
58
>>> now.week
5
修改数据
我们免不了需要对时间数据进行操作修改,Arrow也提供了很方便的方法来操作,如切换时区to()方法:
>>> utc = arrow.get('2017-02-03T13:47:58.114342+00:00')
>>> utc
<Arrow [2017-02-03T13:47:58.114342+00:00]>
>>> utc.to('local')
<Arrow [2017-02-03T21:47:58.114342+08:00]>
>>> utc.to('US/Pacific')
<Arrow [2017-02-03T05:47:58.114342-08:00]>
>>> utc.to('+02:00')
<Arrow [2017-02-03T15:47:58.114342+02:00]>
当然还有修改时间的replace()方法:
>>> utc = arrow.get('2017-02-03T13:47:58.114342+00:00')
>>> utc
<Arrow [2017-02-03T13:47:58.114342+00:00]>
>>> utc.replace(days=+1)
<Arrow [2017-02-04T13:47:58.114342+00:00]>
>>> utc.replace(days=+1, hours=-1)
<Arrow [2017-02-04T12:47:58.114342+00:00]>
>>> utc.replace(weeks=+1)
<Arrow [2017-02-10T13:47:58.114342+00:00]>
数据运算
Arrow对象可以通过简单的大于小于符合来判断时间先后,如:
>>> start = arrow.get('2017-02-03T15:47:58.114342+02:00')
>>> end = arrow.get('2017-02-02T07:17:41.756144+02:00')
>>> start
<Arrow [2017-02-03T15:47:58.114342+02:00]>
>>> end
<Arrow [2017-02-02T07:17:41.756144+02:00]>
>>> start > end
True
>>> start_to = start.to('+08:00')
>>> start == start_to
True
也可以通过'-'运算符来获得时间的差值,如:
>>> start - end
datetime.timedelta(1, 30616, 358198)
时间区间
Arrow也可以根据时间来获取一个时间区间,如:
>>> utc = arrow.get('2017-02-03T13:47:58.114342+00:00')
>>> utc
<Arrow [2017-02-03T13:47:58.114342+00:00]>
>>> utc.span('hour')
(<Arrow [2017-02-03T13:00:00+00:00]>, <Arrow [2017-02-03T13:59:59.999999+00:00]>)
>>> utc.span('year')
(<Arrow [2017-01-01T00:00:00+00:00]>, <Arrow [2017-12-31T23:59:59.999999+00:00]>)
>>> utc.span('day')
(<Arrow [2017-02-03T00:00:00+00:00]>, <Arrow [2017-02-03T23:59:59.999999+00:00]>)
也可以根据某个限定条件获取最大时间与最小时间,如:
>>> utc = arrow.get('2017-02-03T13:47:58.114342+00:00')
>>> utc
<Arrow [2017-02-03T13:47:58.114342+00:00]>
>>> utc.floor('year')
<Arrow [2017-01-01T00:00:00+00:00]>
>>> utc.ceil('year')
<Arrow [2017-12-31T23:59:59.999999+00:00]>
>>> utc.floor('day')
<Arrow [2017-02-03T00:00:00+00:00]>
>>> utc.ceil('day')
<Arrow [2017-02-03T23:59:59.999999+00:00]>
人性化
Arrow还提供了一些人性化比较时间的方式,humanize()方法,具体例子如下:
>>> earlier = arrow.utcnow().replace(hours=-2)
>>> earlier.humanize()
'2 hours ago'
>>> later = later = earlier.replace(hours=4)
>>> later.humanize(earlier)
'in 4 hours'
>>> import arrow
>>> utc = arrow.utcnow()
>>> utc
<Arrow [2013-05-11T21:23:58.970460+00:00]>
>>> utc = utc.replace(hours=-1)
>>> utc
<Arrow [2013-05-11T20:23:58.970460+00:00]>
>>> local = utc.to('US/Pacific')
>>> local
<Arrow [2013-05-11T13:23:58.970460-07:00]>
>>> arrow.get('2013-05-11T21:23:58.970460+00:00')
<Arrow [2013-05-11T21:23:58.970460+00:00]>
>>> local.timestamp
1368303838
>>> local.format('YYYY-MM-DD HH:mm:ss ZZ')
'2013-05-11 13:23:58 -07:00'
>>> local.humanize()
'an hour ago'
>>> local.humanize(locale='ko_kr')
'1시간 전'
也可以根据两个时间获取两个时间之间的年或月或日
start_time = arrow.utcnow().to("Asia/Shanghai").datetime
end_time = arrow.utcnow().to("Asia/Shanghai").datetime.replace(months=-6)
for r in arrow.Arrow.range('month', start_time, end_time):
print(r.format("YYYY-MM"))
还有一种情况:
当数据库保存的时间是东八区的时间例如:2017-09-25 09:17:47 当时通过get获取时区是0时区,不能通过arrow.get('2017-09-25 09:17:47').to('Asia/Shanghai')
去装换, 因为本身就是东八区。
此时使用:arrow.get("2017-09-25 09:17:47 "+".000+0800") 转化此时时间不变。
arrow:让Python的日期与时间变的更好的更多相关文章
- python操作日期和时间的方法
不管何时何地,只要我们编程时遇到了跟时间有关的问题,都要想到 datetime 和 time 标准库模块,今天我们就用它内部的方法,详解python操作日期和时间的方法.1.将字符串的时间转换为时间戳 ...
- 分别用Excel和python进行日期格式转换成时间戳格式
最近在处理一份驾驶行为方面的数据,其中要用到时间戳,因此就在此与大家一同分享学习一下. 1.什么是时间戳? 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01 ...
- Python中日期和时间格式化输出的方法
本文转自:https://www.jb51.net/article/62518.htm 本文实例总结了python中日期和时间格式化输出的方法.分享给大家供大家参考.具体分析如下: python格式化 ...
- 【转】Python之日期与时间处理模块(date和datetime)
[转]Python之日期与时间处理模块(date和datetime) 本节内容 前言 相关术语的解释 时间的表现形式 time模块 datetime模块 时间格式码 总结 前言 在开发工作中,我们经常 ...
- Python时间日期格式化之time与datetime模块总结
1 引言 在实际开发过程中,我们经常会用到日期或者时间,那么在Python中我们怎么获取时间,以及如何将时间转换为我们需要的格式呢?在之前的开发中,也曾遇到time.datetime等模块下的不同函数 ...
- 程序员常用6 个 Python 的日期时间库
内建的 datetime 模块 在跳转到其他库之前,让我们回顾一下如何使用 datetime 模块将日期字符串转换为 Python datetime 对象. 假设我们从 API 接受到一个日期字符串, ...
- Python:日期和时间的处理模块及相关函数
Python:日期和时间的处理模块及相关函数 Python 提供 time 模块和 calendar 模块用于格式化日期和时间. 一.时间戳 在Python中,时间戳是以秒为单位的浮点小数,它是指格林 ...
- Python时间日期格式化之time与datetime模块
1 引言 在实际开发过程中,我们经常会用到日期或者时间,那么在Python中我们怎么获取时间,以及如何将时间转换为我们需要的格式呢?在之前的开发中,也曾遇到time.datetime等模块下的不同函数 ...
- python 获取日期
转载 原文:python 获取日期 作者:m4774411wang python 获取日期我们需要用到time模块,比如time.strftime方法 time.strftime('%Y-%m-% ...
随机推荐
- go语言基础之switch语句 和 fallthrough 用途
Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码: 示例1 ...
- JQuery中简约的进度条插件推荐
JQuery Progress Bar是基于JQuery开发的进度条插件,秉承了JQuery的简约哲学.不仅容易使用,而且可以轻松定制外观.对于使用了JQuery框架的项目来说,需要使用进度条控件时这 ...
- office excel2013如何启用solver选项
Excel要启用solver很多地方说是要单独安装插件,我认为不同版本可能操作不同.此时office2013已经足够强大,可以通过下面的方法来启用solver 1:在office2013 Excel中 ...
- ormlite操作表记录
实体类的创建对应表中people表, @DatabaseTable(tableName="people") public class People { @DatabaseField ...
- 对hadoop 执行mapreduce时发生异常Illegal partition for的解决过程
来自:http://blog.csdn.net/hezuoxiang/article/details/6878026 写了个mapreduce的JAVA程序,自定义了个partition class ...
- poj 3311 Hie with the Pie dp+状压
Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4671 Accepted: 2471 ...
- laravel 安装环境安了三天!!
各种报错,各种升级,各种重装,重启!! 记录一下一些错误吧,,, 错误太复杂,,,, 原因:版本问题!.CPU虚拟化问题.win10问题.软件兼容性问题.还有就是各种不细心啥的 分割线 ...
- [转载]编写高性能js
一.执行效率 1. DOM 1.1 使用DocumentFragment优化多次append 说明:添加多个dom元素时,先将元素append到DocumentFragment中,最后统一将Docum ...
- 通讯录结构体方法的实现 和VS中存在的一些问题的分析
实现一个通讯录: 通讯录能够用来存储1000个人的信息.每一个人的信息包含: 姓名.性别.年龄.电话.住址 功能例如以下: 1. 加入联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信 ...
- MySQL学习总结(二)数据库以及表的基本操作
上一节中详细的介绍了关于MySQL数据库的安装过程,接下来我们就该对数据库以及表进行一些基本的操作了. 1.数据类型 MySQL数据库中提供了整数类型.浮点数类型.定点数类型.日期和时间类型.字符串类 ...