深度乾貨:python中時間表示

2021-02-19 工程師milter
python中的時間處理大總結

python中處理時間的模塊有三個,datetime,time,calendar,融匯貫通三個模塊,才能隨心所欲地用python處理時間。本文就是為此而寫。關注並回復「time」得notebook

概述

datetime模塊主要是用來表示日期的,就是我們常說的年月日時分秒

calendar模塊主要是用來表示年月日,是星期幾之類的信息。

time模塊主要側重點在時分秒

粗略從功能來看,我們可以認為三者是一個互補的關係,各自專注一塊。方便用戶依據不同的使用目的選用趁手的模塊。

從time模塊說起

三個模塊中,time模塊是基礎。為了學習time模塊,我們需要先知道幾個與時間相關的概念:

1,epoch

假設我們要將時間表示成毫秒數,比方說1000000毫秒,那有一個問題必須解決,這個1000000毫秒的起點是什麼時間,也就是我們的時間基準點是什麼時間?好比我說你身高1.8米,那這個身高是指相對於你站立的地面說的。這個時間基準點就是epoch,在Unix系統中,這個基準點就是1970年1月1日0點整那個時間點。

Unix時間戳(英文為Unix time, POSIX time 或 Unix timestamp)是從Epoch(1970年1月1日00:00:00 UTC)開始所經過的秒數,不考慮閏秒。

2,GMT, UTC

上面我們說epoch表示1970年的起始點,那這個1970年又是相對於哪個基準時間呢?一般來說,就是相對於格林尼治時間,也叫做GMT(Greenwich Mean Time) 時間,還叫做UTC(Coordinated Universal Time),為啥一個時間基準有兩個名字?歷史上,先有的GMT,後有的UTC。

UTC是我們現在用的時間標準,GMT是老的時間計量標準。UTC是根據原子鐘來計算時間,而GMT是根據地球的自轉和公轉來計算時間。

所以,可以認為UTC是真正的基準時間,GMT相對UTC的偏差為0

在實際中,我們的計算機中有一個硬體模塊RCT,裡面會實時記錄UTC 時間,該模塊有單獨的電池供電,即使關機也不影響。

有了epoch這個時間基準,又有了UTC這個基準的基準,我們就可以精確地表示一個時間了。

時間戳,epoch,utc三者之間的關係如下圖所示:

3,DST, tzone

儘管我們已經可以精確地表示一個時間,很多情況下,我們還是要根據地區實際情況對時間進行一個調整,最常見的就是時區,tzone,相信大家都比較熟悉。此時,當我們說5點5分這個時間時,還需加上是哪個時區的5點5分才能精確說明一個時間。

另外一個對時間做出調整的就是DST。

DST 全稱是Daylight Saving Time,是說,為了充分利用日光,減少用電,人為地對時間做出一個調整,這取決於不同國家和地區的政策法規。比如說,假設你冬天7點天亮起床,但夏天6點天亮,那麼在夏天到來時人為將時間加1個小時,這樣就可以讓你還是覺得7點起床,但實際上是提前一個小時了。

那麼,好奇的我們,一定要問一問,python是如何知道tzone和DST這兩個的值呢?答案是通過環境變量

這裡我們只以linux為例來說明一下。

在linux中有TZ環境變量,其值類似這樣:CST+08EDT,M4.1.0,M10.5.0,這個字符串可以做如下解讀,用空格分開他們,分成三部分

第一部分中的CST表示時區的名字,即China Standard Time,也就是我們說的北京時間,+8表示北京時間加上8小時就是UTC時間

第二部分EDT表示DST的名字,我們說DST是因各個國家地區的政策法規不同而不同的,EDT後面也可以像CST後面一樣加一個時間調整值,但由於我們國內只在86年到92年實行過一段時間DST,現在已經廢止,所以後面不用加調整時間。

第三部分表示的是實行DST的開始和結束時間,我們就不細解讀了。

4,時間的表示,獲取,轉換

time模塊中獲取時間的基本方法是now = time.time()它返回的是從epoch到現在的秒數(用浮點數表示),用的是UTC時間

如下圖所示:

我們自然而然地想把這個秒數轉為年月日時分秒的形式,而這種轉換又分兩種:

time模塊給我們提供了兩個方法,

time.gmtime(t)

time.localtime(t)

