乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Python datetime 教程:操作時間、日期與時間跨度

       lllsztz 2019-12-14

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

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

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

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

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

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

      • 從日期中獲取每月幾號和星期幾

      • 從日期中獲取小時和分鐘

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

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

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

      • 處理時間差對象 timedelta

      • 比較兩個日期和時間之間的差值

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

      • 時區(qū)處理

      • 使用 Pandas 中的 datetime 對象

        1. 獲取年,月,日,時,分

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

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

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

      Python 的 datetime 類

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

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

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

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

      • timedelta:一個用于操作日期以及測量的時間跨度

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

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

      創(chuàng)建 Date 對象

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

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

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

      從 Date 中提取年份和月份

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

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

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

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

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

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

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

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

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

      你可能還注意到日期后面還跟著時間信息 00:00:00。這是因為我們創(chuàng)建了一個 datetime 對象,必然會包含日期和時間。如果我們在輸傳入的字符串中沒有指明時間,將會用 00:00:00 作為默認(rèn)時間。

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

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


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

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

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

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

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

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

      從 Python 的 Datetime 對象中獲取小時和分鐘

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

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


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

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

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

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

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

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


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

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

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

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


      使用 Timedelta 對象測量時間跨度

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

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

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

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

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

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

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

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

      比較兩個日期和時間之間的差值

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

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

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

      上述代碼,我們?yōu)榱撕唵纹鹨妰H使用了日期 date,同樣也可以使用 datetime 對象做同樣的操作,以獲得包含小時,分鐘和秒的精確量度:


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

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

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

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

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

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

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

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

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

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

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


      處理時區(qū)

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

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

      有了這個模塊,我們在處理包含多個不同時區(qū)的數(shù)據(jù)集會變得簡單很多。

      處理 pandas 中的 Datetime 對象

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

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

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

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

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

      來看一個實際的例子:

      注意,即使我們在字符串中帶有一些復(fù)雜的元素,如 'th' 和 'sep' 而不是指明 'Sep.' 或 'September',pandas 也可以正確的解析該字符串并返回格式化后的日期。

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


      使用 pandas 獲取年,月,日,時,分

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

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

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


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

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


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

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

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


      總結(jié)

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

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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多