python 常用日期處理-- datetime 模塊的使用
僅以此篇記錄一下個(gè)人常用的 Python 處理日期的庫(kù)與函數(shù),主要涉及的類庫(kù)有 Python 自帶的 datetime, time 和 calendar,以及第三方的 dateutil。說(shuō)到日期處理基本上要覆蓋的概念有 date, time, datetime, timezone, calendar, 時(shí)間的比較與差值,解析與格式化顯示等。
在 datetime 模塊中類之間的繼承關(guān)系如下:
object
├── date
│ └── datetime
├── time
├── timedelta
└── tzinfo
└── timezone
我們著重體驗(yàn)一下前面粗體顯示的 datetime, date, time, timedelta 對(duì)象, timezone 也不是不重要,有時(shí)候也可能只需要處理本地時(shí)間。
datetime, date, time 實(shí)例的創(chuàng)建
可以使用它們各自的構(gòu)造函數(shù),提供必要的參數(shù)來(lái)創(chuàng)建相應(yīng)的實(shí)例,下面是它們的構(gòu)造函數(shù)
datetime: def __new__(cls, year, month=None, day=None, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0) date: def __new__(cls, year, month=None, day=None) time: def __new__(cls, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
比如
from datetime import datetime, date, time, timedelta today = date(2019, 4, 24) # 2019-04-24
獲得當(dāng)前日期或時(shí)間
date.today() #2019-04-24 datetime.now() # 2019-04-24 21:41:40.226300 datetime.today() # 2019-04-24 21:41:50.336293 datetime.today().date() #2019-04-24 datetime.today().time() #21:41:50.336303 datetime.now().date() datetime.now().time()
從語(yǔ)義上應(yīng)該調(diào)用 date.today()
和 datetime.now()
,datetime.today()
只是 datetime 繼承自 date 的函數(shù)。
time 沒(méi)有 today()
或 now()
方法,所以只有通過(guò) datetime.now()
來(lái)得到相應(yīng)的 time, datetime 兼具 date 與 time 信息,所以總是可以經(jīng)由 datetime 來(lái)獲得相應(yīng)的 date 和 time。
解析字符串獲得實(shí)例
date.fromisoformat('2019-04-24') # 2019-04-24 datetime.fromisoformat('2019-04-24T13:12:23') # 2019-04-24 13:12:23 datetime.strptime('04/24/2019', '%m/%d/%Y') # 2019-04-24 00:00:00 time.fromisoformat('12:12:24+06:00') #12:12:24+06:00
datetime, date 和 time 都有 fromisoformat()
方法,就是要了解它們各自的 ISO 表示格式。能指定格式來(lái)解析字符串只有 datetime 有 strptime()
方法,因?yàn)橛辛?datetime
也就有了相應(yīng)的 date 與 time
date, datetime 與 time 相應(yīng)的 ISO 格式如下
- date ISO format: YYYY-MM-DD
- datetime ISO format: YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]
- time ISO format: HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]
能自由解析字符串的就是 datetime.strptime(str, fmt)
,Python 借鑒了標(biāo)準(zhǔn) C 的日期格式定義字符串,見(jiàn) strftime() and strptime() Behavior. 后面的 strftime() 函數(shù)也要用到相同的格式定義法。
注:strftime() 和 strptime() 中的 f 和 p 分別對(duì)應(yīng)著 format 和 parse 的首字母。
基于 Timestamp 來(lái)創(chuàng)建實(shí)例
Python 本身沒(méi)有 Timestamp 這么一個(gè)類型,這里的 timestamp 是一個(gè)浮點(diǎn)數(shù)表示的
ts = datetime.today().timestamp() # 1556161777.38553 date.fromtimestamp(ts) # 2019-04-24 datetime.fromtimestamp(ts) # 2019-04-24 22:09:37.385530
time 沒(méi)有 fromtimestamp()
方法
格式化輸出
date, datetime 和 time 都有 isoformat() 和 strftime(fmt) 函數(shù),格式字符串請(qǐng)參考 strftime() and strptime() Behavior。
date.today().strftime('%a %b %d, %Y') # Wed Apr 24, 2019 datetime.today().isoformat() # 2019-04-24T22:21:38.747318 datetime.today().time().strftime('%Y') # 1900 date.today().strftime('%S') # 00
上面是幾個(gè)例子,注意在 Python 中像 time 沒(méi)有年月日信息時(shí)格式化時(shí)想要輸出年份會(huì)得到不期望的值,但不會(huì)象 Java 中那樣報(bào)錯(cuò)。比如下面的 Java 代碼
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate.now().format(formatter); //2019-04-24 LocalTime.now().format(formatter); //Exception java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
由于 LocalTime.now()
沒(méi)有年月日信息,所以無(wú)法格式化為 yyyy-MM-dd
。
時(shí)間, 日期的比較與 timedelta
- date, datetime, time 都定義有 __lt__, __le__, __ne__, __gt__, __ge__, __eq__ 函數(shù),所以兩個(gè)相同類型的實(shí)例之間是可以進(jìn)行比較時(shí)間上的先后的。
- 其中的 date, datetime 還定義了 __sub__ 和 __rsub__ 函數(shù),因此兩個(gè) date 或兩個(gè) datetime 實(shí)例進(jìn)行相減會(huì)得到一個(gè) timedelta 實(shí)例
- 另外, date, datetime 也定義了 __add__, __radd__ 函數(shù),date 或 datetime 可以加減一個(gè) timedelta 來(lái)得到一個(gè)新的實(shí)例
下面看幾個(gè)簡(jiǎn)單的示例
d1 = datetime.today() # 2019-04-24 23:00:31.672769 delta = timedelta(days=2, weeks=1, seconds=-3) # 8 days, 23:59:57 d2 = d1 + delta # 2019-05-03 23:00:28.672769 d3 = d1 - delta # 2019-04-15 23:00:34.672769 d2 - d1 # 8 days, 23:59:57 d2 > d1 # True d1 < d3 # False datetime.today().date() + delta) # 2019-05-02
注意,不同類型間不能相減,比如用 date 減去一個(gè) datetime 就不合法了。d1 + delta, d1 - delta 和 delta + d1 都沒(méi)問(wèn)題, 但是 delta - d1 就不行了。
timedelta 表示了兩個(gè)時(shí)間的差值,用它來(lái)推算另一個(gè)實(shí)例的時(shí)候不帶有日歷信息,如果想要在日歷上推演就得借助于 calendar。
不可忽略的 time 模塊
前面講到的是 datetime 模塊中的 time 類型,Python 還自帶了 time 模塊,由 import time 引入。它提供了一些很實(shí)用的功能
- time 包含了完整的如上的 datetime 信息,并不像 datetime 中的 time 不含年月日信息
- locatime(), strptime(), gmtime(), asctime(), mktime() 用以構(gòu)造 time 實(shí)例
- strftime() 可用來(lái)格式化輸出
- time.time() 得到當(dāng)前的 Unix 時(shí)間戳
- time.sleep(sec) 用來(lái)暫停當(dāng)前線程若干秒
關(guān)于 calendar 和 dateutil 的內(nèi)容有后續(xù)
以上就是python 日期處理的詳細(xì)內(nèi)容,更多關(guān)于python 日期處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python+Tesseract OCR實(shí)現(xiàn)截屏識(shí)別文字
pytesseract Python常用pytesseract進(jìn)行圖片上的文字識(shí)別,本文主要介紹了python+Tesseract?OCR實(shí)現(xiàn)截屏識(shí)別文字,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11python之Character string(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇python之Character string(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09python使用threading.Condition交替打印兩個(gè)字符
這篇文章主要為大家詳細(xì)介紹了python使用threading.Condition交替打印兩個(gè)字符,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05pycharm中出現(xiàn)no module named xlwt的原因及解決
這篇文章主要介紹了pycharm中出現(xiàn)no module named xlwt的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2023-05-05selenium查找網(wǎng)頁(yè)出現(xiàn)加載卡頓或失敗的解決方法
這篇文章主要為大家詳細(xì)介紹了selenium查找網(wǎng)頁(yè)時(shí)如何處理網(wǎng)站資源一直加載非??D或者失敗的情況,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-10-10python3實(shí)現(xiàn)名片管理系統(tǒng)(控制臺(tái)版)
這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)名片管理系統(tǒng)控制臺(tái)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11python中內(nèi)置庫(kù)csv的使用及說(shuō)明
這篇文章主要介紹了python中內(nèi)置庫(kù)csv的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11