最好的Python DateTime 庫之 Pendulum 長篇解析
不過不得不說,datetime模塊也有一些限制。 例如,當我們處理時區時,通常會顯得短缺。有時,我們不得不引入一些第三方庫作為補充。 此外,datetime 模塊中的某些方面在其他編程語言中不很直觀或不常用。
在本文中,我將介紹一個名為 Pendulum 的第三方庫,它將解決內置 datetime 模塊的所有問題,歡迎收藏學習,喜歡點贊支持,文末提供技術交流群。
1.直接替換 datetime
使用 pytz 等第三方庫來解決一些 Python datetime不擅長的問題並不少見。但是,我們仍然需要導入 datetime 模塊並將其用作必不可少的,因為我們需要使用它來實例化 datetime 對象。
讓我向你展示為什麼 Pendulum 是一種替代品。 首先,我們需要使用pip安裝它。
pip install pendulum
該庫的名稱有點長,因此我建議使用別名導入它
import pendulum as pdl
雖然 pd 是一個較短的縮寫,但我會為 Pandas 保留它。不想制造任何混亂。
讓我們使用 Pendulum 創建一個 datetime 對象,並看看它的對象類型。
from datetime import datetime dt = pdl.datetime(2021, 11, 6) isinstance(dt, datetime)
Pendulum 繼承瞭 Python datetime 對象。 因此,我們無需擔心使用 datetime 模塊中的一些原始功能。 從字面上看,Pendulum datetime 對象是 Python datetime 對象。
2. 時區
Pendulum 庫最令人印象深刻的功能是時區, 這也是內置 datetime 模塊的關鍵問題之一。 在 Python 3.9 之前,如果我們想使用 IANA 時區,我們必須涉及 pytz。
使用 Pendulum 庫,我們可以像這樣輕松地創建一個帶有時區的日期時間對象。
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)
在上面的例子中,我們同時創建瞭兩個對象。 但是,時區是不同的。 Pendulum 還允許我們輕松比較時間。
dt_melbourne.diff(dt_brisbane).in_hours()
多麼容易啊! 比較具有不同時區的兩個日期時間對象並獲得確切結果!
如果我們需要定義多個 datetime 對象並希望重新使用 timezone 字符串,我們可以創建一個 timezone 對象並將其傳遞給 datetime 構造函數。
my_timezone = pdl.timezone('Australia/Melbourne') dt_melbourne = pdl.datetime(2021, 11, 6, tz=my_timezone) print(dt_melbourne) print(dt_melbourne.timezone.name)
另一個很酷的功能是將時間返回到不同的時區。 例如,墨爾本是午夜,那麼佈裡斯班是幾點?
3. 日期時間解析
解析日期時間可能是編程中最常見的用例,Python datetime 模塊做得很好。 但是與大多數其他編程語言相比,Python 使用瞭不同的格式 %Y%m%d。
Pendulum 允許我們使用如下常見的格式代碼
pdl.from_format('2021-11-06 22:00:00', 'YYYY-MM-DD HH:mm:ss')
此外,它完全支持 RFC 3339 和 ISO 8601 格式,以及其他一些常見格式。 這意味著我們不必指定格式代碼來將字符串解析為日期時間。
Pendulum 還集成瞭許多常見的日期時間擴展,例如 dateutil。 如果我們希望庫依賴於 dateutil 解析器,我們可以傳遞標志 strict=False。
pdl.parse('21-11-06', strict=False)
除此之外,Pendulum 即時支持更多格式。 例如,隻有數字的日期時間。
這個很有趣,指定年份、周數和那一周的日期,Pendulum 給你正確的日期時間。
如果我們特別想要一個日期對象或一個時間對象,隻需指定exact=True,這比Python datetime 模塊容易得多。
4. 字符串格式化
將字符串解析為日期時間對象後,下一件重要的事情就是將日期時間輸出為具有格式的字符串。
首先,讓我們有一個 datetime 對象。 由於 Pendulum 繼承瞭 Python datetime,我們可以使用 now() 等所有方法。
然後,讓我從 Pendulum 中挑選幾個“to string”方法的例子,看看用開箱即用的格式輸出日期時間是多麼容易。
dt.to_date_string() # with date only dt.to_time_string() # with time only dt.to_formatted_date_string() # month_abbr date, year dt.to_day_datetime_string() # day, month_abbr date, year hh:mm am/pm dt.to_iso8601_string() # to ISO 9601 standard dt.to_atom_string() # to Atom format dt.to_cookie_string() # to cookie style format
當然,我們可以使用格式碼來自定義輸出字符串,格式更直觀。
另一個很酷的東西是我們可以輕松地將一些不相關的字符串添加到格式字符串中,並讓它們脫離格式。
5. 人類可讀性
在內置的 Python datetime 模塊中,timedelta 工具可以很好地完成比較工作。 然而,Pendulum 甚至可以通過在比較兩個日期時間對象時提供一些更人性化的輸出來改進它。
例如,diff_for_humans() 方法將日期時間對象與當前時間進行比較,並返回一個非常人性化的輸出。
6. 查找相對日期時間
內置 Python 日期時間可以改進的方面之一是根據給定的日期時間查找相對日期時間。 例如,當我們要查找當月的最後一天時,我們必須使用 datetutil 模塊中的 relativedelta。
from dateutil.relativedelta import relativedelta datetime.datetime(2013, 2, 21) + relativedelta(day=31)
此外,代碼不是很可讀,因為我們使用 day=31 作為參數,盡管當月份少於 31 天時它會起作用。
在 Pendulum 中,再簡單不過瞭。
內置 datetime 模塊的另一個不便之處是查找一周中的某一天。 例如,如果我們要查找下周一的日期,這可能是最簡單的方法。
from datetime import datetime, timedelta datetime.now() + timedelta(days=(0-datetime.now().weekday()+7)%7)
它可以完成這項工作,但可讀性差。 開發人員需要花一些時間來理解這行代碼的邏輯是什麼。
使用 Pendulum,就這麼簡單
我們甚至不用考慮用 0 還是 1 來表示星期一,因為 Pendulum 使用枚舉來表示星期一。
同樣,我們可以使用 previous() 方法來查找上一個星期二,如下所示。 此外,我們可以通過設置參數 keep_time=True 來保留時間部分。
7. 一些額外的便利
這個庫中隱藏著更多的“秘密”。 再舉幾個例子,比如昨天或明天。
輸出具有不同文化和語言區域設置的日期時間也很容易。
再舉一個例子。 如果一個人出生於 1988 年 1 月 1 日,那麼這個人的年齡是多少?
總結
在本文中,我介紹瞭Python 第三方庫 Pendulum,它是 Python 內置 datetime 模塊的直接替代品。 通過使用這個庫,datetime 模塊可以解決的許多問題,例如查找相對日期,現在都可以輕松解決。
更重要的是,Pendulum 提供瞭整潔幹凈的 API 來提高我們代碼的可讀性,並且這些解決方案更加直觀。
技術交流
歡迎轉載、收藏、有所收獲點贊支持一下!
到此這篇關於最好的Python DateTime 庫之 Pendulum 長篇解析的文章就介紹到這瞭,更多相關Python Pendulum內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python最好的日期處理庫pendulum的使用指南
- Python 時間操作datetime詳情(下)
- Python 時間操作datetime詳情
- Python datetime模塊的使用示例
- python語言time庫和datetime庫基本使用詳解