python日期和时间库_6个Python日期时间库

python日期和时间库

很久以前,我们中的一个(莱西)花了一个多小时盯着Python文档中描述日期和时间格式字符串的表。 在尝试编写将API中的日期时间字符串从API转换为Python日期时间对象的代码时,我很难理解一个难题的一部分,因此我寻求帮助。

“为什么不只使用dateutil ?” 有人问。

读者,如果您除了本月的Python专栏文章之外没有什么比datetimestrptime更简单的方法可以将datetime字符串转换为datetime对象,我们将认为自己成功了。

但是,除了轻松地将字符串转换为更有用的Python对象之外,还有一整套库,这些库提供了有用的方法和工具,这些库和库可以使管理随时间进行的测试,将时间转换为不同的时区,以人类可读格式中继时间信息变得更加容易, 和更多。 如果这是您第一次尝试使用Python中的日期和时间,请稍事休息,并阅读如何使用Python处理日期和时间 。 要了解为什么在编程中处理日期和时间很难,请阅读Falsehood程序员相信时间 。

本文将向您介绍:

  • Dateutil
  • 箭头
  • 时刻
  • 玛雅人
  • 德洛兰人
  • 冰枪

随意跳过您已经熟悉的库,并专注于新的库。

内建 约会时间 模组

datetime模块。

假设我们从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对象。

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

要得出这些结论,需要在文档中的表格上多加注视。

因为字符串中的“ Z”表示此日期时间字符串采用UTC,所以我们可以在格式中忽略它。 (现在,我们将不必担心时区。)

此转换的代码如下所示:


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

格式字符串很难阅读和理解。 我必须手动考虑原始字符串中的字母“ T”和“ Z”,以及标点符号和格式字符串,例如%S%m 。 不太了解日期时间的人会读取我的代码,尽管它的含义已被很好地证明了,但可能很难理解,因为它很难阅读。

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

Dateutil

dateutil模块提供了对datetime模块的扩展。

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


   
   
     
     
     
     
$ from dateutil. parser import parse
$ parse ( '2018-04-29T17:45:25Z' )
datetime . datetime ( 2018 , 4 , 29 , 17 , 45 , 25 , tzinfo = tzutc ( ) )

如果包含了字符串, dateutil解析器将自动返回该字符串的时区。 由于我们使用的是UTC,因此您可以看到datetime对象返回了该时间。 如果要parse完全忽略时区信息并返回一个朴素的datetime对象,则可以传递参数ignoretz=True进行parse如下所示:


   
   
     
     
     
     
$ from dateutil. parser import parse
$ parse ( '2018-04-29T17:45:25Z' , ignoretz = True )
datetime . datetime ( 2018 , 4 , 29 , 17 , 45 , 25 )

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


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

dateutil还提供了诸如relativedelta工具,用于计算两个日期时间之间的时间差或向日期时间添加时间/从日期时间中删除时间, rrule用于创建重复日期时间的规则,以及用于处理时区的tz等工具。

箭头

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

回到我们的解析示例,这是使用Arrow将日期字符串转换为Arrow的datetime类的实例的方式:


   
   
     
     
     
     
$ import arrow
$ arrow. get ( '2018-04-29T17:45:25Z' )
< Arrow [ 2018 - 04 -29T17: 45 : 25 + 00 : 00 ] >

您也可以在get()的第二个参数中指定格式,就像使用strptime ,但是Arrow会尽其所能地自行解析您提供的字符串。 get()返回Arrow的datetime类的实例。 要使用Arrow获取Python datetime对象,请按如下所示链接datetime


   
   
     
     
     
     
$ arrow. get ( '2018-04-29T17:45:25Z' ) . datetime
datetime . datetime ( 2018 , 4 , 29 , 17 , 45 , 25 , tzinfo = tzutc ( ) )

使用Arrow datetime类的实例,您可以访问Arrow的其他有用方法。 例如,它的humanize()方法将日期时间转换为人类可读的短语,如下所示:


   
   
     
     
     
     
$ import arrow
$ utc = arrow. utcnow ( )
$ utc. humanize ( )
'seconds ago'

在文档中详细了解Arrow的有用方法。

