龙空技术网

Arrow - 比标准库更好的Python日期时间库

每日开源代码 1124

前言:

今天同学们对“python计算速度快的日期类”大致比较关注,我们都需要剖析一些“python计算速度快的日期类”的相关资讯。那么小编在网摘上搜集了一些对于“python计算速度快的日期类””的相关文章,希望各位老铁们能喜欢,同学们快快来了解一下吧!

尽管 Python 具备着强大的标准库,但限于历史兼容等方方面面原因,Python 标准库中的日期时间库并不好用,类型繁杂,接口不统一。且有缺少许多有用的日期操作功能。Arrow,这个受到 moment.js 和 requests 启发的 Python 日期时间库,让你处理日期更加得心应手。

Python日期时间库

简介

Arrow,是 arrow-py 在 Github 上开源的 Python 日期时间库,项目位于 ,目前版本为 0.15.8。

目前 Python 提供的日期时间相关库包括:datetime, time, calendar, dateutil, pytz 等,类型繁多,相互之间兼容困难,且欠缺对于日期时间的一些常用操作,如对于非严格格式时间串的解析、关于时区和跨周跨月的日期计算等,使用起来十分不方便。

Arrow 提供了友好的日期、时间和时间戳的创建、操控、格式化和转换,实现了智能的接口来支持许多常用的日期时间应用场景,对时区有很好的支持,对于 ISO 8601 有着全面的支持,对时间范围和时间段有着丰富的功能支持,且能够自定义时间类型,使得开发者使用更少的代码,实现更为优雅而强大的日期时间操作。

Arrow日期时间库

安装

Arrow 目前支持 Python 2.7, 3.5, 3.6, 3.7, 3.8 和 3.9,使用 pip 安装:

pip install -U arrow
示例

Arrow 使用十分简单,接口简洁。我们来看一些基本的使用例子:

>>> import arrow>>> arrow.get('2013-05-11T21:23:58.970460+07:00')<Arrow [2013-05-11T21:23:58.970460+07:00]>>>> utc = arrow.utcnow()>>> utc<Arrow [2013-05-11T21:23:58.970460+00:00]>>>> utc = utc.shift(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]>>>> local.timestamp1368303838>>> local.format()'2013-05-11 13:23:58 -07:00'>>> 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 库中统一使用 Arrow 类型作为时间表示。首先,使用 get 函数,对一个日期时间字符串进行解析,获得了 Arrow 类型的时间表示。然后,使用 utcnow 函数,获得了 UTC 时区的当前时间,再使用 shift 接口,把时间往拨回一小时,之后再使用 to 接口进行时区的转换 。Arrow 类型中包含 timestamp 属性,可以获取 10 位的 Unix 时间戳。调用 format 函数,就可以进行时间的序列化,得到指定格式的时间字符串。另外,还可以使用 humanize 接口,获得更为贴合自然语言的时间表示,比如“an hour ago”,可以指定不同语言进行转换。

Arrow日期时间库

我们来看一些更为深入的例子。对于时间的创建,可以获取当前时间,接口包括 utcnow 和 now:

>>> arrow.utcnow()<Arrow [2013-05-07T04:20:39.369271+00:00]>>>> arrow.now()<Arrow [2013-05-06T21:20:40.841085-07:00]>>>> arrow.now('US/Pacific')<Arrow [2013-05-06T21:20:44.761511-07:00]>

也可以利用综合性的接口 get,来从不同形式的时间表示创建出 Arrow 的时间表示:

>>> arrow.get(1367900664)<Arrow [2013-05-07T04:24:24+00:00]>>>> arrow.get(1367900664.152325)<Arrow [2013-05-07T04:24:24.152325+00:00]>  >>> arrow.get(datetime.utcnow())<Arrow [2013-05-07T04:24:24.152325+00:00]>>>> arrow.get(datetime(2013, 5, 5), 'US/Pacific')<Arrow [2013-05-05T00:00:00-07:00]>>>> from dateutil import tz>>> arrow.get(datetime(2013, 5, 5), tz.gettz('US/Pacific'))<Arrow [2013-05-05T00:00:00-07:00]>>>> arrow.get(datetime.now(tz.gettz('US/Pacific')))<Arrow [2013-05-06T21:24:49.552236-07:00]>  >>> arrow.get('2013-05-05 12:30:45', 'YYYY-MM-DD HH:mm:ss')<Arrow [2013-05-05T12:30:45+00:00]>  >>> arrow.get('June was born in May 1980', 'MMMM YYYY')<Arrow [1980-05-01T00:00:00+00:00]>  >>> arrow.get(2013, 5, 5)<Arrow [2013-05-05T00:00:00+00:00]>

可以看到,无论是整数、浮点数、datetime、dateutil、日期字符串,还是直接初始化,都可以使用 get 进行时间的创建,无需担忧不同的形式。

此外,arrow 能够智能地把时间转化为更加贴合日常语言的表示,使用 humanize 接口实现,能够使用多种不同的场景:

>>> past = arrow.utcnow().shift(hours=-1)>>> past.humanize()'an hour ago'# 只需要时间间隔>>> present = arrow.utcnow()>>> future = present.shift(hours=2)>>> future.humanize(present)'in 2 hours'>>> future.humanize(present, only_distance=True)'2 hours'# 不同的时间粒度>>> present = arrow.utcnow()>>> future = present.shift(minutes=66)>>> future.humanize(present, granularity="minute")'in 66 minutes'>>> future.humanize(present, granularity=["hour", "minute"])'in an hour and 6 minutes'>>> present.humanize(future, granularity=["hour", "minute"])'an hour and 6 minutes ago'>>> future.humanize(present, only_distance=True, granularity=["hour", "minute"])'an hour and 6 minutes'

Arrow 还有很好的对于时间段和时间范围序列的支持,分别使用 span 和 range 实现:

>>> arrow.utcnow().span('hour')(<Arrow [2013-05-07T05:00:00+00:00]>, <Arrow [2013-05-07T05:59:59.999999+00:00]>)# 向下取整>>> arrow.utcnow().floor('hour')<Arrow [2013-05-07T05:00:00+00:00]># 向上取整>>> arrow.utcnow().ceil('hour')<Arrow [2013-05-07T05:59:59.999999+00:00]># 时间范围序列>>> start = datetime(2013, 5, 5, 12, 30)>>> end = datetime(2013, 5, 5, 17, 15)>>> for r in arrow.Arrow.span_range('hour', start, end):...     print r...(<Arrow [2013-05-05T12:00:00+00:00]>, <Arrow [2013-05-05T12:59:59.999999+00:00]>)(<Arrow [2013-05-05T13:00:00+00:00]>, <Arrow [2013-05-05T13:59:59.999999+00:00]>)(<Arrow [2013-05-05T14:00:00+00:00]>, <Arrow [2013-05-05T14:59:59.999999+00:00]>)(<Arrow [2013-05-05T15:00:00+00:00]>, <Arrow [2013-05-05T15:59:59.999999+00:00]>)(<Arrow [2013-05-05T16:00:00+00:00]>, <Arrow [2013-05-05T16:59:59.999999+00:00]>)

日期时间库

总结

Arrow 提供了比 Python 标准库更为统一、简洁和强大的日期时间相关功能,设计上倾向于使用同一个接口,对于不同形式的输入进行转换,得到统一的表现形式,对于开发者而言十分友好,且其对于日期时间标准实现十分智能和全面,不需要担心一些古怪的时间问题,大大提升了开发体验。

标签: #python计算速度快的日期类