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

六个Python的时间日期库

[复制链接]
gaosmile 发布时间:2020-8-20 22:14
写过Python程序的人都知道,Python日期和时间的处理非常繁琐和麻烦。1 ]* _% e( K( v% b6 o% a# U
除了将字符串转换为更有用的 Python 对象之外,还有许多库具有一些有用的方法和工具,可以让你更轻松地进行时间测试、将时间转换为不同的时区、以人类可读的格式输出时间信息,本文将介绍以下六个Python的时间日期库:● Dateutil
) J2 L, n$ i8 W  g+ R3 j% {● Arrow& {' ]! v2 B+ z% r8 q, ?+ W
● Moment
1 g0 K  s7 c0 N" G6 _9 D● Maya+ K% c) v. P" H$ q; a
● Delorean
/ u: m! m, m  r# ~( I  ]0 W$ J● Freezegun
( G) I* g2 _# s% P3 }! L2 W& R

% M  n* P6 ], e% E
内建的 datetime 模块" l" I$ K2 n% v* B8 t$ r
在介绍其他库之前,让我们回顾以下如何使用datetime模块将日期字符串转换为Python日期时间对象。5 q* h( B9 Y7 C( G! ^5 ^
假设我们从API接收到这个日期字符串,并且需要它作为Python datetime对象存在:2018-04-29T17:45:25Z5 j' w( f3 B$ f2 a; I
该字符串包括:
" {3 e( j; [2 P5 l1 Q6 r- w0 t● YYYY-MM-DD格式的日期
$ K7 ?6 _2 Q3 M3 J● 字母“T”表示即将到来的时间
" I) K2 c( o7 m+ U. D$ @( h" s# d● HH:II:SS的时间格式
; i0 ?2 p# t  ~  `4 m6 O7 R+ m: E● 指示此时间的时区指示符“Z”采用UTC
) `- I: |- E& l8 s6 m" I7 ]
要使用该datetime模块将此字符串转换为Python datetime对象,你可以首先从strptime开始。datetime.strptime接收日期字符串和格式化字符并返回一个Python datetime对象。$ i7 B/ w% `3 I- F; m
我们必须手动将日期时间字符串的每个部分转换为Python datetime.strptime可以理解的格式化字符串。四位数的年份表示为%Y。两位数的月份是%m。两位数的日期是%d。24小时制的时间,%H表示小时数,分钟数用%M表示,秒用%S表示。' m0 i2 w# b) _8 `, A
由于字符串中的“Z”表示此日期时间字符串采用UTC,所以我们可以在格式中忽略此项。
9 ]7 T9 m1 V! }" m9 {$ u# y  L
此转换的代码如下所示:4 B6 v% B5 `' @
微信图片_20200820221110.jpg 6 j5 A3 {  w) F/ f
格式化字符串很难阅读和理解。有些人不太了解阅读datetime代码的人就会发现这很难理解,尽管其含义已有文档说明,但仍然很难阅读。  d( [& }- W1 T3 U& M' t
让我们看看其他库如何处理这种转换。
+ f& f3 _8 V& A$ ?

9 t# a  p: I& h5 Z
1、Dateutil3 t1 O; a( [1 M+ a) U& |& L0 Z% z
Dateutil模块为datetime模块提供了一些扩展,依然以上面的示例为例,实现相同的结果则要简单得多:
8 h' z5 J, M9 }  ~. N
微信图片_20200820221114.jpg
+ N1 o( m% u' U) k* P3 @$ ?3 ^" g
dateutil解析后可以自动返回字符串的时区。由于我们采用UTC,你可以看到返回了datetime对象。如果你想parse完全忽略时区信息,并返回一个原生的DateTime对象,你可以传递参数 ignoretz=True 给parse,像这样:( g" I/ R$ Q7 ~
微信图片_20200820221117.jpg & I  e& ]3 c. c3 u# p8 p8 y: W
Dateutil还可以解析更多可读的日期字符串:, ?! s( ]! O* N$ L; g
微信图片_20200820221120.jpg
: b# G) E6 B. Y! O- n% c& W/ h
dateutil还提供了relativedelta,用于计算两个日期时间之间的时差或从日期时间添加/删除,rrule用于创建重复日期时间,tz用于处理时区以及其他工具。) y  P4 w9 `( C: m1 u2 x+ Q
$ J" O  O: r" g7 ?2 L/ T% v) x/ L
2、Arrow
( y' T, I! J, gArrow是另一个库,其目标是进行操作,格式化,并处理更合理的日期和时间。它包括dateutil模块,根据其文档描述Arrow旨在“帮助你使用更少的代码来处理日期和时间”。# r: L% Q3 `5 z0 N! E
要返回我们的解析示例,下面介绍如何使用 Arrow 将日期字符串转换为 Arrow 的 datetime 类的实例:: f! J) f  k5 }, B
微信图片_20200820221122.jpg
4 ^# {; Z; \9 ^, c' d
你也可以在第二个参数中指定get() 格式,就像使用strptime一样,Arrow会尽力解析你提供的字符串,get() 返回 Arrow 的 datetime 类的一个实例。要使用Arrow来获取 Python datetime对象,可以如下所示:/ _! a8 B, Z6 O1 O
微信图片_20200820221125.jpg 6 D1 k) M: z6 B; x0 @( C+ N
通过Arrow datetime类的实例,你还可以访问Arrow的其他有用方法。例如,它的humanize()方法将日期时间解析成可读的短语,如下所示:: u. Q5 z4 c9 [  p$ J
微信图片_20200820221128.jpg ! F* N. B5 M9 m% I" \4 ?
你可以在Arrow文档中阅读更多有用的方法
6 i+ y1 Y0 a/ O) ]2 k5 N# n7 t
9 w2 Y# Z( U* U. a3 [' h. h/ l
3、Moment
- f8 d* f# U# u& p# N5 T% V, w7 ZMoment的创作者认为它是“测试版”,但即使它处于早期阶段,却非常受欢迎的,因此它出现在推荐名单内- ~& W# c/ ]# U/ `. g
Moment将字符串转换的方法很简单,类似于我们之前提到的库:7 s2 W6 X! {' d- V6 U9 Z) Z8 S3 |
微信图片_20200820221131.jpg - w: p" h# n% q- O; {5 u6 i
和其他库一样,它最初返回它自己的datetime类的实例。要返回Python datetime对象,请添加一个date()调用。
& r2 }9 w' _  s/ s: y+ Y
这会将Moment datetime类转换为Python日期时间对象。Moment还提供了使用人类可读语言创建新日期的方法。如为明天创建一个日期:
9 ~' A5 D( j7 o4 X4 ~( y
微信图片_20200820221133.jpg + ~# e3 s# V) V' @
它add()和subtract()命令采取关键字参数,使日期的操作变得简单,以及为了获得后天的日期,Moment会使用下面的代码:
- t  d) M, J- L5 S& |+ N
微信图片_20200820221136.jpg ! a* m0 p, T2 u. ^
% G8 ]/ g0 X* b" z. {5 R! G& h
4、Maya
, _( a! x' P, ?MAya包含了其他流行的库,诸如Humanize,pytz和pendulum等等。该项目的目标是让人们更容易处理日期。
6 H, f" q. W- D0 Q2 e/ i7 f3 P
Maya的README包含几个有用的示例。以下是如何使用Maya重现上面解析示例:% l2 H' B4 s& {& P
微信图片_20200820221139.jpg
  D8 W9 U* H" O- f2 C, Z; O& |" H
请注意,我们必须在.datetime()之后调用maya.parse()。如果我们跳过这一步,Maya将返回MayaDT类的一个实例:<MayaDT epoch=1525023925.0>。
# {, L5 t7 D0 O4 }
由于Maya有许多方法和datetime库中的一样,因此它可以使用其MayaDT类的实例来执行诸如使用slang_time()方法将timedeltas转换为纯文本语言,以及将日期时间间隔保存在单个类的实例操作中。以下是如何使用Maya将日期时间表示为人类可读的短语:
5 I/ V2 P$ g! @+ i2 j
微信图片_20200820221142.jpg ) L7 k+ m$ m/ z2 f* x$ Z6 ^
很显然,slang_time()的输出结果会根据你与datetime对象的距离长短而改变。
; T, m) r3 u  Q- q, W% R
' i) v6 }5 X( i+ a8 m
5、Delorean; ~' ~9 R" s1 ^" r* ?6 U3 i
Delorean以《Back to the Future》电影中的时间旅行汽车命名的,适用于操纵日期时间:将日期时间转换为其他时区,并添加或减去时间。! c# |) k3 S5 T
Delorean需要有效的Python Datetime才能执行,所以如果你需要使用日期时间字符串,最好将其与上述库中的一个配合使用。例如,将Maya与Delorean一起使用:
' m5 x  ?6 k& ]. `8 a) T# B0 d, V
微信图片_20200820221145.jpg
. C, E# ^8 _1 _
现在,在日期时间对象d_t可供您使用的情况下,你可以使用Delorean进行操作,例如将日期时间转换为美国东部时区:3 J& T7 o3 Q7 v2 T7 d1 ^- n, |
微信图片_20200820221148.jpg
# l' e. p9 X0 m1 M+ v
你看小时数已经从17变为13了,你还可以使用自然语言方法来操作 datetime 对象。2018年4月29日之后的下个星期五(我们使用的日期):' l5 k5 |1 Y  @1 d; l& b
微信图片_20200820221150.jpg
/ @3 \! ]" d) M4 N8 x$ p