二者都返回一個類struct_time的實例,如下圖所示:

可以看到local time 確實比 gmt time 多了8個小時,說明確實是根據北京時區進行了調整。前面我們講過 CST+08表示的就是北京時間比utc要加8個小時。

struct_time實例具有如下屬性:

相比用秒數表示的時間,這樣的表示更適合我們理解。

除了以上屬性,struct_time還有一個tm_zone屬性。如下圖所示:

這兩個函數如果調用時不傳參數,它們內部會調用time.time(),並用返回的秒數做轉換。

相反的,python同樣提供了將這兩種struct_time轉為秒數的方法。

calendar.timegm()

方法用來把UTC的struct_time(gmtime的返回對象)轉為從epoch開始的秒數

time.mktime()

用來把用時區調整過的struct_time(即localtime的返回對象)對象轉為從epoch開始的秒數

如下圖所示:

struct_time中已經有時區信息了,為啥還要專門分兩個函數呢?

因為我們有可能從字符串中構建struct_time,而字符串中可能沒有時區信息。

時間和表示時間的字符串之間進行轉換

time模塊中的strftime和strptime就是做這個用的。

看名字大家就應該知道它們的含義:

strftime 即 string format time,用來將時間格式化成字符串

strptime 即string parse time,用來將字符串解析成時間。

需要注意的是,這裡的時間都是struct_time對象。

關於怎麼格式化時間,就借用官網文檔的內容了。

這裡給一個簡單的例子:

除了這兩個函數,time模塊中還提供了兩個簡便方法,來幫助將時間轉為字符串

asctime

用來將一個struct_time對象轉為標準24字符的字符串,如下所示:

ctime

它與asctime作用相同,只不過它接收的是秒數,在內部,會先把秒數通過localtime轉為struct_time,再往後就與asctime一樣了。

如下圖所示:

以上就是time模塊的核心內容,下面,我們要開始學習datetime模塊。

datetime模塊

time模塊解決了時間的獲取和表示,datetime模塊則進一步解決了快速獲取並操作時間中的年月日時分秒信息的能力。

1, datetime的時區問題

現在,讓我們對時間中的時區進行一個小結。

首先,timestamp是基於utc的,它代表從epoch開始的秒數,而epoch是基於utc。在所有的時間表示中,它就是一個轉換橋梁。

然後,我們學會了將timestamp轉變成utc的struct_time和cst的struct_time。此時,struct_time中攜帶了時區信息。

緊接著,為了將struct_time變回timestamp,我們分別學習了 calendar.timegm和time.mktime。這兩個方法會忽略struct_time中的時區信息,分別按照utc和local時區(也就是環境變量中的時區)進行轉換。

當我們開始使用datetime.datetime時,時區問題變得複雜了。因為datetime有兩種,一種是有時區信息的,一種是沒有時區信息的。如下所示:

可以看到,如果沒有使用pytz指定utc時區,默認的datetime是沒有時區信息的。沒有時區信息,意味著,這個datetime的具體時間是啥留給使用該對象的我們來解釋了。

即使我們從timestamp中創建datetime,默認情況下,也是忽略了時區信息。

上述方法,得到的datetime是按照local時區轉換過的,但是datetime並不攜帶時區信息。這裡略有點繞,需要注意一下。

此時,必須明確指定時區,才能讓datetime攜帶時區信息。

為了將struct_time轉變為datetime,我們必須先轉成timestamp,在這步轉換中,必須合理地使用 calendar.gmtime和time.mktime。否則timestamp就會是錯誤的值。

2、時區的最佳實踐

因為時區的存在,如何表示和存儲時間就是一個麻煩的問題。最佳的方案就是存儲時使用UTC,顯示時使用local

但是萬事沒絕對,你還是需要根據你實際的情況決定如何使用時區。

3、datetime和str的轉換:string轉datetime
dt = datetime.datetime.strptime('2020-11-18 11:39:31 CST', "%Y-%m-%d %H:%M:%S %Z")

上面的轉換中,儘管字符串中有時區信息,但是得到的dt對象仍然是沒有時區信息的。這就是python中datetime容易令人困惑的地方,除非明確指定,否則datetime對象就是沒有時區信息的。

要判斷一個datetime對象有時區信息,需要同時滿足兩個條件:

