日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Python datetime 教程:操作時(shí)間、日期與時(shí)間跨度

 lllsztz 2019-12-14

在 Python 中處理日期和時(shí)間有點(diǎn)麻煩。所幸,Python 提供了一種內(nèi)置的方式來簡(jiǎn)化這種操作:Python 的 Datetime 模塊。

datetime 可以幫助我們識(shí)別并處理與時(shí)間相關(guān)的元素,如日期,小時(shí),分鐘,秒,星期,月份,年份等。它提供了諸如時(shí)區(qū)和夏令時(shí)等很多服務(wù)。還可以處理時(shí)間戳數(shù)據(jù),解析星期幾,每月幾號(hào),以及從字符串格式化日期和時(shí)間等。

簡(jiǎn)而言之,datetime 是 Python 中處理日期和時(shí)間的一大利器。我們現(xiàn)在來深入了解一下。

本節(jié)教程中,我們將會(huì)學(xué)習(xí)很多 datetime 中很多詳細(xì)的方法,包括:

  • 創(chuàng)建日期對(duì)象 Date

  • 從日期中獲取年份和月份

  • 從日期中獲取每月幾號(hào)和星期幾

  • 從日期中獲取小時(shí)和分鐘

  • 從日期中獲取一年中的第幾周

  • 日期對(duì)象轉(zhuǎn)換成時(shí)間戳

  • Unix 時(shí)間戳字符串轉(zhuǎn)換成日期對(duì)象

  • 處理時(shí)間差對(duì)象 timedelta

  • 比較兩個(gè)日期和時(shí)間之間的差值

  • 日期格式化:strftime() 和 strptime()

  • 時(shí)區(qū)處理

  • 使用 Pandas 中的 datetime 對(duì)象

    1. 獲取年,月,日,時(shí),分

    2. 獲取星期幾與一年中的第幾天

    3. 轉(zhuǎn)換日期對(duì)象為 DataFrame 索引

學(xué)習(xí)本教程時(shí),我們建議你在自己的機(jī)器上運(yùn)行一下這些代碼。

Python 的 datetime 類

在編寫代碼之前,有必要先了解一下 datetime 模塊中提供的五個(gè)主要的對(duì)象類。根據(jù)我們具體需要執(zhí)行的操作,我們可能需要使用其中的一個(gè)或多個(gè)類。

  • datatime:允許我們同時(shí)操作時(shí)間和日期(月,日,年,時(shí),秒,微秒)。

  • date:允許我們排除時(shí)間僅操作日期(月,日,年)

  • time:允許我們排除日期僅操作時(shí)間(時(shí),分,秒,微秒)

  • timedelta:一個(gè)用于操作日期以及測(cè)量的時(shí)間跨度

  • tzinfo:一個(gè)用于處理時(shí)區(qū)的抽象類

如果還是不太理解它們之間的區(qū)別,也沒關(guān)系。我們接下來就深入學(xué)習(xí)一下 datetime 的工作方式,來更好地理解和使用它們。

創(chuàng)建 Date 對(duì)象

首先,我們來仔細(xì)看看 datetime 對(duì)象。由于 datetime 既是模塊名也是模塊內(nèi)的類名,所以我們要從 datetime模塊內(nèi)引用 datetime 類。

然后,打印當(dāng)前日期和時(shí)間來查看 datetime 對(duì)象中都包含什么??梢允褂?datetime 類的 .now() 函數(shù)創(chuàng)建一個(gè) datetime 對(duì)象,然后打印這個(gè)對(duì)象,之后再使用 type() 函數(shù)打印這個(gè)對(duì)象的類型。如此,我們可以看到更詳細(xì)的信息。

從上面的結(jié)果中,我們可以看到 datetime_object 是 datetime 類的對(duì)象實(shí)例,對(duì)象中包含了年,月,日,時(shí),分,秒,以及毫秒。

從 Date 中提取年份和月份

我們現(xiàn)在已經(jīng)理解了 datetime 對(duì)象的構(gòu)成,那么我們可以猜一下 date 和 time 對(duì)象是怎樣的。因?yàn)槲覀円呀?jīng)知道 date 對(duì)象可以理解為 datetime 去掉了時(shí)間數(shù)據(jù),而 time 對(duì)象可以理解為 datetime 去掉了日期數(shù)據(jù)。

