首頁 > 軟體

Python最好的日期處理庫pendulum的使用指南

2022-07-21 14:02:28

關於日期處理,Python 提供了很多的庫,比如標準庫 datetime、第三方庫 dateutil、arrow 等等。這裡介紹一個我個人最喜歡的庫 pendulum,用起來可以說非常的方便,任何對日期的操作它都能滿足。

在使用之前需要先安裝,直接 pip install pendulum 即可。

下面來看一下用法,首先是 datetime, date, time 的建立。

import pendulum

dt = pendulum.datetime(
    2022, 3, 28, 20, 10, 30)
print(dt.__class__)
print(dt)
"""
<class 'pendulum.datetime.DateTime'>
2022-03-28T20:10:30+00:00
"""
# 建立的物件是 DateTime 型別
# 並且帶有時區,預設是 UTC
# 我們可以換一個時區
dt = pendulum.datetime(
    2022, 3, 28, 20, 10, 30, tz="Asia/Shanghai")
print(dt)
"""
2022-03-28T20:10:30+08:00
"""

# 如果不想要時區,那麼指定 tz=None
dt = pendulum.datetime(
    2022, 3, 28, 20, 10, 30, tz=None)
print(dt)
"""
2022-03-28T20:10:30
"""

# 然後是 date 的建立
d = pendulum.date(2022, 3, 28)
print(d.__class__)
print(d)
"""
<class 'pendulum.date.Date'>
2022-03-28
"""

# time 的建立
t = pendulum.time(20, 10, 30)
print(t.__class__)
print(t)
"""
<class 'pendulum.time.Time'>
20:10:30
"""

如果建立 datetime 時,時區預設是 UTC。如果不想要時區,或者希望時區是本地時區,那麼 pendulum 還專門提供了兩個方法。

import pendulum

# 建立 datetime 時設定為本地時區
# 還是呼叫了 pendulum.datetime 函數
# 但是 tz 被設定成了 pendulum.local_timezone()
dt = pendulum.local(
    2022, 3, 28, 20, 10, 30)
print(dt)
"""
2022-03-28T20:10:30+08:00
"""
print(pendulum.local_timezone())
"""
Timezone('Asia/Shanghai')
"""

# 建立 datetime 時不設定時區
# 內部也是呼叫了 pendulum.datetime 函數
# 但是 tz 為 None
dt = pendulum.naive(2022, 3, 28, 20, 10, 30)
print(dt)
"""
2022-03-28T20:10:30
"""

然後 pendulum 還提供了幾個方法,比如建立當前的 datetime,date 等等。

import pendulum

# 建立當前的 datetime
# 預設是本地時區,但時區可以指定
dt = pendulum.now()
print(dt)
"""
2022-05-29T20:40:49.632182+08:00
"""

# 建立當前的 date,但返回的仍是 datetime
# 只不過時分秒均為 0,同樣可以指定時區
dt = pendulum.today()
print(dt)
"""
2022-05-29T00:00:00+08:00
"""

# 獲取明天對應的 date
# 返回的是 datetime,時分秒為 0
# 時區可以指定,預設是本地時區
dt = pendulum.tomorrow()
print(dt)
"""
2022-05-30T00:00:00+08:00
"""

# 獲取昨天對應的 date
dt = pendulum.yesterday()
print(dt)
"""
2022-05-28T00: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
"""

datetime、date、time 的建立我們說完了,然後再來看看它們支援的操作,這也是最核心的部分。

datetime 相關操作

操作非常多,我們逐一介紹。

import pendulum

dt = pendulum.local(
    2022, 3, 28, 20, 10, 30)

# 獲取 date 部分和 time 部分
print(dt.date())
print(dt.time())
"""
2022-03-28
20:10:30
"""

# 替換掉 dt 的某部分,返回新的 datetime
# 年月日時分秒、以及時區都可以替換
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('Asia/Shanghai')
"""

然後是生成字串,pendulum.DateTime 物件可以轉成各種格式的日期字串。

import pendulum

dt = pendulum.local(
    2022, 3, 28, 20, 10, 30)

# 下面四個最為常用
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 pendulum

dt = pendulum.local(
    2022, 3, 28, 20, 10, 30)

# 返回星期幾
# 注意:星期一到星期天分別對應 1 到 7
print(dt.isoweekday())  # 1

# 返回一年當中的第幾天
# 範圍是 1 到 366
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 pendulum

dt = pendulum.local(
    2022, 3, 30, 20, 10, 30)

# 返回下一個月的今天
print(dt.add(months=1))
"""
2022-04-30T20:10:30+08:00
"""

# 返回上一個月的今天
# 但是上一個月是 2 月,並且是平年
# 所以最多 28 天
print(dt.add(months=-1))
"""
2022-02-28T20:10:30+08:00
"""
# 我們看到處理的非常完美
# 該方法的原型如下,年月日時分秒都是支援的,當然還有星期也支援
"""
def add(
    self,
    years=0,
    months=0,
    weeks=0,
    days=0,
    hours=0,
    minutes=0,
    seconds=0,
    microseconds=0,
):
"""

像 Python 的內建模組 datetime 在將日期相加的時候,最多支援到天,我們無法計算下一週、下一個月、下一年的日期。而 pendulum 則可以很方便地處理,這也是我最喜歡的一點。

當然啦,add 裡面的值為正,相當於日期往後退;值為負,相當於日期往前推。

然後是兩個日期還可以做減法:

import pendulum

dt1 = 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'>
"""

# 但是功能方面,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 最多隻能計算兩個日期差了多少天,而這裡年月日時分秒均可。

到此這篇關於Python最好的日期處理庫pendulum的使用指南的文章就介紹到這了,更多相關Python日期處理庫pendulum內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com