dt.tzinfo.utcoffset(None) 返回不為空

稍加驗證,即可知道。

datetime轉string

可以看到,時區信息已經丟失了。

Note: datetime和time模塊中都有strftime、striptime。作用還是不一樣的。

datetime轉時間戳
time_time = time.mktime(date_time.timetuple())

上述代碼中,需要確保date_time是local的,否則表示就會錯誤。

時間戳轉datetime

文章前面已有。

總結

表示時間是一個挺複雜的事情,因為時間本身就是複雜的。認真學習一下時間的表示和轉換,無疑是有long term  value的。因為時間是永恆的


相關焦點

  • Python 深度學習,你的 Keras 準備好了嗎?
    ,第一時間送達前天我在公眾號推薦了《Python Deep Learning》這本書。該書是由 Keras 作者寫的,所以全書基本圍繞著 Keras 講深度學習的各種實現,從 CNN,RNN 到 GAN 等,偏入門,但理論和實戰部分都講的還不錯,承載著很多作者對深度學習整體性的思考。
  • Python日期和時間(純乾貨,附源碼)
    (datetime.datetime(2019,1,13,12,0,0) - datetime.datetime.now()).total_seconds()print ("t = ", t)## 輸出結果t = 49367780.076406Python中有提供與日期和時間相關的4個模塊。
  • python中的時間類型
    時間類型是程式語言中經常使用到的,且在日常生活中也常用到。
  • 【ICML2020-哈佛】深度語言表示中可分流形
    雖然它們只是受到生物大腦的鬆散啟發,但最近的研究報告稱,從任務優化的神經網絡中提取的表徵與大腦中的神經種群之間存在相當多的相似性。神經網絡後來成為一個流行的模型類,用來推斷複雜認知功能下的計算原理,反過來,它們也成為一個自然的實驗平臺,用來應用最初開發的方法來探測神經群體中的信息。在這項工作中,我們利用平均場理論流形分析,從計算神經科學的最新技術,從大規模語境嵌入模型分析語言表示的高維幾何。
  • 資源|書籍《Python深度學習》推薦(附最新PDF和源碼下載)
    ,第一時間送達一、書籍簡介《Deep Learning with Python》詳盡介紹了用Python和Keras進行深度學習的探索實踐,包括計算機視覺、自然語言處理、產生式模型等應用。書中包含30多個代碼示例,步驟講解詳細透徹。在學習這本書時,你將探索計算機視覺、自然語言處理和生成模型中的應用程式的挑戰性概念和實踐。當你完成閱讀實踐的時候,你就有了將深度學習應用到自己項目中的知識和實踐技能
  • Python+Matlab+機器學習+深度神經網絡+理論+實踐+視頻+課件+源碼,附下載!
    基礎不太好的,或者是python小白的朋友準備的,如果覺得自己對python已經很熟悉的朋友可以跳過這個部分。第三部分就是深度神經網絡的內容了,你想知道的關於深度神經網絡的一切,都可以從裡面學到。值得一提的是,裡面還有matlab的機器學習教程,這絕對是乾貨啊有木有~除了今天的福利,小編之前還整理了很多關於人工智慧、機器學習和大數據的相關電子書籍,感興趣的小夥伴也可以作為參考!文章底部有往期福利,可點擊進行查看!以後還會有陸陸續續的乾貨全部分享給大家。
  • Python中的元組排序和深度比較
    通常有多種方法可以表示相同的文本,在將這些不同的表示視為相等之前,必須對它們進行標準化。為了簡單起見,本文將堅持使用ASCII字符。字符串的排序是Python中比較有趣的部分:字符串「pickle」比字符串「python」小,因為我們是按字母順序排序的…大小寫有一部分作用:
  • 乾貨:0基礎學習 python 史上最全的資料總結(附圖書集合)
    的,走了一些彎路, 其實對於從零基礎開始學習python, 好的教程真的是日行千裡,於是我花了一些時間給大家整理了現在網上一些學習的乾貨, 記得點讚,在看,轉發鼓勵一下哈下面我給大家的教程分為三個部分,一個是文檔教程, 提供了簡單易懂的python基礎語法等教程第二個是視頻教程, 視頻教程都是我從B站眾多的up 主選出來,質量優秀,而且還不是很難的教程
  • 【python】Tkinter窗口可視化二
    Radiobutton就是單選控制項,參數text表示顯示的文字,value為值,variable表示允許哪個變量進行操作。本質;要素;要點;必需品推薦閱讀:精彩知識回顧【python】Tkinter可視化窗口(一)【珍藏版】長文詳解python正則表達式這些神經網絡調參細節,你都了解了嗎
  • 如何使用 Keras,Python 和深度學習進行多 GPU 訓練
    ,第一時間送達作者:pyimagesearch原文連結:https://www.pyimagesearch.com/2017/10/30/how-to-multi-gpu-training-with-keras-python-and-deep-learning/編譯:AI算法與圖像處理內容簡介
  • 【python】Tkinter可視化窗口(三)
    精彩知識回顧前兩個Tkinter文章為:【python】Tkinter可視化窗口一【python】Tkinter窗口可視化二from_和to:表示從from_的值到to的值,用from_而不用from的原因是from是python的關鍵字!
  • 迅為乾貨 | Python移植
    需要用到的源碼包有:「python-2.7.3 源碼和補丁.zip」---python 壓縮包和補丁文件;「install_python.tar」---編譯好的 sqlite 庫文件;「sqlite-autoconf-3240000.tar.gz」---sqlite 的源碼文件;「測試程序」---python 測試例程。
  • 【機器學習】人人都可以做深度學習應用:入門篇(中)
    但是,經過一個多月的業餘時間的認真學習,我發現還是能夠學到一些東西,並且跑一些demo和應用出來的,下面是我的一個學習過程和總結。1. 學習的提前準備(1)部分數學內容的複習,高中數學、概率、線性代數等部分內容。
  • 使用PYTHON中KERAS的LSTM遞歸神經網絡進行時間序列預測
    p=19542  時間序列預測問題是預測建模問題中的一種困難類型。與回歸預測建模不同,時間序列還增加了輸入變量之間序列依賴的複雜性。用於處理序列依賴性的強大神經網絡稱為 遞歸神經網絡。長短期記憶網絡或LSTM網絡是深度學習中使用的一種遞歸神經網絡,可以成功地訓練非常大的體系結構。
  • 乾貨|理解Python爬蟲框架pyspider
    scheduler 負責整體的調度控制任務由 scheduler 發起調度,fetcher 抓取網頁內容, processor 執行預先編寫的python腳本,輸出結果或產生新的提鏈任務(發往 scheduler),形成閉環每個腳本可以靈活使用各種python庫對頁面進行解析,使用框架API控制下一步抓取動作,通過設置回調控制解析動作二、pyspider
  • Python圖像處理介紹--Python中的圖像表示
    ,第一時間送達使用Python進行圖像處理是理解如何通過數學和代碼表示圖片的有趣方法,希望這篇文章能讓您了解計算機是如何理解圖像數據的。因此,我們可以將圖像表示為三維矩陣。每個像素被表示為一個Python列表,用於指定它們的顏色組合。
  • 乾貨 | tensorflow模型導出與OpenCV DNN中使用
    星標或者置頂【OpenCV學堂】乾貨文章與技術教程第一時間送達OpenCV DNN模塊Deep Neural Network
  • 12306模擬登陸、驗證碼破解,Python資深大牛深度分析,純乾貨!
    全文都是Python知識乾貨,沒有一句多餘的廢話!
  • 如何使用keras,python和深度學習進行多GPU訓練
    ,第一時間送達在今天文章的其他部分中,我將演示如何使用keras,python和深度學習訓練圖像分類的CNN。MiniGoogLeNet 深度學習框架在做了一些研究後,我發現這張圖片來自張等人2017的文章https://arxiv.org/abs/1611.03530然後我開始在keras和python中應用MiniGoogLe架構——甚至使用python進行計算機視覺深度學習這本書的一部分。
  • 深度學習的中文資源,教程推薦!
    python零基礎開始,推薦廖雪峰python教程,2,3自選《機器學習實戰》入門必備,不難,容易上手,而且可以增加興趣,缺點:理論不夠深入《機器學習》西瓜書,《統計學習方法》理論上的經典,理論詳細又深入,真的值得一看。缺點:有點枯燥,建議結合機器學習實戰。先來代碼,我始終覺得,若理論很枯燥,那先用代碼來提提興趣。