我們還可以解決很多問題。比如,大多數(shù)數(shù)據(jù)集中,日期和時(shí)間信息是以字符串格式存儲(chǔ)的。另外,我們可能不希望拿到所有的日期和時(shí)間數(shù)據(jù),當(dāng)我們?cè)谧鲆恍┲T如月度銷售分析的時(shí)候,那么將信息分解到毫秒級(jí)別的用處并不大。

現(xiàn)在,我們來聚焦于數(shù)據(jù)科學(xué)中的一項(xiàng)常見任務(wù):使用 datetime 從字符串中提取我們實(shí)際想要的元素。

為了實(shí)現(xiàn)這個(gè)目的,我們還需要做一些其他的工作。

使用 strptime() 和 strftime() 處理日期和時(shí)間字符串

幸運(yùn)的是,datetime 提供了兩個(gè)方法,strptime() 和 strftime(),可以在字符串與 datetime 對(duì)象之間互相轉(zhuǎn)換。strptime() 可以讀取字符串中的日期與時(shí)間信息并將其轉(zhuǎn)換為 datetime 對(duì)象,而 strftime 則是將 datetime 對(duì)象轉(zhuǎn)換為字符串。

當(dāng)然,strptime() 并沒有魔法,它不能將任意字符串轉(zhuǎn)換為日期和時(shí)間,它需要一些人為地幫助,來解釋它究竟識(shí)別到了什么。但是它只能識(shí)別大多數(shù)常規(guī)的日期和時(shí)間字符串格式(詳情請(qǐng)查閱文檔)。我們現(xiàn)在給定一個(gè)日期格式字符串 'YYYY-MM-DD',來看看 strptime() 方法能做什么。

可以看到 strptime() 方法接收兩個(gè)參數(shù):字符串 my_string 以及 '%Y-%m-%d',多出來的這個(gè)字符串告訴 strptime() 方法如何解釋傳入的字符串 my_string。比如,'%Y' 表示期望從字符串的前四個(gè)字符中讀取年份。

這篇文檔中完整地列出了這些可匹配的模式,我們將在教程后面的部分詳細(xì)介紹這些方法。

你可能還注意到日期后面還跟著時(shí)間信息 00:00:00。這是因?yàn)槲覀儎?chuàng)建了一個(gè) datetime 對(duì)象,必然會(huì)包含日期和時(shí)間。如果我們?cè)谳攤魅氲淖址袥]有指明時(shí)間,將會(huì)用 00:00:00 作為默認(rèn)時(shí)間。

>>> 今日簽到口令:9nad <<<

先不論其他,我們希望的是從日期中分離出特定的元素用于分析。一個(gè)辦法是使用 datetime 對(duì)象內(nèi)置的類屬性,如 .month 或 .year。


從 Date 獲取每月的某天和一周的某天

我們現(xiàn)在來提取更多的信息,這也確實(shí)是一個(gè)常見的任務(wù)。此時(shí),我們將嘗試從 my_date 對(duì)象中獲取月份中某一天以及年份中的某一天。通過 datetime 對(duì)象的 .weekday() 函數(shù)可以得到一個(gè)星期幾的數(shù)字,但是我們可以通過使用 calendar 模塊中的 day_name 方法將其轉(zhuǎn)化為文本格式(如,Monday,Tuesday,Wednesday 等等)。

我們首先會(huì)導(dǎo)入 calendar,之后會(huì)用到 my_date 對(duì)象的 .day 屬性以及 .weekday() 方法。這樣我們就可以獲取到星期幾的文本格式:

先等一下,這里看起來有一點(diǎn)奇怪。一周的第三天應(yīng)該是 Wednesday 而不是 Thursday 啊。

我們這里使用一個(gè)循環(huán)來仔細(xì)看一下 day_name 變量中的信息:

現(xiàn)在我們知道 Python 中星期是從 Monday 開始的,其計(jì)數(shù)下標(biāo)則是從 0 開始而不是從 1 開始。所以這就解釋了我們上面看到的為什么數(shù)字 3 轉(zhuǎn)換成了 'Thursday'。

