Python Pendulum库介绍
在本教程中,我们将学习Python中的Pendulum库。我们将讨论其特点和用法。Python提供了datetime模块,它是处理日期和时间最重要的库之一,并且非常灵活,并且带有许多有用的方法。
然而,datetime模块有一些限制,例如在不同时区失败。有时,我们需要导入第三方库来补充它,我们需要导入pytz第三方库来执行datetime无法执行的任务。因此,我们有一个Pendulum库的解决方案。让我们了解一下Python的Pendulum库。
介绍
Pendulum库是一个日期和时间操作库,适用于Python,比内置的datetime模块提供更直观,更易于使用的界面。
Pendulum库的特点
- 时区支持: 它支持500多种时区,包括DST转换和历史时区信息。
- 流畅的接口: 它允许您链接方法以更可读和直观的方式创建复杂的日期和时间对象。
- 友好的人类解析: 它可以解析类似于“下周五下午3点”的自然语言字符串,并将其转换为DateTime对象。
- 时间算术: 它允许您执行日期和时间的算术运算,例如添加或减去天数或小时数。
- 日期格式: 它提供了强大的格式化系统,以在各种格式中输出日期和时间。
我们可以使用以下命令安装它。
pip install pendulum
现在,我们导入Pendulum库来检查它是否已正确安装。
import pendulum as pdl
Pendulum名称似乎很长,所以我们将其导入为pdl。
让我们使用pendulum创建datetime对象并查看其对象类型。
示例 –
from datetime import datetime
dt = pdl.datetime(2023, 12, 2)
isinstance(dt, datetime)
输出:
True
虽然Pendulum为在Python中处理日期和时间提供了一个更直观,更易于使用的界面,但值得注意的是,Pendulum实际上是继承自内置的datetime模块。这意味着Pendulum包含datetime的所有功能和功能,我们可以使用Pendulum datetime对象与原始datetime方法和属性。
换句话说,Pendulum datetime对象是Python datetime对象,Pendulum库提供了附加的功能和方法。因此,如果您熟悉在Python中处理datetime对象的方法,则可以在使用Pendulum时使用该知识。
与时区一起工作
Pendulum库最强大的功能之一是其对时区的支持,这是内置的datetime模块可能难以使用的关键领域。在Python 3.9之前,为了使用IANA时区,人们不得不依赖于像pytz这样的第三方库。
使用Pendulum,您可以轻松使用500多个时区,包括历史时区数据和对DST转换的支持。这使得在不同的时区处理日期和时间计算以及在它们之间转换变得更加容易,而且不会遇到错误或意外行为。
让我们了解以下示例。
示例 –
import pendulum as pdl
# 创建具有本地时区的日期时间对象
local_dt = pendulum.now()
# 将日期时间对象转换为不同的时区
other_tz = pdl.timezone('Europe/Paris')
paris_dt = local_dt.in_timezone(other_tz)
dt_melbourne = pdl.datetime(2021, 11, 6, tz='Australia/Melbourne')
dt_brisbane = pdl.datetime(2021, 11, 6, tz='Australia/Queensland')
print(dt_melbourne)
print(dt_brisbane)
# 打印原始datetime对象和转换后datetime对象
print(local_dt)
print(paris_dt)
输出:
2021年11月6日UTC+11 00:00:00
2021年11月6日UTC+10 00:00:00
2023年2月23日UTC+5:30 19:14:26.647322
2023年2月23日UTC+1:00 14:44:26.647322
解释-
首先,我们使用now()方法创建一个以本地时区为基础的pendulum datetime 对象。 接下来,我们创建另一个datetime对象,其时区为Australia/Melbourne,第三个datetime对象时区为Australia/Queensland。
前两个datetime对象表示相同的时刻(2021年11月6日午夜),但使用不同的时区(Australia/Melbourne和Australia/Queensland)。
后两个datetime对象再次表示当前时刻(代码执行时),但是时区不同(本地时区和Europe/Paris)。
日期时间解析
编程中最常见的任务之一是解析日期时间。 虽然Python中的内置datetime模块非常适合此任务,但值得注意的是,Python使用与许多其他编程语言不同的datetime字符串格式。 具体而言,Python使用%Y%m%d格式表示日期,这不是其他语言中使用最广泛的格式。
我们可以使用from_format()方法解析日期。
例子-
pdl.from_format('2023-11-03 21:00:00', 'YYYY-MM-DD HH:mm:ss')
输出:
DateTime(2023,11,3,21,0,0,tzinfo = Timezone('UTC'))
除了支持%Y%m%d格式之外,Python中的pendulum模块还为其他常见的datetime格式(如RFC 3339和ISO 8601)提供了完全支持。 这意味着我们可以在Python中处理datetime字符串时,无需手动指定格式代码即可解析这些格式。 这在工作中可节省大量时间。
例子-
pdl.parse('2022-12-03 22:00:00')
输出:
DateTime(2022,12,3,22,0,0,tzinfo = Timezone('UTC'))
除此之外,Pendulum还支持更多即时格式。 例如-只使用数字的datetime。
例子-
pdl.parse('20230905')
输出:
DateTime(2023,9,5,0,0,0,tzinfo = Timezone('UTC'))
Pendulum库的一个有趣特性是可以从年份、周数和星期几创建datetime对象。 可以使用datetime方法完成此操作,如以下代码示例所示。
例子-
pdl.parse('2022-W44-6')
输出:
DateTime(2022,11,5,0,0,0,tzinfo = Timezone('UTC'))
我们可以特别获得日期或时间对象,我们需要指定exact = True,这比datetime要容易得多。
pdl.parse('20231129', exact=True)
pdl.parse('22:00:00', exact=True)
输出:
Date(2023,11,29)
Time(22,0,0)
字符串格式化
我们还可以使用pendulum格式化给定的字符串。 我们将执行datetime转换为具有格式的字符串。
首先,我们使用now()方法创建datetime对象。
dt = pdl.now()
print(dt)
DateTime(2023,2,24,18,12,58,297781,tzinfo = Timezone('Asia/Calcutta'))
下面是一些来自pendulum的to string方法的示例。
例子-
dt.to_date_string()#仅带日期
dt.to_time_string()
dt.to_formatted_date_string()
dt.to_day_datetime_string()
dt.to_iso8601_string()
dt.to_atom_string()
dt.to_cookie_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 '
'星期五,24-Feb-2023 18:12:58 IST'
我们还可以将一些随机单词格式化为格式字符串,并使它们摆脱格式。
dt.format('[Hi!Today is] DD MMMM,YYYY dddd HH:mm:ss A')
输出:
'Hi!Today is 24 February,2023 Friday 18:12:58 PM'
查找相对日期时间
在 Python 中自带的 datetime 模块中,查找基于给定日期的相对日期仍有改进的空间。例如,为了使用内置模块确定当前月份的最后一天,我们必须使用 datetutil 模块中的 relativedelta。让我们理解下面的例子。
例子 –
from datetime import datetime
from dateutil.relativedelta import relativedelta
datetime(2023, 2, 21) + relativedelta(day=28)
输出:
datetime.datetime(2023, 2, 28, 0, 0)
此外,使用内置模块的代码可能难以阅读,因为我们将 day=31 作为参数传递,即使对于小于31天的月份,这种方法也可能有效。
使用 pendulum 可以更容易地完成此操作。
例子 –
pdl.now().start_of('day') #查找一天的开始时间
pdl.now().start_of('month')
pdl.now().end_of('day')
pdl.now().end_of('month')
输出:
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 来完成。
例子 –
from datetime import datetime, timedelta
datetime.now() + timedelta(days=(0-datetime.now().weekday()+7)%7)
输出:
datetime.datetime(2023, 2, 27, 18, 42, 48, 88371)
正如我们所看到的,上面的代码有些复杂,开发者需要花费一些时间来理解它。我们可以通过 pendulum 更容易地完成这个操作。
例子 –
pdl.now().next(pdl.TUESDAY)
输出:
DateTime(2023, 2, 28, 0, 0, 0, tzinfo=Timezone('Asia/Calcutta'))
使用 Pendulum,我们不必担心应该使用 0 还是 1 来表示星期二,因为 Pendulum 为此使用枚举。
pendulum 库还提供了 previous() 方法来获取上个星期一。我们可以通过设置 keep_time=True 参数来保留时间部分。
例子 –
pdl.now().previous(pdl.TUESDAY, keep_time=True)
pdl.now().previous(pdl.TUESDAY)
输出:
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 对象与当前时间进行比较,并生成易于人类理解的输出。
例子 –
dt1 = pdl.datetime(2023, 3, 2)
dt1.diff_for_humans()
dt2 = pdl.datetime(2021, 10, 7, 1)
dt2.diff_for_humans()
输出:
'in 5 days'
'1 year ago'
结论
总之,Pendulum 库是 Python 中处理 datetime 信息的强大而直观的工具。它提供了一系列功能,使处理常见的 datetime 相关任务更加容易,例如查找相对日期和时间、处理时区以及在各种格式中解析 datetime 字符串。与内置 datetime 模块相比,Pendulum 提供了更清洁、更直观的 API,可以改善处理 datetime 信息的代码的可读性和可维护性。 总的来说,Pendulum 是 Python 生态系统中一个有价值的补充,并值得在涉及处理 datetime 信息的任何项目中考虑。