在处理数据的时候经常会碰见各种时间数据,但因为时间数据的格式不统一,所以导致数据处理的时候有一些麻烦。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. HTML5/CSS3实现添加锁屏效果

     锁屏效果,也就是将屏幕置于模态,不允许用户触发任何动作,只能解除锁定后才能继续使用,jQueryUI的dialog有模态对话框,这一点不难做到.那么,首先需要在页面中添加一个div层,用于做模态的层 ...

  2. 神奇的container_of

    container_of是linux内核中常用的一个宏,这个宏的功能是,根据某个结构体字段的指针,找到对应的结构体指针. 话不多说,先上源码: /** * container_of - cast a ...

  3. NPOI导出Excel时出现错误“Maximum column number is 255”

    此错误并不是NPOI的问题,而是Excel的问题,原因是Excel的最大列255,所以导出的列超过255时就会出现此问题 但Excel2007以上并没有此问题,因为2007以上的列已经增加到16384 ...

  4. 最佳实践扩展Windows窗体DataGridView控件 .net 4.5 附示例代码

    Windows窗体DataGridView控件的性能调优.net 4.5   在处理大量数据时, DataGridView 控制可以消耗大量的内存开销,除非你仔细地使用它. 在客户有限的内存,你可以避 ...

  5. (C++)浅谈using namespace std

    1.<iostream>和<iostream.h> 在你的编译器include文件夹里面可以看到,二者是两个文件,里面的代码是不一样的. 后缀为.h的头文件c++标准已经明确提 ...

  6. Android单个进程内存分配策略

    android不同设备单个进程可用内存是不一样的,可以查看/system/build.prop文件. # This is a high density device with more memory, ...

  7. linux下tar.gz、tar、bz2、zip、 xz、rar等解压缩、压缩命令小结

    http://www.jb51.net/LINUXjishu/43356.html unrar x aa.rarunrar e aa.rarx参数 是解压到一个文件夹里 e参数是把所有文件解压到当前目 ...

  8. es5 - array - join

    /** * join描述:将数组(或类数组对象)的所有元素连接到一个字符串中并返回此字符串. * join语法:arr .join([ separator]) * join参数:指定用于分隔数组的每对 ...

  9. Spring整合JDBC实现简单的增删改

    Spring整合JDBC实现简单的增删改: 1.导入Spring的包和数据库的驱动包: 2.选择一个数据源(dbcp和C3P0) 3.导入数据源的包(这里我们使用dbcp) <span styl ...

  10. QtGui.QCheckBox

    A QtGui.QCheckBox is a widget that has two states: on and off. It is a box with a label. Check boxes ...