Datetime 最强平台替 python库 -- Pendulum
Pendulum 不仅仅是一个日期时间库,它更是颠覆性的改变者。它提供了直观的界面和丰富的功能,让日期时间操作变得轻松愉悦。无论您是经验丰富的 Python 开发者,还是刚刚入门,Pendulum 都将彻底改变您处理日期和时间的方式。
Pendulum vs Datetime
原生datetime实例对于基本情况来说已经足够,但当你面对更复杂的用例时,它们往往会显示出局限性,而且使用起来不太直观。Pendulum提供了一个更简洁、更易用的 API,同时仍然依赖于标准库。所以它仍然datetime更好。
直观的 API:Pendulum 的 API 设计秉承简洁易用的核心理念。告别晦涩难懂的方法名和复杂的语法——Pendulum 直观的 API 让日期时间操作变得轻而易举。 时区处理:处理时区问题可能令人头疼,但 Pendulum 却能轻松应对。它提供无缝的时区支持,让您轻松实现时区转换,并进行精准的时区计算。 扩展功能:Pendulum 扩展了 Python 原生的 datetime 模块,添加了更多功能,例如流畅的方法链和区间计算。这些功能使您能够编写更简洁、更具表现力的代码。 解析灵活性:解析日期时间字符串是一项常见任务,而 Pendulum 在这方面表现出色。它支持多种开箱即用的格式,让您轻松解析日期时间字符串,无需担心格式差异。 时间持续时间处理:使用 Pendulum 处理时间持续时间非常简单。它提供了直观的方法来添加和减去持续时间,以及计算日期时间实例之间的间隔。 本地化:使用 Pendulum 轻松本地化日期时间格式。无论您是要格式化日期以供显示,还是要在不同语言环境中执行日期运算,Pendulum 的本地化支持都能满足您的需求。
通过一些例子来比较一下 Pendulum 与 Python 原生的 datetime 模块:
1. 时区处理:
# With Pendulum
import pendulumdt = pendulum.now()
print(dt.timezone_name) # Output: UTC
# With Datetime
import datetime
dt = datetime.datetime.utcnow()
print(dt.tzinfo) # Output: None
Pendulum 默认提供可感知时区的日期时间对象,而 Python 的原生日期时间模块则需要明确的时区处理。
2. 解析灵活性:
# With Pendulum
import pendulumdt = pendulum.parse('2024-03-27T12:00:00')
print(dt) # Output: 2024-03-27T12:00:00+00:00
# With Datetime
import datetime
dt = datetime.datetime.strptime('2024-03-27T12:00:00', '%Y-%m-%dT%H:%M:%S')
print(dt) # Output: 2024-03-27 12:00:00
与 Python 原生的 datetime 模块相比,Pendulum 的解析功能更加灵活、宽容。
3.时间持续时间处理:
#Example1 find duration# With Pendulum
import pendulum
dt1 = pendulum.datetime(2024, 3, 27, 10, 0, 0)
dt2 = pendulum.datetime(2024, 3, 27, 12, 0, 0)
duration = dt2 - dt1
print(duration.in_minutes()) # Output: 120 (minutes)
# With Datetime
import datetime
dt1 = datetime.datetime(2024, 3, 27, 10, 0, 0)
dt2 = datetime.datetime(2024, 3, 27, 12, 0, 0)
duration = dt2 - dt1
print(duration.seconds // 60) # Output: 120 (minutes)
#Example2 add duration
# With Pendulum
import pendulum
dt = pendulum.datetime(2024, 3, 27)
new_dt = dt.add(months=3)
print(new_dt) # Output: 2024-06-27T00:00:00+00:00
# With Datetime
import datetime
dt = datetime.datetime(2024, 3, 27)
new_dt = dt + datetime.timedelta(months=3)
print(new_dt) # Output: 2024-06-27 00:00:00
Pendulum 通过直观的方法简化了时间长度的计算,而 Python 原生的 datetime 模块则需要手动转换和计算。
下面我们详细看下pendulum的使用方法。
安装
使用前需要安装,直接pip install pendulum即可。
$ pip install pendulum
Looking in indexes: https://pypi.python.org/simple
Collecting pendulum
Downloading pendulum-2.1.2.tar.gz (81 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.2/81.2 kB 4.1 MB/s eta 0:00:00
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing metadata (pyproject.toml) ... done
...
Successfully installed pendulum-2.1.2 pytzdata-2020.1
基本用法
import pendulumdt = pendulum.datetime(
2022, 7, 21, 20, 10, 30)
print(dt.__class__)
print(dt)
"""
<class 'pendulum.datetime.DateTime'>
2022-07-21T20:10:30+00:00
"""
# 更改时区
dt = pendulum.datetime(
2022, 7, 21, 20, 10, 30, tz="xxxx/xxxx")
print(dt)
"""
2022-07-21T20:10:30+08:00
"""
# 创建日期
d = pendulum.date(2022, 7, 21)
print(d.__class__)
print(d)
"""
<class 'pendulum.date.Date'>
2022-07-21
"""
# 创建时间
t = pendulum.time(20, 10, 30)
print(t.__class__)
print(t)
"""
<class 'pendulum.time.Time'>
20:10:30
"""
如果datetime创建了,则时区默认为UTC。如果不想要时区,或者希望时区为当地时区,则pendulum也专门提供了两个方法。
import pendulum# 创建使用本地时区的日期时间
dt = pendulum.local(
2022, 7, 21, 20, 10, 30)
print(dt)
"""
2022-07-21T20:10:30+08:00
"""
print(pendulum.local_timezone())
"""
Timezone('xxxx/xxxx')
"""
# 创建不使用时区的日期时间
# tz is None
dt = pendulum.naive(2022, 7, 21, 20, 10, 30)
print(dt)
"""
2022-07-21T20:10:30
"""
然后pendulum还提供了几个方法,比如创建当前日期时间、日期等等。
import pendulumdt = pendulum.today()
print(dt)
"""
2022-07-21T00:00:00+08:00
"""
# 获取明天的日期
dt = pendulum.tomorrow()
print(dt)
"""
2022-07-22T00:00:00+08:00
"""
# 获取昨天的日期
dt = pendulum.yesterday()
print(dt)
"""
2022-07-20T00:00:00+08:00
"""
我们还可以从时间戳或字符串创建:
import pendulum# 基于时间字符串
dt1 = pendulum.from_timestamp(1653828466)
dt2 = pendulum.from_timestamp(1653828466,
tz=pendulum.local_timezone())
print(dt1)
print(dt2)
"""
2022-05-29T12:47:46+00:00
2022-05-29T20:47:46+08:00
"""
# 基于时间字符串
dt1 = pendulum.parse("2020-05-03 12:11:33")
dt2 = pendulum.parse("2020-05-03 12:11:33",
tz=pendulum.local_timezone())
print(dt1)
print(dt2)
"""
2020-05-03T12:11:33+00:00
2020-05-03T12:11:33+08:00
"""
日期时间相关操作
操作有很多,我们来一一介绍。
import pendulumdt = pendulum.local(
2022, 3, 28, 20, 10, 30)
# 获取日期和时间
print(dt.date())
print(dt.time())
"""
2022-07-21
20:10:30
"""
# 替换并返回新的日期时间
print(dt.replace(year=9999))
"""
9999-03-28T20:10:30+08:00
"""
# 转换为时间戳
print(dt.timestamp())
"""
1648469430.0
"""
# 返回年、月、日...
print(dt.year, dt.month, dt.day)
print(dt.hour, dt.minute, dt.second)
print(dt.tz)
"""
2022 3 28
20 10 30
Timezone('xxx/xxxx')
"""
然后生成字符串,pendulum.DateTime对象可以转换成各种格式的日期字符串。
import pendulumdt = pendulum.local(
2022, 3, 28, 20, 10, 30)
# Most frequent uses
print("datetime:", dt.to_datetime_string())
print("date:", dt.to_date_string())
print("time:", dt.to_time_string())
print("iso8601:", dt.to_iso8601_string())
"""
datetime: 2022-03-28 20:10:30
date: 2022-03-28
time: 20:10:30
iso8601: 2022-03-28T20:10:30+08:00
"""print("atom:", dt.to_atom_string())
print("rss:", dt.to_rss_string())
print("w3c:", dt.to_w3c_string())
print("cookie:", dt.to_cookie_string())
print("rfc822:", dt.to_rfc822_string())
"""
atom: 2022-03-28T20:10:30+08:00
rss: Mon, 28 Mar 2022 20:10:30 +0800
w3c: 2022-03-28T20:10:30+08:00
rfc822: Mon, 28 Mar 22 20:10:30 +0800
"""
有时我们还需要判断当前日期是星期几、当前年份是星期几等等,pendulum也已经帮我们封装好了。
import pendulumdt = pendulum.local(
2022, 3, 28, 20, 10, 30)
# 返回星期几
print(dt.isoweekday()) # 1
# 返回一年中的日子
print(dt.day_of_year) # 87
# 返回月份中的日子
print(dt.days_in_month) # 31
# 返回月份中星期
print(dt.week_of_month) # 5
# 返回一年中星期
print(dt.week_of_year) # 13
# 检查闰年
print(dt.is_leap_year()) # False
最后就是日期的操作了,这也是最强大的部分pendulum。
import pendulumdt = pendulum.local(
2022, 7, 21, 20, 10, 30)
# 返回下个月的今天
print(dt.add(months=1))
"""
2022-08-21T20:10:30+08:00
"""
# 返回上个月的今天
print(dt.add(months=-1))
"""
2022-06-21T20:10:30+08:00
"""
像 Python 内置的模块一样datetime,添加日期时最多支持几天,而且我们无法计算下周、下个月、明年的日期。pendulum可以轻松处理,这是我最喜欢的一点。
当然add中的值为正数,相当于日期往后推;值为负数,相当于日期往前推。
然后两个日期也可以相减:
import pendulumdt1 = pendulum.local(
2021, 1, 20, 11, 22, 33)
dt2 = pendulum.local(
2022, 3, 30, 20, 10, 30)
period = dt2 - dt1
# 返回 Period 对象
# 类似于 datetime 中的 timedelta
print(period.__class__)
"""
<class 'pendulum.period.Period'>
"""
print(period.in_years()) # 1
print(period.in_months()) # 14
print(period.in_weeks()) # 62
print(period.in_days()) # 434
print(period.in_hours()) # 10424
print(period.in_minutes()) # 625487
print(period.in_seconds()) # 37529277
功能很强大,Python的datetime.timedelta模块中最多只能计算两个日期相差多少天,这里可以使用年月日时分秒。
写在最后
Pendulum 不仅仅是一个日期时间库,它更是颠覆性的工具。凭借其直观的 API、无缝的时区处理、扩展的功能、灵活的解析、时间长度处理以及本地化支持,Pendulum 重新定义了开发者在 Python 中处理日期和时间的方式。告别日期时间难题,迎接 Pendulum!是时候提升你的日期时间技能了!
🏴☠️宝藏级🏴☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫等,从入门到进阶!
长按👇关注- 数据STUDIO -设为星标,干货速递