6 个 Python 的日期时间库 | Linux 中国

2018 年 5 月 22 日 Linux中国
在 Python 中有许多库可以很容易地测试、转换和读取日期和时间信息。
-- Lacey Williams Hensche



致谢
编译自 | https://opensource.com/article/18/4/python-datetime-libraries 
 作者 | Lacey Williams Hensche
 译者 | MjSeven 🌟 🌟 🌟 🌟 共计翻译:39 篇 贡献时间:112 天

在 Python 中有许多库可以很容易地测试、转换和读取日期和时间信息。

这篇文章是与 Jeff Triplett[1] 一起合写的。

曾几何时,我们中的一个人(Lacey)盯了一个多小时的 Python 文档[2]中描述日期和时间格式化字符串的表格。当我试图编写从 API 中将日期时间字符串转换为 Python datetime[3] 对象时,我很难理解其中的特定部分,因此我决定请求帮助。

有人问道:“为什么你不使用 dateutil 呢?”

读者,如果你没有从这个月的 Python 专栏中获得任何东西,只是学习到有比 datetime 的 strptime 更容易地将 datetime 字符串转换为 datetime 对象的方法,那么我们觉得就已经成功了。

但是,除了将字符串转换为更有用的 Python 对象之外,还有许多库都有一些有用的方法和工具,可以让您更轻松地进行时间测试、将时间转换为不同的时区、以人类可读的格式传递时间信息,等等。如果这是你在 Python 中第一次接触日期和时间,请暂停并阅读 如何使用 Python的日期和时间[3] 。要理解为什么在编程中处理日期和时间是困难的,请阅读 愚蠢的程序员相信时间[4]

这篇文章将会向你介绍以下库:

◈  Dateutil [5]
◈  Arrow [6]
◈  Moment [7]
◈  Maya [8]
◈  Delorean [9]
◈  Freezegun [10]

随意跳过那些你已经熟悉的库,专注于那些对你而言是新的库。

内建的 datetime 模块

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

假设我们从 API 接受到一个日期字符串,并且需要它作为 Python datetime 对象存在:

   
   
     
  1. 2018-04-29T17:45:25Z

这个字符串包括:

◈ 日期是  YYYY-MM-DD 格式的
◈ 字母  T 表示时间即将到来
◈ 时间是  HH:II:SS 格式的
◈ 表示此时间的时区指示符  Z 采用 UTC (详细了解 日期时间字符格式 [11]

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

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

为了得出这些结论,需要在Python 文档[2]的表格中多加注意。

由于字符串中的 Z 表示此日期时间字符串采用 UTC,所以我们可以在格式中忽略此项。(现在,我们不会担心时区。)

转换的代码是这样的:

   
   
     
  1. $ from datetime import datetime

  2. $ datetime.strptime('2018-04-29T17:45:25Z', '%Y-%m-%dT%H:%M:%SZ')

  3. datetime.datetime(2018, 4, 29, 17, 45, 25)

格式字符串很难阅读和理解。我必须手动计算原始字符串中的字母 T 和 “Z”的位置,以及标点符号和格式化字符串,如 %S 和 %m。有些不太了解 datetime 的人阅读我的代码可能会发现它很难理解,尽管其含义已有文档记载,但它仍然很难阅读。

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

Dateutil

dateutil 模块[12]对 datetime 模块做了一些扩展。

继续使用上面的解析示例,使用 dateutil 实现相同的结果要简单得多:

   
   
     
  1. $ from dateutil.parser import parse

  2. $ parse('2018-04-29T17:45:25Z')

  3. datetime.datetime(2018, 4, 29, 17, 45, 25, tzinfo=tzutc())

如果字符串包含时区,那么 dateutil 解析器会自动返回字符串的时区。由于我们在 UTC 时区,你可以看到返回来一个 datetime 对象。如果你想解析完全忽略时区信息并返回原生的 datetime 对象,你可以传递 ignoretz=True 来解析,如下所示:

   
   
     
  1. $ from dateutil.parser import parse

  2. $ parse('2018-04-29T17:45:25Z', ignoretz=True)

  3. datetime.datetime(2018, 4, 29, 17, 45, 25)

dateutil 还可以解析其他人类可读的日期字符串:

   
   
     
  1. $ parse('April 29th, 2018 at 5:45 pm')

  2. datetime.datetime(2018, 4, 29, 17, 45)

dateutil 还提供了像 relativedelta[13] 的工具,它用于计算两个日期时间之间的时间差或向日期时间添加或删除时间,rrule[14] 创建重复日期时间,tz[15] 用于解决时区以及其他工具。

Arrow

Arrow[16] 是另一个库,其目标是操作、格式化,以及处理对人类更友好的日期和时间。它包含 dateutil,根据其文档[17],它旨在“帮助你使用更少的包导入和更少的代码来处理日期和时间”。

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

   
   
     
  1. $ import arrow

  2. $ arrow.get('2018-04-29T17:45:25Z')

  3. <Arrow [2018-04-29T17:45:25+00:00]>

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

   
   
     
  1. $ arrow.get('2018-04-29T17:45:25Z').datetime

  2. datetime.datetime(2018, 4, 29, 17, 45, 25, tzinfo=tzutc())

通过 Arrow datetime 类的实例,你可以访问 Arrow 的其他有用方法。例如,它的 humanize() 方法将日期时间翻译成人类可读的短语,就像这样:

   
   
     
  1. $ import arrow

  2. $ utc = arrow.utcnow()

  3. $ utc.humanize()

  4. 'seconds ago'

在 Arrow 的文档[18]中阅读更多关于其有用方法的信息。

Moment

Moment[19] 的作者认为它是“内部测试版”,但即使它处于早期阶段,它也是非常受欢迎的,我们想来讨论它。

Moment 的方法将字符转换为其他更有用的东西很简单,类似于我们之前提到的库:

   
   
     
  1. $ import moment

  2. $ moment.date('2018-04-29T17:45:25Z')

  3. <Moment(2018-04-29T17:45:25)>

就像其他库一样,它最初返回它自己的 datetime 类的实例,要返回 Python datetime 对象,添加额外的 date() 调用即可。

   
   
     
  1. $ moment.date('2018-04-29T17:45:25Z').date

  2. datetime.datetime(2018, 4, 29, 17, 45, 25, tzinfo=<StaticTzInfo 'Z'>)

这将 Moment datetime 类转换为 Python datetime 对象。

Moment 还提供了使用人类可读的语言创建新日期的方法。例如创建一个明天的日期:

   
   
     
  1. $ moment.date("tomorrow")

  2. <Moment(2018-04-06T11:24:42)>

它的 add() 和 subtract() 命令使用关键字参数来简化日期的操作。为了获得后天,Moment 会使用下面的代码:

   
   
     
  1. $ moment.date("tomorrow").add(days=1)

  2. <Moment(2018-04-07T11:26:48)>

Maya

Maya[20] 包含了 Python 中其他流行处理日期时间的库,包括 Humanize、 pytz 和 pendulum 等等。这个项目旨在让人们更容易处理日期。

Maya 的 README 包含几个有用的实例。以下是如何使用 Maya 来重新处理以前的解析示例:

   
   
     
  1. $ import maya

  2. $ maya.parse('2018-04-29T17:45:25Z').datetime()

  3. datetime.datetime(2018, 4, 29, 17, 45, 25, tzinfo=<UTC>)

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

由于 Maya 与 datetime 库中很多有用的方法重叠,因此它可以使用 MayaDT 类的实例执行诸如使用 slang_time() 方法将时间偏移量转换为纯文本语言,并将日期时间间隔保存在单个类的实例中。以下是如何使用 Maya 将日期时间表示为人类可读的短语:

   
   
     
  1. $ import maya

  2. $ maya.parse('2018-04-29T17:45:25Z').slang_time()

  3. '23 days from now

显然,slang_time() 的输出将根据距离 datetime 对象相对较近或较远的距离而变化。

Delorean

Delorean[21],以 《返回未来》 电影中的时间旅行汽车命名,它对于操纵日期时间特别有用,包括将日期时间转换为其他时区并添加或减去时间。

Delorean 需要有效的 Python datetime 对象才能工作,所以如果你需要使用时间字符串,最好将其与上述库中的一个配合使用。例如,将 Maya 与 Delorean 一起使用:

   
   
     
  1. $ import maya

  2. $ d_t = maya.parse('2018-04-29T17:45:25Z').datetime()

现在,你有了一个 datetime 对象 d_t,你可以使用 Delorean 来做一些事情,例如将日期时间转换为美国东部时区:

   
   
     
  1. $ from delorean import Delorean

  2. $ d = Delorean(d_t)

  3. $ d

  4. Delorean(datetime=datetime.datetime(2018, 4, 29, 17, 45, 25), timezone='UTC')

  5. $ d.shift('US/Eastern')

  6. Delorean(datetime=datetime.datetime(2018, 4, 29, 13, 45, 25), timezone='US/Eastern')

看到小时是怎样从 17 变成 13 了吗?

你也可以使用自然语言方法来操作 datetime 对象。获取 2018 年 4 月 29 日之后的下个星期五(我们现在使用的):

   
   
     
  1. $ d.next_friday()

  2. Delorean(datetime=datetime.datetime(2018, 5, 4, 13, 45, 25), timezone='US/Eastern')

在 Delorean 的文档[22]中阅读更多关于其的用法。

Freezegun

Freezegun[23] 是一个可以帮助你在 Python 代码中测试特定日期的库。使用 @freeze_time 装饰器,你可以为测试用例设置特定的日期和时间,并且所有对 datetime.datetime.now()、 datetime.datetime.utcnow() 等的调用都将返回你指定的日期和时间。例如:

   
   
     
  1. from freezegun import freeze_time

  2. import datetime

  3. @freeze_time("2017-04-14")

  4. def test(): 

  5.    assert datetime.datetime.now() == datetime.datetime(2017, 4, 14)

要跨时区进行测试,你可以将 tz_offset 参数传递给装饰器。freeze_time 装饰器也接受更简单的口语化日期,例如 @freeze_time('April 4, 2017')


上面提到的每个库都提供了一组不同的特性和功能,也许很难决定哪一个最适合你的需要。Maya 的作者[20], Kenneth Reitz 说到:“所有这些项目相辅相成,它们都是我们的朋友”。

这些库共享一些功能,但不是全部。有些擅长时间操作,有些擅长解析,但它们都有共同的目标,即让你对日期和时间的工作更轻松。下次你发现自己对 Python 的内置 datetime 模块感到沮丧,我们希望你可以选择其中的一个库进行试验。


via: https://opensource.com/article/18/4/python-datetime-libraries

作者: Lacey Williams Hensche[25] 选题: lujun9972 译者: MjSeven 校对: wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


登录查看更多
0

相关内容

【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
266+阅读 · 2020年6月10日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
234+阅读 · 2020年5月21日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
225+阅读 · 2020年3月22日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
193+阅读 · 2020年3月12日
【2020新书】数据科学:十大Python项目,247页pdf
专知会员服务
213+阅读 · 2020年2月21日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
180+阅读 · 2020年1月1日
如何使用自然语言工具包(NLTK)在Python3中执行情感分析
Python程序员
19+阅读 · 2019年10月28日
吐血整理!140种Python标准库、第三方库和外部工具都有了
炼数成金订阅号
14+阅读 · 2019年7月30日
一文看懂怎么用 Python 做数据分析
大数据技术
24+阅读 · 2019年5月5日
Python奇淫技巧,5个数据可视化工具
机器学习算法与Python学习
7+阅读 · 2019年4月12日
Python用于NLP :处理文本和PDF文件
Python程序员
4+阅读 · 2019年3月27日
Python用法速查网站
Python程序员
17+阅读 · 2018年12月16日
Python | Jupyter导出PDF,自定义脚本告别G安装包
程序人生
7+阅读 · 2018年7月17日
Python3.7中一种懒加载的方式
Python程序员
3+阅读 · 2018年4月27日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
A Survey on Edge Intelligence
Arxiv
51+阅读 · 2020年3月26日
Arxiv
110+阅读 · 2020年2月5日
A Comprehensive Survey on Graph Neural Networks
Arxiv
21+阅读 · 2019年1月3日
SlowFast Networks for Video Recognition
Arxiv
19+阅读 · 2018年12月10日
Arxiv
22+阅读 · 2018年8月30日
Arxiv
3+阅读 · 2018年5月28日
Arxiv
5+阅读 · 2017年7月23日
VIP会员
相关VIP内容
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
266+阅读 · 2020年6月10日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
234+阅读 · 2020年5月21日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
225+阅读 · 2020年3月22日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
193+阅读 · 2020年3月12日
【2020新书】数据科学:十大Python项目,247页pdf
专知会员服务
213+阅读 · 2020年2月21日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
180+阅读 · 2020年1月1日
相关资讯
如何使用自然语言工具包(NLTK)在Python3中执行情感分析
Python程序员
19+阅读 · 2019年10月28日
吐血整理!140种Python标准库、第三方库和外部工具都有了
炼数成金订阅号
14+阅读 · 2019年7月30日
一文看懂怎么用 Python 做数据分析
大数据技术
24+阅读 · 2019年5月5日
Python奇淫技巧,5个数据可视化工具
机器学习算法与Python学习
7+阅读 · 2019年4月12日
Python用于NLP :处理文本和PDF文件
Python程序员
4+阅读 · 2019年3月27日
Python用法速查网站
Python程序员
17+阅读 · 2018年12月16日
Python | Jupyter导出PDF,自定义脚本告别G安装包
程序人生
7+阅读 · 2018年7月17日
Python3.7中一种懒加载的方式
Python程序员
3+阅读 · 2018年4月27日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
相关论文
A Survey on Edge Intelligence
Arxiv
51+阅读 · 2020年3月26日
Arxiv
110+阅读 · 2020年2月5日
A Comprehensive Survey on Graph Neural Networks
Arxiv
21+阅读 · 2019年1月3日
SlowFast Networks for Video Recognition
Arxiv
19+阅读 · 2018年12月10日
Arxiv
22+阅读 · 2018年8月30日
Arxiv
3+阅读 · 2018年5月28日
Arxiv
5+阅读 · 2017年7月23日
Top
微信扫码咨询专知VIP会员