從 Python 的 Datetime 對(duì)象中獲取小時(shí)和分鐘

我們現(xiàn)在來關(guān)注一下時(shí)間以及從 datetime 對(duì)象中提取小時(shí)和分鐘。與上面我們處理月份和年份相似,我們可以使用類屬性 .hour 和 .minute 獲取到一天中小時(shí)與分鐘信息。

使用 .now() 函數(shù)來設(shè)置一個(gè)新的日期和時(shí)間。當(dāng)寫到這里的時(shí)候,時(shí)間是 2019 年 10 月 25 日上午 10 點(diǎn) 25 分。當(dāng)然,根據(jù)你運(yùn)行這段代碼的時(shí)間,結(jié)果可能與之不同。


從 Datetime 對(duì)象中獲取一年中的星期數(shù)

我們還可以使用 datetime 做很多有趣的事。例如,我們可能想知道現(xiàn)在是一年中的第幾個(gè)星期。

使用 datetime 對(duì)象的 isocalendar 函數(shù),我們可以獲取到年份,一年中的星期數(shù),和一周中的第幾天。

特別注意,isocalendar 返回的是帶有 ISO 年份,星期數(shù)和工作日的元組。這個(gè) ISO 日歷是基于格里高利歷的一種被廣泛使用的標(biāo)準(zhǔn)日歷。你可以點(diǎn)擊鏈接了解更多詳細(xì)信息。但是出于我們現(xiàn)在的目的,我們只需要知道它是作為一種常規(guī)日歷,且每星期是從星期一開始的就可以了。

注意,在 ISO 日歷中,每星期是從 1 開始計(jì)數(shù)的,所以這里的 5 真正表示的是星期五:Friday。

從上面我們可以看到當(dāng)前是今天的第 43 個(gè)星期,但是如果你只想獲得這個(gè)數(shù)字,可以像其他 Python 中的列表或元組一樣,使用下標(biāo)索引的方式實(shí)現(xiàn):


將 Date 對(duì)象轉(zhuǎn)換為 Unix 時(shí)間戳,反之亦然

編程的時(shí)候,會(huì)經(jīng)常遇到使用時(shí)間戳格式存儲(chǔ)的時(shí)間和日期,或者希望以 Unix 時(shí)間戳格式存儲(chǔ)你的數(shù)據(jù)。

我們可以使用 datetime 的內(nèi)置函數(shù) timestamp(),他可以接收一個(gè) datetime 對(duì)象作為參數(shù)并返回一個(gè)時(shí)間戳格式的日期和時(shí)間:

與之相似,我們可以使用 fromtimestamp() 執(zhí)行與上面相反的操作。這是 datetime 類中提供的一個(gè)方法,可以接收一個(gè)(浮點(diǎn)型格式的)時(shí)間戳作為參數(shù),并返回一個(gè) datetime 對(duì)象,像下面這樣:


使用 Timedelta 對(duì)象測(cè)量時(shí)間跨度

很多時(shí)候,我們可能希望使用 Python 中的 datetime 來測(cè)量一段時(shí)間跨度,或者一段持續(xù)的時(shí)間。這個(gè)可以使用 datetime 內(nèi)置的 timedelta 類。一個(gè) timedelta 對(duì)象可以表示兩個(gè)日期或時(shí)間的差值。有了這個(gè)我們就可以測(cè)量時(shí)間跨度,或者對(duì)日期及時(shí)間進(jìn)行加減操作等。

將所有參數(shù)置為 0 即可創(chuàng)建一個(gè)默認(rèn)的 timedelta 對(duì)象?,F(xiàn)在我們來創(chuàng)建一個(gè)時(shí)間跨度為兩周的 timedelta 對(duì)象:

注意,這里我們使用 timedelta 類的 .days 屬性來獲取以天為單位的持續(xù)時(shí)間。參照文檔,我們還可以獲取以秒和毫秒為單位的持續(xù)時(shí)間。

現(xiàn)在創(chuàng)建另一個(gè) timedelta 持續(xù)時(shí)間再練習(xí)一下:

