在处理数据的时候经常会碰见各种时间数据,但因为时间数据的格式不统一,所以导致数据处理的时候有一些麻烦。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().timestamp

1586782011
 

字符串中的时间数据也可以获取:

>>> 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시간 전'

>>> arrow.now('local').replace(days=-1).format('YYYY-MM-DDT00:00:00ZZ')

也可以根据两个时间获取两个时间之间的年或月或日

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“” 库:也可以获取两个时间之间的所有 月份 日期  并且可以设置输出形式。arrow库中的replace 方法可以做日期的加减,但是
datetime库对象不能使用
 
 
 
 
 

arrow:让Python的日期与时间变的更好的更多相关文章

  1. python操作日期和时间的方法

    不管何时何地,只要我们编程时遇到了跟时间有关的问题,都要想到 datetime 和 time 标准库模块,今天我们就用它内部的方法,详解python操作日期和时间的方法.1.将字符串的时间转换为时间戳 ...

  2. 分别用Excel和python进行日期格式转换成时间戳格式

    最近在处理一份驾驶行为方面的数据,其中要用到时间戳,因此就在此与大家一同分享学习一下. 1.什么是时间戳? 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01 ...

  3. Python中日期和时间格式化输出的方法

    本文转自:https://www.jb51.net/article/62518.htm 本文实例总结了python中日期和时间格式化输出的方法.分享给大家供大家参考.具体分析如下: python格式化 ...

  4. 【转】Python之日期与时间处理模块(date和datetime)

    [转]Python之日期与时间处理模块(date和datetime) 本节内容 前言 相关术语的解释 时间的表现形式 time模块 datetime模块 时间格式码 总结 前言 在开发工作中,我们经常 ...

  5. Python时间日期格式化之time与datetime模块总结

    1 引言 在实际开发过程中,我们经常会用到日期或者时间,那么在Python中我们怎么获取时间,以及如何将时间转换为我们需要的格式呢?在之前的开发中,也曾遇到time.datetime等模块下的不同函数 ...

  6. 程序员常用6 个 Python 的日期时间库

    内建的 datetime 模块 在跳转到其他库之前,让我们回顾一下如何使用 datetime 模块将日期字符串转换为 Python datetime 对象. 假设我们从 API 接受到一个日期字符串, ...

  7. Python:日期和时间的处理模块及相关函数

    Python:日期和时间的处理模块及相关函数 Python 提供 time 模块和 calendar 模块用于格式化日期和时间. 一.时间戳 在Python中,时间戳是以秒为单位的浮点小数,它是指格林 ...

  8. Python时间日期格式化之time与datetime模块

    1 引言 在实际开发过程中,我们经常会用到日期或者时间,那么在Python中我们怎么获取时间,以及如何将时间转换为我们需要的格式呢?在之前的开发中,也曾遇到time.datetime等模块下的不同函数 ...

  9. python 获取日期

    转载   原文:python 获取日期 作者:m4774411wang python 获取日期我们需要用到time模块,比如time.strftime方法 time.strftime('%Y-%m-% ...

随机推荐

  1. [Todo] Java及C++ Exception整理

    今天接触到一些Java Exception方面的内容,整理如下: http://developer.51cto.com/art/201111/304649.htm C++中Exception等的整理

  2. Hadoop I/O

    Hadoop自带一套原子操作用于数据I/O.当中一些技术,如数据完整性保持和压缩,对于处理多达数个TB的数据时.特别值得关注.另外一些Hadoop工具或API.所形成的构建模块可用于开发分布式系统.比 ...

  3. 解密SVM系列(四):SVM非线性分类原理实验

    前面几节我们讨论了SVM原理.求解线性分类下SVM的SMO方法.本节将分析SVM处理非线性分类的相关问题. 一般的非线性分类例如以下左所看到的(后面我们将实战以下这种情况): 能够看到在原始空间中你想 ...

  4. C# 实现对微博短网址的重定向还原

    新浪微博中,为了节省输入字数,通过短网址对发布微博中链接进行重定向.我们可以通过代码实现对短网址进行还原,代码如下: private string GetOrignalLink(string link ...

  5. vsftpd 本地用户无法登陆 530 Login incorrect

    查看日志,监测用户无法登陆的错误日志 tail -f /var/log/secure 查看vsFTPd配置 /etc/vsftpd/vsftpd.conf 通过查看日志,发现用户的密码已经过期了... ...

  6. es6- ArrayBuffer

    ArrayBuffer对象.TypedArray视图和DataView视图是 JavaScript 操作二进制数据的一个接口. 简单说: ArrayBuffer对象代表原始的二进制数据, TypedA ...

  7. OpenERP登录页面调整

    在OpenERP的登录页面中,有针对数据库管理的链接,为了安全起见,一般都会通过修改原始的XML来实现隐藏的目的.但这样每次重新安装以后,都要重新修改,很不方便,所以我们可以通过建立一个新模块的方式来 ...

  8. chrome 如何官网下载谷歌浏览器离线安装包

      如何官网下载chrome谷歌浏览器离线安装包 CreateTime--2017年7月4日08:38:30Author:Marydon 参考链接:http://jingyan.baidu.com/a ...

  9. if-else用法

      CreateTime--2016年10月31日14:22:25Author:Marydonif-else的多种用法: //方式一 function test1 (t) { var bl = t | ...

  10. javascript 字符串中单引号和双引号区别

    最近在使用JavaScript编程,遇到使用字符串的情况. 以下是一些测试代码: var str = 'This is Jack'; var str2 = "This is Tom" ...