1. 程式人生 > 程式設計 >python 常用日期處理-- datetime 模組的使用

python 常用日期處理-- datetime 模組的使用

僅以此篇記錄一下個人常用的 Python 處理日期的庫與函式,主要涉及的類庫有 Python 自帶的 datetime,time 和 calendar,以及第三方的 dateutil。說到日期處理基本上要覆蓋的概念有 date,time,datetime,timezone,calendar,時間的比較與差值,解析與格式化顯示等。

在 datetime 模組中類之間的繼承關係如下:

object
├── date
│ └── datetime
├── time
├── timedelta
└── tzinfo
└── timezone

我們著重體驗一下前面粗體顯示的 datetime,date,timedelta 物件,timezone 也不是不重要,有時候也可能只需要處理本地時間。

datetime,time 例項的建立

可以使用它們各自的建構函式,提供必要的引數來建立相應的例項,下面是它們的建構函式

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,day=None)
 
time:
 def __new__(cls,fold=0)

比如

from datetime import datetime,timedelta
 
today = date(2019,4,24) # 2019-04-24

獲得當前日期或時間

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()

從語義上應該呼叫 date.today() datetime.now()datetime.today() 只是 datetime 繼承自 date 的函式。

time 沒有 today() now() 方法,所以只有通過 datetime.now() 來得到相應的 time,datetime 兼具 date 與 time 資訊,所以總是可以經由 datetime 來獲得相應的 date 和 time。

解析字串獲得例項

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 表示格式。能指定格式來解析字串只有 datetime 有 strptime() 方法,因為有了 datetime 也就有了相應的 date 與 time

date,datetime 與 time 相應的 ISO 格式如下

  1. date ISO format: YYYY-MM-DD
  2. datetime ISO format: YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]
  3. time ISO format: HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]

能自由解析字串的就是 datetime.strptime(str,fmt),Python 借鑑了標準 C 的日期格式定義字串,見 strftime() and strptime() Behavior. 後面的 strftime() 函式也要用到相同的格式定義法。

注:strftime() 和 strptime() 中的 f 和 p 分別對應著 format 和 parse 的首字母。

基於 Timestamp 來建立例項

Python 本身沒有 Timestamp 這麼一個型別,這裡的 timestamp 是一個浮點數表示的

ts = datetime.today().timestamp() # 1556161777.38553
date.fromtimestamp(ts)  # 2019-04-24
datetime.fromtimestamp(ts)  # 2019-04-24 22:09:37.385530

time 沒有 fromtimestamp() 方法

格式化輸出

date,datetime 和 time 都有 isoformat() 和 strftime(fmt) 函式,格式字串請參考 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

上面是幾個例子,注意在 Python 中像 time 沒有年月日資訊時格式化時想要輸出年份會得到不期望的值,但不會象 Java 中那樣報錯。比如下面的 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() 沒有年月日資訊,所以無法格式化為 yyyy-MM-dd

時間,日期的比較與 timedelta

  1. date,datetime,time 都定義有 __lt__,__le__,__ne__,__gt__,__ge__,__eq__ 函式,所以兩個相同型別的例項之間是可以進行比較時間上的先後的。
  2. 其中的 date,datetime 還定義了 __sub__ 和 __rsub__ 函式,因此兩個 date 或兩個 datetime 例項進行相減會得到一個 timedelta 例項
  3. 另外,datetime 也定義了 __add__,__radd__ 函式,date 或 datetime 可以加減一個 timedelta 來得到一個新的例項

下面看幾個簡單的示例

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 減去一個 datetime 就不合法了。d1 + delta,d1 - delta 和 delta + d1 都沒問題,但是 delta - d1 就不行了。

timedelta 表示了兩個時間的差值,用它來推算另一個例項的時候不帶有日曆資訊,如果想要在日曆上推演就得藉助於 calendar。

不可忽略的 time 模組

前面講到的是 datetime 模組中的 time 型別,Python 還自帶了 time 模組,由 import time 引入。它提供了一些很實用的功能

  1. time 包含了完整的如上的 datetime 資訊,並不像 datetime 中的 time 不含年月日資訊
  2. locatime(),strptime(),gmtime(),asctime(),mktime() 用以構造 time 例項
  3. strftime() 可用來格式化輸出
  4. time.time() 得到當前的 Unix 時間戳
  5. time.sleep(sec) 用來暫停當前執行緒若干秒

關於 calendar 和 dateutil 的內容有後續

以上就是python 日期處理的詳細內容,更多關於python 日期處理的資料請關注我們其它相關文章!