現(xiàn)在我們結(jié)合使用 datetime 對(duì)象和 timedelta 對(duì)象來做一些數(shù)學(xué)計(jì)算。比如說在當(dāng)前日期和時(shí)間上加上一些不同的時(shí)間跨度,來看看十五天后的日期,或者是兩周前是哪天。

為此,我們可以使用運(yùn)算符 + 或 - 來對(duì) datetime 對(duì)象增加或減去 timedelta 對(duì)象實(shí)現(xiàn)。得到的結(jié)果是 datetime 加上或減去 timedelta 對(duì)象所代表的的時(shí)間跨度后的新時(shí)間。是不是很棒?

(注意:在下面的代碼中,時(shí)間是 10 月 25 日 11:12。這可能與你實(shí)際使用 .now() 函數(shù)得到的 datetime 對(duì)象有所不同。)

注意,這里計(jì)算后輸出的結(jié)果仍然是一個(gè) datetime 對(duì)象。

比較兩個(gè)日期和時(shí)間之間的差值

與上面的操作類似,我們還可以使用 datetime 來為一個(gè)日期加上或減去另一個(gè)日期,來得到一個(gè)時(shí)間跨度。

由于計(jì)算的結(jié)果是一個(gè)時(shí)間片,當(dāng)我們對(duì)一個(gè)日期對(duì)象減去另一個(gè)日期對(duì)象得到的就是一個(gè) timedelta 對(duì)象。

這里,我們創(chuàng)建了兩個(gè)日期對(duì)象(注意,它們與 datetime 對(duì)象相比,除了不包含時(shí)間信息,其他都是一樣的),并且讓其中一個(gè)減去另一個(gè)得到一個(gè)時(shí)間跨度。

上述代碼,我們?yōu)榱撕?jiǎn)單起見僅使用了日期 date,同樣也可以使用 datetime 對(duì)象做同樣的操作,以獲得包含小時(shí),分鐘和秒的精確量度:


格式化日期:有關(guān) strftime() 和 strptime() 的更多信息

我們先前已經(jīng)簡(jiǎn)單地了解了 strftime() 和strptime() 對(duì)象,現(xiàn)在來仔細(xì)看一下這些方法,因?yàn)樗鼈儗?duì)于 Python 中處理數(shù)據(jù)分析通常比較重要。

我們已經(jīng)使用過 strptime() 方法,你可以將一個(gè)格式化后的日期和時(shí)間轉(zhuǎn)換為一個(gè) datetime 對(duì)象,函數(shù)格式如下:

注意這里有兩個(gè)參數(shù):

  • string:格式化后待轉(zhuǎn)化的字符串

  • format:指定時(shí)間字符串的格式,以便 strptime() 可以正確解析

現(xiàn)在來試著轉(zhuǎn)換一個(gè)其他類型的日期字符串。這個(gè)網(wǎng)站提供了很多非常有用的參考說明,有助于 strptime() 識(shí)別我們輸入的字符串:

現(xiàn)在來做一些更高級(jí)的操作,驗(yàn)證一下目前所學(xué)。以一個(gè)格式化后的字符串開始,將其轉(zhuǎn)換為 datetime 對(duì)象,并且看看不同的格式化方式(dd/mm 和 mm/dd)得到的結(jié)果。

然后,基于 mm/dd 的格式,我們將其轉(zhuǎn)換為 Unix 時(shí)間戳。之后轉(zhuǎn)回 datetime 對(duì)象,再使用幾種不同的 strftime 模式將轉(zhuǎn)換后的字符串輸出:

這里有一張圖片,可以保存在你常用的備忘錄中,里面是常用的 strftime() 和 strptime() 模式:

現(xiàn)在使用上面的模式做一些簡(jiǎn)單的實(shí)踐:


處理時(shí)區(qū)

在 Python 中,如果涉及時(shí)區(qū)的話,處理日期和實(shí)踐就會(huì)變得很復(fù)雜。幸好,pytz 模塊的存在為我們提供了跨時(shí)區(qū)轉(zhuǎn)換的能力,它還可以在使用夏令時(shí)的地區(qū)處理夏令時(shí)。

