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-% ...
随机推荐
- QT开发(十二)——QT事件处理机制
一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 ...
- Kotlin(2): 优雅地扩展类的方法和属性
欢迎Follow我的GitHub, 关注我的CSDN. 个人博客: http://www.wangchenlong.org/, 最新内容. Kotlin由JetBrains公司推出, 是兼容Java的 ...
- 一招搞定多Offer选择
12月9号在论坛看到一位毕业生问了一个问题: 如今两个offer 一个在南京,搞.net ,公司是国电南自.税前一年加起来几乎相同7.2万.一个是在上海.搞java,公司名叫鑫合汇(不知道各位有没实用 ...
- 搭建SpringBoot服务器,在公司内网中使用
搭建SpringBoot服务器,在公司内网中使用. 学习了:https://blog.csdn.net/z3881006/article/details/78902231 就是一个程序,托管于gith ...
- (linux shell)第二章--命令之乐(一)
文章来自于我的个人博客:(linux shell)第二章--命令之乐(一) 上一章我们描写叙述了一些linux shell中须要注意的一些语法.接下来我们開始了解linux shell的经常使用 ...
- JS中括号的用法
转自:http://blog.csdn.net/hongmin118/article/details/4584023 我们在一些JS代码中经常可以看到这样的用法 :(function(){})();那 ...
- Apache问题综述
1.配置好了,访问的时候出现Forbbiden,如下图:解决方法:1.修改读写权限: 2.将配置文件中httpd.conf的<Directory>中的Denly from all 改成Al ...
- 在github Pages上部署octopress搭建个人博客系统
原文链接:http://caiqinghua.github.io/blog/2013/08/26/deploy-octopress-to-github-pages/ 引子 上一篇博客已经说了为什么要搭 ...
- tomcat服务器开启gzip功能的方法
http://blog.csdn.net/wang_159369/article/details/8107163 tomcat5.0以后的版本是支持对输出内容进行gzip格式的压缩的.该功能默认是关闭 ...
- ios开发之-继承的实现运用
// // main.m // 继承 // // #import <Foundation/Foundation.h> #import "Animal.h" #impor ...