! R1 L: z% D% x% _
6、Freezegun+ V  D5 ~, U$ h5 C
Freezegun是一个可以帮助你在Python代码中测试特定日期的库。使用@freeze_time装饰器,你可以设置测试条件下的具体日期和时间,所有datetime.datetime.now(),datetime.datetime.utcnow()等都会返回你指定的日期和时间。例如:4 H8 b# U  q; U3 L9 }' `, \
微信图片_20200820221153.jpg
6 p% D4 h/ g( a) Q, m% T
要跨时区进行测试,可以将tz_offset参数传递给装饰器。该freeze_time装饰同样能够处理更通俗易懂的语言日期,例如@freeze_time( April 4, 2017 )。
6 U) U9 ~6 d7 h
上面提到的每个库都有各自不同的功能。可能很难确定哪一个最适合你的需求。正如Maya的创作者 Kenneth Reitz说:“所有这些项目相互补充,它们都很友好。”  k4 |% }2 T& o& Q8 Q- g6 Q6 W: ^
这些库各自都具备一些功能,但并不都是完美的。有些擅长时间操作,有些擅长解析。但他们都有共同的目标,即让时间日期相关的操作都变得简单。当你发现Python的内置datetime模块已经不够用的时候,你可以选择以上的某一个库尝试看看。
; `4 k6 B5 M& Y6 p" g6 o% o! p8 G% l
赞 收藏 评论0 发布时间:2020-8-20 22:14

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版