python日期和时间库
很久以前,我们中的一个(莱西)花了一个多小时盯着Python文档中描述日期和时间格式字符串的表。 在尝试编写将API中的日期时间字符串从API转换为Python日期时间对象的代码时,我很难理解一个难题的一部分,因此我寻求帮助。
“为什么不只使用dateutil
?” 有人问。
读者,如果您除了本月的Python专栏文章之外没有什么比datetime
的strptime
更简单的方法可以将datetime字符串转换为datetime对象,我们将认为自己成功了。
但是,除了轻松地将字符串转换为更有用的Python对象之外,还有一整套库,这些库提供了有用的方法和工具,这些库和库可以使管理随时间进行的测试,将时间转换为不同的时区,以人类可读格式中继时间信息变得更加容易, 和更多。 如果这是您第一次尝试使用Python中的日期和时间,请稍事休息,并阅读如何使用Python处理日期和时间 。 要了解为什么在编程中处理日期和时间很难,请阅读Falsehood程序员相信时间 。
本文将向您介绍:
随意跳过您已经熟悉的库,并专注于新的库。
datetime
模块。
假设我们从API收到了这个日期字符串,并且需要它作为Python datetime对象存在:
2018-04-29T17:45:25Z
该字符串包括:
要使用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
模块提供了对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
)
>
它的add
和subtract
命令还带有关键字参数,以使日期的操作也变得简单。 为了获得后天的收益,Moment将使用以下代码:
$ moment.
date
(
"tomorrow"
) .
add
( days
=
1
)
< Moment
(
2018 -
04 -07T11:
26 :
48
)
>
Maya包括其他处理Python日期时间的流行库,其中包括Humanize
, pytz
和pendulum
。 该项目的目的是使人们更轻松地处理日期时间。
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日期和时间库