我們可以通過 localize 函數(shù)為 Python 中的 datetime 對(duì)象加上一個(gè)時(shí)區(qū)信息。然后可以用 astimezone() 將一個(gè)已有時(shí)區(qū)轉(zhuǎn)換為另一個(gè)指定的時(shí)區(qū)(這個(gè)函數(shù)接收一個(gè)我們期望轉(zhuǎn)換的時(shí)區(qū)作為參數(shù))。

有了這個(gè)模塊,我們?cè)谔幚戆鄠€(gè)不同時(shí)區(qū)的數(shù)據(jù)集會(huì)變得簡(jiǎn)單很多。

處理 pandas 中的 Datetime 對(duì)象

數(shù)據(jù)科學(xué)家熱衷于 pandas 有很多原因。其中之一是它包含了多種用于處理時(shí)間序列數(shù)據(jù)的功能。拿 datetime 自身來說,pandas 中就有 datetime 和 timedelta 對(duì)象分別表示日期和時(shí)間以及時(shí)間片。

我們將日期,時(shí)間和時(shí)間片字符串通過以下函數(shù)轉(zhuǎn)換為 pandas 中的 datetime 對(duì)象。

  • to_datetime() :將日期字符串轉(zhuǎn)換為 Python 中的 datetime對(duì)象。

  • to_timedelta() :找出以天,小時(shí),分鐘或秒為單位的時(shí)間差值。

可以預(yù)見,這些函數(shù)都很善長(zhǎng)將字符串轉(zhuǎn)換為 Python 中的 datetime 對(duì)象,而且可以自動(dòng)識(shí)別它們的格式,而不需要我們定義 strftime 模式。

來看一個(gè)實(shí)際的例子:

注意,即使我們?cè)谧址袔в幸恍?fù)雜的元素,如 'th' 和 'sep' 而不是指明 'Sep.' 或 'September',pandas 也可以正確的解析該字符串并返回格式化后的日期。

我們還可以通過 pandas(以及一些與之相關(guān)的 numpy 的功能) 自動(dòng)創(chuàng)建一段范圍內(nèi)的 pandas 對(duì)象序列。比如下面這樣,我們從上面定義的日期開始,創(chuàng)建了一系列十二個(gè)日期。然后又用 pd.date_range() 函數(shù)創(chuàng)建了另外一系列日期:


使用 pandas 獲取年,月,日,時(shí),分

對(duì) pandas 的 DataFrame 中每一列使用 dt 屬性,我們能夠輕易地從日期中獲取年,月,日,時(shí),或分。比如,我們可以使用 df['date'].dt.year 從一個(gè)包含完整日期信息的 pandas 數(shù)據(jù)列中單獨(dú)解析出年份。

為了方便理解,我們利用上面已經(jīng)創(chuàng)建的一個(gè)序列快速實(shí)現(xiàn)一個(gè) DateFrame:

現(xiàn)在使用 Python 中 datetime(通過 dt) 相關(guān)的屬性為日期的每個(gè)元素創(chuàng)建一個(gè)單獨(dú)的列:


獲取星期幾和一年中的某天

Pandas 還可以從 datetime 對(duì)象中獲取其他的一些元素,比如說星期幾和一年中的某一天。這些同樣可以用 dt屬性來實(shí)現(xiàn)。這里注意一點(diǎn),Python 中通常每周從周一開始,而下表是 0 ,所以星期的數(shù)字 5 表示周六。


將 Date 對(duì)象轉(zhuǎn)換成 DateFrame 索引

我們還可以在 pandas 中將一個(gè) datetime 的列寫入 DateFrame 的索引中。這對(duì)于處理一些數(shù)據(jù)可視化的任務(wù)很有用,matplotlib 可以識(shí)別出 DateFrame 的索引列是一個(gè)時(shí)間序列,然后繪制相應(yīng)的數(shù)據(jù)。

為了實(shí)現(xiàn)這一點(diǎn),我們需要重新定義 df.index :


總結(jié)

本教程中,我們深入討論了 Python 中的 datetime,并且還學(xué)習(xí)了 pandas 及其 calendar 模塊的一些知識(shí)。我們已經(jīng)介紹了很多東西,不過要記住:最好的學(xué)習(xí)方式是親自動(dòng)手寫代碼。

英文原文:https://www./blog/python-datetime-tutorial/ 
譯者:居老師的龍尾巴

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多