你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

六个Python的时间日期库

[复制链接]
gaosmile 发布时间:2020-8-20 22:14
写过Python程序的人都知道,Python日期和时间的处理非常繁琐和麻烦。
除了将字符串转换为更有用的 Python 对象之外,还有许多库具有一些有用的方法和工具,可以让你更轻松地进行时间测试、将时间转换为不同的时区、以人类可读的格式输出时间信息,本文将介绍以下六个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,所以我们可以在格式中忽略此项。
此转换的代码如下所示:
微信图片_20200820221110.jpg
格式化字符串很难阅读和理解。有些人不太了解阅读datetime代码的人就会发现这很难理解,尽管其含义已有文档说明,但仍然很难阅读。
让我们看看其他库如何处理这种转换。

1、Dateutil
Dateutil模块为datetime模块提供了一些扩展,依然以上面的示例为例,实现相同的结果则要简单得多:
微信图片_20200820221114.jpg
dateutil解析后可以自动返回字符串的时区。由于我们采用UTC,你可以看到返回了datetime对象。如果你想parse完全忽略时区信息,并返回一个原生的DateTime对象,你可以传递参数 ignoretz=True 给parse,像这样:
微信图片_20200820221117.jpg
Dateutil还可以解析更多可读的日期字符串:
微信图片_20200820221120.jpg
dateutil还提供了relativedelta,用于计算两个日期时间之间的时差或从日期时间添加/删除,rrule用于创建重复日期时间,tz用于处理时区以及其他工具。

2、Arrow
Arrow是另一个库,其目标是进行操作,格式化,并处理更合理的日期和时间。它包括dateutil模块,根据其文档描述Arrow旨在“帮助你使用更少的代码来处理日期和时间”。
要返回我们的解析示例,下面介绍如何使用 Arrow 将日期字符串转换为 Arrow 的 datetime 类的实例:
微信图片_20200820221122.jpg
你也可以在第二个参数中指定get() 格式,就像使用strptime一样,Arrow会尽力解析你提供的字符串,get() 返回 Arrow 的 datetime 类的一个实例。要使用Arrow来获取 Python datetime对象,可以如下所示:
微信图片_20200820221125.jpg
通过Arrow datetime类的实例,你还可以访问Arrow的其他有用方法。例如,它的humanize()方法将日期时间解析成可读的短语,如下所示:
微信图片_20200820221128.jpg
你可以在Arrow文档中阅读更多有用的方法

3、Moment
Moment的创作者认为它是“测试版”,但即使它处于早期阶段,却非常受欢迎的,因此它出现在推荐名单内
Moment将字符串转换的方法很简单,类似于我们之前提到的库:
微信图片_20200820221131.jpg
和其他库一样,它最初返回它自己的datetime类的实例。要返回Python datetime对象,请添加一个date()调用。
这会将Moment datetime类转换为Python日期时间对象。Moment还提供了使用人类可读语言创建新日期的方法。如为明天创建一个日期:
微信图片_20200820221133.jpg
它add()和subtract()命令采取关键字参数,使日期的操作变得简单,以及为了获得后天的日期,Moment会使用下面的代码:
微信图片_20200820221136.jpg

4、Maya
MAya包含了其他流行的库,诸如Humanize,pytz和pendulum等等。该项目的目标是让人们更容易处理日期。
Maya的README包含几个有用的示例。以下是如何使用Maya重现上面解析示例:
微信图片_20200820221139.jpg
请注意,我们必须在.datetime()之后调用maya.parse()。如果我们跳过这一步,Maya将返回MayaDT类的一个实例:<MayaDT epoch=1525023925.0>
由于Maya有许多方法和datetime库中的一样,因此它可以使用其MayaDT类的实例来执行诸如使用slang_time()方法将timedeltas转换为纯文本语言,以及将日期时间间隔保存在单个类的实例操作中。以下是如何使用Maya将日期时间表示为人类可读的短语:
微信图片_20200820221142.jpg
很显然,slang_time()的输出结果会根据你与datetime对象的距离长短而改变。

5、Delorean
Delorean以《Back to the Future》电影中的时间旅行汽车命名的,适用于操纵日期时间:将日期时间转换为其他时区,并添加或减去时间。
Delorean需要有效的Python Datetime才能执行,所以如果你需要使用日期时间字符串,最好将其与上述库中的一个配合使用。例如,将Maya与Delorean一起使用:
微信图片_20200820221145.jpg
现在,在日期时间对象d_t可供您使用的情况下,你可以使用Delorean进行操作,例如将日期时间转换为美国东部时区:
微信图片_20200820221148.jpg
你看小时数已经从17变为13了,你还可以使用自然语言方法来操作 datetime 对象。2018年4月29日之后的下个星期五(我们使用的日期):
微信图片_20200820221150.jpg

6、Freezegun
Freezegun是一个可以帮助你在Python代码中测试特定日期的库。使用@freeze_time装饰器,你可以设置测试条件下的具体日期和时间,所有datetime.datetime.now(),datetime.datetime.utcnow()等都会返回你指定的日期和时间。例如:
微信图片_20200820221153.jpg
要跨时区进行测试,可以将tz_offset参数传递给装饰器。该freeze_time装饰同样能够处理更通俗易懂的语言日期,例如@freeze_time( April 4, 2017 )。
上面提到的每个库都有各自不同的功能。可能很难确定哪一个最适合你的需求。正如Maya的创作者 Kenneth Reitz说:“所有这些项目相互补充,它们都很友好。”
这些库各自都具备一些功能,但并不都是完美的。有些擅长时间操作,有些擅长解析。但他们都有共同的目标,即让时间日期相关的操作都变得简单。当你发现Python的内置datetime模块已经不够用的时候,你可以选择以上的某一个库尝试看看。

收藏 评论0 发布时间:2020-8-20 22:14

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版