Python Pendulum 库

2024年8月29日 | 阅读 7 分钟

在本教程中,我们将学习 Python 的 pendulum 库。我们将讨论它的特性和用法。Python 提供了 datetime 模块,这是处理日期和时间最重要的库之一,它非常灵活,并附带了许多有用的方法。

然而,datetime 模块存在一些限制,例如在不同时区中会出错。有时,我们需要导入第三方库作为补充,并且需要导入 pytz 第三方库来执行 datetime 无法完成的任务。因此,我们有了一个名为 pendulum 库的解决方案。让我们来理解 Python 的 pendulum 库。

引言

pendulum 库是 Python 的一个日期和时间操作库,它提供了比内置 datetime 模块更直观、更易于使用的接口。

Pendulum 库的特性

  • 时区支持:它支持超过 500 个时区,包括夏令时转换和历史时区信息。
  • 链式接口:它允许您链式调用方法,以更具可读性和直观性的方式创建复杂的日期和时间对象。
  • 人性化解析:它可以将自然语言字符串,如“下周五下午 3 点”,解析为 DateTime 对象。
  • 时间算术:它允许您对日期和时间执行算术运算,例如添加或减去天数或小时。
  • 日期格式化:它提供了一个强大的格式化系统,用于以各种格式输出日期和时间。

我们可以使用以下命令进行安装。

现在,我们导入 pendulum 库来检查它是否已正确安装。

pendulum 这个名字似乎有点长,所以我们将其导入为 pdl。

让我们使用 pendulum 创建 datetime 对象,并查看其对象类型。

示例 -

输出

True

虽然 pendulum 提供了更直观、更易于使用的界面来处理 Python 中的日期和时间,但需要注意的是,pendulum 实际上继承自内置的 datetime 模块。这意味着 pendulum 包含了 datetime 的所有特性和功能,我们可以使用原始的 datetime 方法和属性来处理 pendulum 的 datetime 对象。

换句话说,pendulum 的 datetime 对象是一个 Python datetime 对象,它增加了 pendulum 库提供的额外特性和方法。因此,如果您熟悉在 Python 中处理 datetime 对象,可以在使用 pendulum 时利用这些知识。

处理时区

pendulum 库最强大的特性之一是它对时区的支持,而这正是内置 datetime 模块在处理时可能遇到困难的关键领域。在 Python 3.9 之前,为了处理 IANA 时区,必须依赖 pytz 等第三方库。

使用 pendulum,您可以轻松处理超过 500 个时区,包括历史时区数据和夏令时转换支持。这使得在处理不同时区的日期和时间计算以及在它们之间进行转换时,更加容易,而不会出现错误或意外行为。

让我们理解下面的例子。

示例 -

输出

2021-11-06T00:00:00+11:00
2021-11-06T00:00:00+10:00
2023-02-23T19:14:26.647322+05:30
2023-02-23T14:44:26.647322+01:00

解释 -

首先,我们使用 now() 方法创建一个具有本地时区的 pendulum datetime 对象。然后,我们创建另一个位于 Australia/Melbourne 时区的 datetime 对象,以及一个位于 Australia/Queensland 时区的第三个 datetime 对象。

前两个 datetime 对象表示同一时刻(2021 年 11 月 6 日午夜),但在不同的时区(Australia/Melbourne 和 Australia/Queensland)。

后两个 datetime 对象表示当前时刻(代码执行时),但同样是在不同的时区(本地时区和 Europe/Paris)。

日期时间解析

在编程中最常见的任务之一就是解析日期时间。虽然 Python 的内置 datetime 模块非常适合这项任务,但值得注意的是,Python 使用的日期时间字符串格式与其他许多编程语言不同。具体来说,Python 使用 %Y%m%d 格式表示日期,这并非其他语言中最常见的格式。

我们可以使用 from_format() 方法来解析日期。

示例 -

输出

DateTime(2023, 11, 3, 21, 0, 0, tzinfo=Timezone('UTC'))

除了支持 %Y%m%d 格式外,Python 中的 pendulum 模块还完全支持其他常见的日期时间格式,例如 RFC 3339 和 ISO 8601。这意味着我们可以解析这些格式的日期时间字符串,而无需手动指定格式代码。在 Python 中处理日期时间字符串时,这可以节省大量时间。

示例 -

输出

DateTime(2022, 12, 3, 22, 0, 0, tzinfo=Timezone('UTC'))

除了这些之外,Pendulum 还可以即时支持更多格式。例如:仅包含数字的日期时间。

示例 -

