python 数据 模块 好用_时间数据咋处理?6款超好用的Python时间库

写过Python程序的人都知道,Python日期和时间的处理非常繁琐和麻烦。

除了将字符串转换为更有用的 Python 对象之外,还有许多库具有一些有用的方法和工具,可以让你更轻松地进行时间测试、将时间转换为不同的时区、以人类可读的格式输出时间信息。

本文介绍以下6个Python时间日期库:

Dateutil

Arrow

Moment

Maya

Delorean

Freezegun

一.内建的 datetime 模块

在介绍其他库之前,让我们回顾以下如何使用datetime模块将日期字符串转换为Python日期时间对象。

假设我们从API接收到这个日期字符串,并且需要它作为Python datetime对象存在:2018-04-29T17:45:25Z

该字符串包括:

YYYY-MM-DD格式的日期

字母“T”表示即将到来的时间

HH:II:SS的时间格式

指示此时间的时区指示符“Z”采用UTC

要使用该datetime模块将此字符串转换为Python datetime对象,你可以首先从strptime开始。datetime.strptime接收日期字符串和格式化字符并返回一个Python datetime对象。

我们必须手动将日期时间字符串的每个部分转换为Python datetime.strptime可以理解的格式化字符串。四位数的年份表示为%Y。两位数的月份是%m。两位数的日期是%d。24小时制的时间,%H表示小时数,分钟数用%M表示,秒用%S表示。

由于字符串中的“Z”表示此日期时间字符串采用UTC,所以我们可以在格式中忽略此项。

此转换的代码如下所示:

620e9688fc456658c8a90710dae85512.png

格式化字符串很难阅读和理解。有些人不太了解阅读datetime代码的人就会发现这很难理解,尽管其含义已有文档说明,但仍然很难阅读。

让我们看看其他库如何处理这种转换。

二.Dateutil

Dateutil模块为datetime模块提供了一些扩展,依然以上面的示例为例,实现相同的结果则要简单得多,如下图:

8ee6adea940e1aceb390b4ddf2d211e2.png

dateutil解析后可以自动返回字符串的时区。由于我们采用UTC,你可以看到返回了datetime对象。

如果你想parse完全忽略时区信息,并返回一个原生的DateTime对象,你可以传递参数 ignoretz=True 给parse,像这样:

64d1294daf3bfc6b32d955a241ed5fa3.png

Dateutil还可以解析更多可读的日期字符串:

f1d874ba57545339fcc607977366096e.png

relativedelta:用于计算两个日期时间之间的时差或从日期时间添加/删除

rrule:用于创建重复日期时间

tz:用于处理时区以及其他工具

三.Arrow

Arrow是另一个库,其目标是进行操作,格式化,并处理更合理的日期和时间。它包括dateutil模块,根据其文档描述Arrow旨在“帮助你使用更少的代码来处理日期和时间”。

要返回我们的解析示例,下面介绍如何使用 Arrow 将日期字符串转换为 Arrow 的 datetime 类的实例,如下:

e382e7bbb10f4e3894c77cde90f6caa3.png

你也可以在第二个参数中指定get() 格式,就像使用strptime一样,Arrow会尽力解析你提供的字符串,get() 返回 Arrow 的 datetime 类的一个实例。要使用Arrow来获取 Python datetime对象,可以如下所示:

dff75b699154186b3745ec9260e39423.png

通过Arrow datetime类的实例,你还可以访问Arrow的其他有用方法。

例如:它的humanize()方法将日期时间解析成可读的短语。

5e1ab1922bb08f493873fc8fed08c16e.png

四.Moment

Moment的创作者认为它是“测试版”,但即使它处于早期阶段,却非常受欢迎的,因此它出现在推荐名单内。

Moment将字符串转换的方法很简单,类似于我们之前提到的库,如下图:

bbaff3f0f72f2ce8f83357610cc82977.png

和其他库一样,它最初返回它自己的datetime类的实例。要返回Python datetime对象,请添加一个date()调用。

这会将Moment datetime类转换为Python日期时间对象。Moment还提供了使用人类可读语言创建新日期的方法。如为明天创建一个日期:

2bd5fec65667a2d36045368ca7e47d79.png

它add()和subtract()命令采取关键字参数,使日期的操作变得简单,以及为了获得后天的日期,Moment会使用下面的代码:

6887f4b0cca02f58b7ca03a56d8d6486.png

五.Maya

Maya包含了其他流行的库,诸如Humanize,pytz和pendulum等等。该项目的目标是让人们更容易处理日期。

Maya的README包含几个有用的示例。以下是如何使用Maya重现上面解析示例,如下图:

1aad51bd0091add559a1811436af031f.png

注意:我们必须在.datetime()之后调用maya.parse()。如果我们跳过这一步,Maya将返回MayaDT类的一个实例

由于Maya有许多方法和datetime库中的一样,因此它可以使用其MayaDT类的实例来执行诸如使用slang_time()方法将timedeltas转换为纯文本语言,以及将日期时间间隔保存在单个类的实例操作中。

以下是如何使用Maya将日期时间表示为人类可读的短语:

61533e87de9da8a43814d42c559be560.png

很显然,slang_time()的输出结果会根据你与datetime对象的距离长短而改变。

六.Delorean

Delorean以《Back to the Future》电影中的时间旅行汽车命名的,适用于操纵日期时间:将日期时间转换为其他时区,并添加或减去时间。

Delorean需要有效的Python Datetime才能执行,所以如果你需要使用日期时间字符串,最好将其与上述库中的一个配合使用。

例如:将Maya与Delorean一起使用:

6690803ec2e7e4901ae82155f1b2edac.png

现在,在日期时间对象d_t可供您使用的情况下,你可以使用Delorean进行操作,例如将日期时间转换为美国东部时区:

940e9a1154c4e1c20cae2932dd8bada9.png

你看小时数已经从17变为13了,你还可以使用自然语言方法来操作 datetime 对象。

2018年4月29日之后的下个星期五(我们使用的日期):

be0bb3e8f0dfc88e582af6a572b55d9c.png

七.Freezegun

Freezegun是一个可以帮助你在Python代码中测试特定日期的库。使用@freeze_time装饰器,你可以设置测试条件下的具体日期和时间,所有datetime.datetime.now(),datetime.datetime.utcnow()等都会返回你指定的日期和时间。

例如:

3263c4b857d6c359a13b885fb900fdb0.png

要跨时区进行测试,可以将tz_offset参数传递给装饰器。该freeze_time装饰同样能够处理更通俗易懂的语言日期,例如@freeze_time( April 4, 2017 )。

上面提到的每个库都有各自不同的功能。可能很难确定哪一个最适合你的需求。

正如Maya的创作者 Kenneth Reitz说:“所有这些项目相互补充,它们都很友好。”

这些库各自都具备一些功能,但并不都是完美的。有些擅长时间操作,有些擅长解析。但他们都有共同的目标,即让时间日期相关的操作都变得简单。当你发现Python的内置datetime模块已经不够用的时候,你可以选择以上的某一个库尝试看看。

END.

作者:Jeff Triplett

来源:OpenSourceTop(开源最前线)

本文为转载分享,如侵权请联系后台删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值