python中的時間處理大總結,python處理總結

來源:互聯網
上載者:User

python中的時間處理大總結,python處理總結
北京 上海巡迴站 | NVIDIA DLI深度學習培訓2018年1月26/1月12日NVIDIA 深度學習學院 帶你快速進入火熱的DL領域
閱讀全文                                                                          >



本文共4858個字,3張圖,預計閱讀時間13分鐘。


python中處理時間的模組有三個,datetime, time,calendar,融匯貫通三個模組,才能隨心所欲地用python處理時間。本文就是為此而寫,文章著重點在於梳理出三個模組的設計脈絡,便於大家記憶裡面的api。在需要的時候能夠去尋找相應的方法。但由於calendar模組使用不多,限於篇幅,本文沒有涉及。

概述



datetime模組主要是用來表示日期的,就是我們常說的年月日時分秒,calendar模組主要是用來表示年月日,是星期幾之類的資訊,time模組主要側重點在時分秒,粗略從功能來看,我們可以認為三者是一個互補的關係,各自專註一塊。方便使用者依據不同的使用目的選用趁手的模組。

從time模組說起



為了學習time模組,我們需要Crowdsourced Security Testing道幾個與時間相關的概念:


1、epoch


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


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這個基準的基準,我們就可以精確地表示一個時間了。


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+08 EDT, M4.1.0,M10.5.0


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


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


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


4、時間的表示、擷取、轉換


time模組中擷取時間的基本方法是


t = time.time()


它返回的是從epoch到現在的秒數(用浮點數表示),用的是UTC時間。


我們自然而然地想把這個秒數轉為年月日時分秒的形式,而這種轉換又分兩種,一種還是用UTC時間,一種用我們所在時區進行調整後的時間。


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


time. gmtime(t)

time.localtime(t)


二者都返回一個類struct_time的執行個體,該執行個體具有如下屬性:


圖片發自簡書App


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


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


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


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


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


也就是說mktime方法會先找到系統中的時區和DST資訊,並利用這個資訊對struct_time進行調整後再換算成秒數。


另一種常見的需求是在時間和表示時間的字串之間進行轉換。


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


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

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

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


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


關於怎麼格式化時間,是很簡單的知識,這裡就借用官網文檔的內容了。


圖片發自簡書App


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


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


Sun Jun 20 23:21:05 1993


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


以上就是time模組的核心內容,我嘗試用一個口訣協助記憶這些API。


time點time得秒數


傳入gm, local time得struct_time

要想變回原秒數

你得傳回calendar.timegm和time. mktime

string f和string p

格式化時間靠哥倆

你要還是嫌費事

asctime ,ctime來助力

專門幫你轉字串

前者接收struct_time

後者專門處理秒數

分工合作不費力

學好time模組基本功

做個時間的明白人!


下面,我們要開始學習datetime模組。


datatime模組


1、概述


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


簡單說,該模組核心的類就三個,date類表示年月日,time類表示時分秒毫秒,這裡不要和time模組搞混淆了。一句順口溜可以協助記清這個情況:


time裡面沒time

藏在datetime裡

編的是不是不咋地?嗯,我也這麼覺得。

datetime類就是date和time的組合。


有一點需要提前說明一下,time類和datetime類都有一個屬性,它的值是一個tzinfo對象,裡麵包含了該time或者datetime的時區資訊,一般稱這個time或者datetime對象是aware的,它能夠準確換算成自epoch開始的秒數。


如果該屬性設定為None,那麼,這時的time對象或者datetime對象就沒有時區資訊,具體它表示的是local time還是utc time,需要我們自己在程式中去決定。


這裡我們所說的local time是指我們所在時區的時間, utc time指的就是國際標準時間,也就是格林尼治時間。下文同。


請記住一點,date中是沒有時區資訊的。


2、從建立datatime開始


建立datetime對象,我最常用的辦法如下:


dt=datetime.datetime.fromtimestamp(time.time())


以上,time.time()獲得自epoch開始的秒數,fromtimestamp方法會將這個秒數轉變成一個datetime對象。


這裡有一個問題,這個datetime對象究竟是utc的還是local的?


答案是local的,這是該方法的預設行為。如果你在fromtimestamp方法中傳入一個表示時區的參數,即tzinfo對象,就會按傳入的時區資訊進行轉換。


獲得表示當前local時間的datetime對象,還有兩個簡便方法:


datetime. datetime. now()

datetime. datetime. today()


以上我們得到的都是local的datetime對象,如何獲得utc的datetime對象呢?有兩個辦法:


datetime. datetime. utcfromtimestamp()

datetime. datetime. utcnow()


我們還可以從字串中建立datetime對象,方法為datetime.striptime(date_string, format)


其內部還是先調用的time模組中的striptime方法,擷取struct_time對象,再利用struct_time對象中的年月日時分秒資訊構建datetime對象。


同樣的,datetime類也提供了strftime(),asctime(),ctime()方法,相信不說你也知道是做什麼的了。


datetime類還提供了一個combine方法,用來將一個date對象和一個time對象組合成一個datetime對象。


需要注意的是,datetime模組中出現timestamp時,一般可將其理解成time.time()返回的秒數。


3、data和time的建立


date對象的建立和datetime非常相似,datetime. date. today()

datetime.date.fromtimestamp()都可以建立一個date對象。


當然,你也可以通過構造方法傳入年月日來建立date對象。

相比之下,time對象的建立就很有限,只能通過:


datetime.time([hour[, minute[, second[, microsecond[, tzinfo]]]]])


這個方法建立。


4、以上三個對象的操作和timedelta類


在實際使用中,我們有一大塊需求就是對日期進行比較和加減運算。得益於python的操作符重載能力,python中可以方便地對date對象之間,或者datetime對象之間進行小於(<)比較和減法(-)操作。


注意,這裡僅限於同類對象之間,而且,不包括time對象之間。


兩個date對象作減,或者兩個datetime對象之間作減,差值用一個timedelta對象表示。


同理,一個date 對象或者datetime對象也可以加或者減一個timedelta對象。


一個timedelta對象含有三個屬性:days,seconds, microseconds,days屬性可以取負值,另外兩個屬性都只能是正值。


你可以用total_seconds()方法獲得一個timedelta對象的秒數表示。


兩個timedelta對象之間可加,可減,但不能做大小比較,因為這樣沒什麼意義。


一個timedelta對象還可以與整數相乘,或通過//操作與一個整數相除。


還可以取反,或者用abs函數獲得絕對值。


無總結,不進步



本文的目的不在於詳細說明python處理時間日期的api如何使用,而是想通過一個概覽的形式,讓大家抓住time和datetime模組的設計結構,從而能夠清楚這些模組提供了哪些能力,在需要的時候能夠想起來去用,至於查詳細的api,應該是可以輕鬆解決的。


原文連結:https://www.jianshu.com/p/a035a564b248


查閱更為簡潔方便的分類文章以及最新的課程、產品資訊,請移步至全新呈現的“LeadAI學院官網”:

www.leadai.org


請關注人工智慧LeadAI公眾號,查看更多專業文章

大家都在看

LSTM模型在問答系統中的應用

基於TensorFlow的神經網路解決使用者流失概覽問題

最全常見演算法工程師面試題目整理(一)

最全常見演算法工程師面試題目整理(二)

TensorFlow從1到2 | 第三章 深度學習革命的開端:卷積神經網路

裝飾器 | Python進階編程

今天不如來複習下Python基礎


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.