时刻

Moment的创建者认为它是“ alpha质量”,但是即使它处于早期阶段,它还是很受欢迎的,我们想提一提。

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


   
   
     
     
     
     
$ import moment
$ moment. date ( '2018-04-29T17:45:25Z' )
< Moment ( 2018 - 04 -29T17: 45 : 25 ) >

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


   
   
     
     
     
     
$ moment. date ( '2018-04-29T17:45:25Z' ) . date
datetime . datetime ( 2018 , 4 , 29 , 17 , 45 , 25 , tzinfo =< StaticTzInfo 'Z' > )

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

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


   
   
     
     
     
     
$ moment. date ( "tomorrow" )
< Moment ( 2018 - 04 -06T11: 24 : 42 ) >

它的addsubtract命令还带有关键字参数,以使日期的操作也变得简单。 为了获得后天的收益,Moment将使用以下代码:


   
   
     
     
     
     
$ moment. date ( "tomorrow" ) . add ( days = 1 )
< Moment ( 2018 - 04 -07T11: 26 : 48 ) >

玛雅人

Maya包括其他处理Python日期时间的流行库,其中包括Humanizepytzpendulum 。 该项目的目的是使人们更轻松地处理日期时间。

Maya的自述文件包含几个有用的示例。 这是如何使用Maya从以前重现解析示例的方法:


   
   
     
     
     
     
$ import maya
$ maya. parse ( '2018-04-29T17:45:25Z' ) . datetime ( )
datetime . datetime ( 2018 , 4 , 29 , 17 , 45 , 25 , tzinfo =< UTC > )

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

因为Maya折叠了许多有用的日期时间库,所以它可以使用其MayaDT类的实例来执行诸如使用slang_time()方法将timedelta转换为纯语言的slang_time() ,并将日期时间间隔保存在单个类的实例中。 以下是使用Maya将日期时间表示为易于理解的短语的方法:


   
   
     
     
     
     
$ import maya
$ maya. parse ( '2018-04-29T17:45:25Z' ) . slang_time ( )
'23 days from now`

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

德洛兰人

Delorean以“ 回到未来”电影中的时间旅行汽车而得名,对操纵日期时间特别有用:将日期时间转换为其他时区并增加或减少时间。

Delorean需要一个有效的Python日期时间对象才能工作,因此,如果您需要使用字符串日期时间,则最好与上述库之一结合使用。 要将Delorean与Maya一起使用,例如:


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

现在,您可以使用datetime对象d_t ,使用Delorean进行操作,例如将datetime转换为美国东部时区:


   
   
     
     
     
     
$ from delorean import Delorean
$ d = Delorean ( d_t )
$ d
Delorean ( datetime = datetime . datetime ( 2018 , 4 , 29 , 17 , 45 , 25 ) , timezone = 'UTC' )
$ d. shift ( 'US/Eastern' )
Delorean ( datetime = datetime . datetime ( 2018 , 4 , 29 , 13 , 45 , 25 ) , timezone = 'US/Eastern' )

看到小时数从17变为13?

您还可以使用自然语言方法来操纵datetime对象。 要获取2018年4月29日(我们一直在使用的日期)之后的下一个星期五:


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

在其文档中阅读有关Delorean的更多信息。

冰枪

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


   
   
     
     
     
     
from freezegun import freeze_time
import datetime

@ freeze_time ( "2017-04-14" )
def test ( ) :
    assert datetime . datetime . now ( ) == datetime . datetime ( 2017 , 4 , 14 )

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


上面提到的每个库都提供一组不同的功能。 可能很难决定哪个最适合您的需求。 Maya的创建者 Kenneth Reitz说:“所有这些项目都是相辅相成的,而且是朋友。”

这些库共享某些功能,但不共享其他功能。 有些擅长时间操纵,有些擅长解析。 但是它们都具有使您更轻松地处理日期和时间的目标。 下次您对Python的内置datetime模块感到沮丧时,我们希望您选择这些库中的一个进行试验。

翻译自: https://opensource.com/article/18/4/python-datetime-libraries

python日期和时间库

你可能感兴趣的:(python,java,编程语言,大数据,linux)