输出

DateTime(2023, 9, 5, 0, 0, 0, tzinfo=Timezone('UTC'))

pendulum 库一个有趣的特性是它可以根据年份、周数和星期几来创建 datetime 对象。这可以通过 datetime 方法实现,如下面的代码示例所示。

示例 -

输出

DateTime(2022, 11, 5, 0, 0, 0, tzinfo=Timezone('UTC'))

我们可以单独获取日期对象或时间对象,需要指定 exact=True,这比 datetime 容易得多。

输出

Date(2023, 11, 29)
Time(22, 0, 0)

字符串格式化

我们也可以使用 pendulum 来格式化给定的字符串。我们将执行将 datetime 转换为带有格式的字符串。

首先,我们使用 now() 方法创建 datetime 对象。


DateTime(2023, 2, 24, 18, 12, 58, 297781, tzinfo=Timezone('Asia/Calcutta'))

以下是 pendulum 的 to_string 方法的一些示例。

示例 -

输出

'2023-02-24'
'18:12:58'
'Feb 24, 2023'
'Fri, Feb 24, 2023 6:12 PM'
'2023-02-24T18:12:58.297781+05:30'
'2023-02-24T18:12:58+05:30'
'Friday, 24-Feb-2023 18:12:58 IST'

我们也可以格式化一些随机单词为格式字符串,并让它们从格式中转义。

输出

'Hi! Today is 24 February, 2023 Friday 18:12:58 PM'

查找相对日期时间

在根据给定日期时间查找相对日期时间方面,内置的 Python datetime 模块还有改进的空间。例如,为了使用内置模块确定当前月的最后一天,我们必须从 datetutil 模块导入 relativedelta。让我们来理解下面的示例。

示例 -

输出

datetime.datetime(2023, 2, 28, 0, 0)

此外,使用内置模块的代码可能难以阅读,因为我们将 day=31 作为参数传递,即使这种方法可能适用于少于 31 天的月份。

使用 pendulum 可以更轻松地完成此操作。

示例 -

输出

DateTime(2023, 2, 24, 0, 0, 0, tzinfo=Timezone('Asia/Calcutta'))
DateTime(2023, 2, 1, 0, 0, 0, tzinfo=Timezone('Asia/Calcutta'))
DateTime(2023, 2, 24, 23, 59, 59, 999999, tzinfo=Timezone('Asia/Calcutta'))
DateTime(2023, 2, 28, 23, 59, 59, 999999, tzinfo=Timezone('Asia/Calcutta'))

datetime 模块在查找星期几方面也存在不足。例如 - 我们想找到下周二的日期,在 datetime 中可以这样做。

示例 -

输出

datetime.datetime(2023, 2, 27, 18, 42, 48, 88371)

正如我们所见,上面的代码有点复杂,开发人员需要花一些时间来理解它。使用 pendulum 可以轻松地完成。

示例 -

输出

DateTime(2023, 2, 28, 0, 0, 0, tzinfo=Timezone('Asia/Calcutta'))

使用 Pendulum,我们不必担心应该使用 0 还是 1 来表示星期二,因为它为此目的使用了枚举。

pendulum 库还提供了 previous() 方法来获取上一个星期一。通过设置 keep_time=True 参数,我们可以保留时间部分。

示例 -

输出

DateTime(2023, 2, 21, 18, 54, 6, 591922, tzinfo=Timezone('Asia/Calcutta'))
DateTime(2023, 2, 21, 0, 0, 0, tzinfo=Timezone('Asia/Calcutta'))

人类可读

内置的 Python datetime 模块提供了 timedelta 工具,可以有效地执行比较任务。尽管如此,Pendulum 有潜力通过提供更用户友好的输出,当比较两个 datetime 对象时,来增强此功能。

例如,Pendulum 中的 **diff_for_humans()** 方法可以用于将 datetime 对象与当前时间进行比较,并生成人类易于理解的输出。

示例 -

输出

'in 5 days'
'1 year ago'

结论

总而言之,pendulum 库是 Python 中处理 datetime 信息的强大而直观的工具。它提供了一系列功能,可以更轻松地处理常见的与日期时间相关的任务,例如查找相对日期和时间、处理时区以及以各种格式解析日期时间字符串。与内置的 datetime 模块相比,pendulum 提供了更简洁、更直观的 API,可以提高处理日期时间信息的代码的可读性和可维护性。总的来说,pendulum 是 Python 生态系统中一个有价值的补充,对于任何涉及处理日期时间信息的项目都值得考虑。