【Python基礎】13個知識點,系統整理Python時間處理模塊Datetime

2021-01-18 機器學習初學者
前言

在用 Python 進行數據處理,尤其是時間序列數據的處理,經常會涉及處理時間或日期的地方,有些看似簡單的問題,經常會混淆,甚至被困住。

本文分享的內容來自 Lemon 整理的《Python時間使用指南》,完整版的可以在公眾號 「檸檬數據」獲取。

首先要介紹的,是大家平時用的較多的 datetime 模塊,它屬於 Python 的內置模塊,功能相對較全。

針對 Datetime 模塊, 《Python時間使用指南》從構建時間對象實例、時間轉換、時間對象的運算三個方面進行了梳理,共涉及 13 個知識點,整理的大綱如下:

datetime構建時間對象實例
import datetime
# from datetime import date, datetime,time,timedelta,tzinfo
import time

時間實例的構造包括 日期(如 2020年10月12日),時間(如 20點10分01秒),或者是包含 date 和 time 的 datetime (如 2020年10月12日20點10分01秒),下面 Lemon 來跟大家介紹下具體的構造過程。

日期(date)實例的構造

date 是一個理想化的簡單型日期,屬性有 year , month , day 。

# 構造日期 date 實例
d1 = datetime.date(2020,10,12)
d1

datetime.date(2020, 10, 12)

# 構造日期 date 實例
d1 = datetime.date(2020,10,12)
print(d1)

2020-10-12

除了上面的構造方式,在 date 實例化的時候,還可以通過 date.today() 來構造當天的日期。

datetime.date.today()

datetime.date(2020, 10, 14)

date 類型的日期,可以通過 .year , .month , .day 來獲取日期所屬的 年份,月份,和具體的日期號,這幾個方法在數據分析中經常會用到。

# 獲取日期所屬的 年份,月份,和具體的日期號

print(f'日期所屬的年份為:{d1.year}')
print(f'日期所屬的月份為:{d1.month}')
print(f'日期具體的日期號為:{d1.day}')

日期所屬的年份為:2020
日期所屬的月份為:10
日期具體的日期號為:12

時間 time 實例的構造

time 是一個獨立於任何特定日期的理想化時間,其屬性有 hour,minute, second , microsecond 和 tzinfo 。

# 構造時間 time 實例
t1 = datetime.time(20,10,1)
t1

datetime.time(20, 10, 1)

# 獲取日期所屬的 年份,月份,和具體的日期號

print(f'time 所屬的小時為:{t1.hour}')
print(f'time 所屬的分鐘為:{t1.minute}')
print(f'time 所屬的秒為:{t1.second}')

time 所屬的小時為:20
time 所屬的分鐘為:10
time 所屬的秒為:1

datetime 實例的構造

datetime 是日期和時間的結合,其屬性有 year,month,day,hour,minute, second , microsecond 和 tzinfo 。

# 構造時間 datetime 實例
dt1 = datetime.datetime(2020,10,11,20,10,1)
dt1

datetime.datetime(2020, 10, 11, 20, 10, 1)

除了上面的構造方式,在 datetime 實例化的時候,還有其他的一些方式,包括使用 datetime.now() 和 datetime.today(),以及在 date 的基礎上使用 combine 方法等。

dt2 = datetime.datetime.now()
dt2

datetime.datetime(2020, 10, 14, 15, 12, 20, 303269)

dt3 = datetime.datetime.today()
dt3

datetime.datetime(2020, 10, 14, 15, 12, 20, 308733)

dt4 = datetime.datetime.combine(d1,t1)
dt4

datetime.datetime(2020, 10, 12, 20, 10, 1)

通過 datetime 的實例化,是我們使用時間是經常用到的方法,在日常使用過程中,我們可能只需要具體到某天,或者只需要具體到某天的某個時間點,這時候,也可以通過 datetime 的一些方法來實現。

# 從 datetime 來獲取日期
dt4.date()

datetime.date(2020, 10, 12)

# 從 datetime 來獲取具體的時間點
dt4.time()

datetime.time(20, 10, 1)

同樣的 datetime 類型的時間,可以通過 .year , .month , .day 來獲取日期所屬的 年份,月份,和具體的日期號。

# 獲取日期所屬的 年份,月份,和具體的日期號

print(f'日期所屬的年份為:{dt4.year}')
print(f'日期所屬的月份為:{dt4.month}')
print(f'日期具體的日期號為:{dt4.day}')

日期所屬的年份為:2020
日期所屬的月份為:10
日期具體的日期號為:12

還有一個可能涉及到的時間是獲取某天屬於星期幾,可以通過 weekday() 和 isoweekday() 方法來實現。

# 從 datetime 來獲取日期是星期幾
# 使用 weekday 方法
# 數字從0開始,0代表星期一,1代表星期二,以此類推
dt4.weekday()

0

# 從 datetime 來獲取日期是星期幾
# 使用 isoweekday 方法
# 數字從1開始,1代表星期一,2代表星期二,以此類推
dt4.isoweekday()

1

datetime 還有一種方法,在這裡也值得介紹下,如果 datetime 的值由於某些原因弄錯了,我們也可以通過 replace() 方法來進行更正。這個方法在進行數據清洗的時候會有用。

replace 方法的參數如下:

datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, * fold=0)

dt5 = dt4.replace(year=2019)
dt5

datetime.datetime(2019, 10, 12, 20, 10, 1)

timedelta 對象的構造

timedelta 對象表示兩個 date 或者 time 或者 datetime 的時間間隔。

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

所有參數都是可選的並且默認為 0。這些參數可以是整數或者浮點數,也可以是正數或者負數。

只有 days, seconds 和 microseconds 會存儲在內部。參數單位的換算規則如下:

delta = datetime.timedelta(weeks=3,
                  days=10,
                  hours=6,
                  minutes=50,
                  seconds=30,
                  microseconds=1000,
                  milliseconds=10000,
                 )

delta

datetime.timedelta(days=31, seconds=24640, microseconds=1000)

tzinfo 介紹

datetime.tzinfo 返回 datetime 對象的時區,前提是在創建 datetime 對象時需傳入 tzinfo 參數,如果沒有傳入則返回值為 None 。

# 如果沒有 pytz 庫,則需要自行安裝
import pytz

sh = pytz.timezone('Asia/Shanghai')
d_tz = datetime.datetime(2020,10,12,hour=8,tzinfo=sh)

d_tz.tzinfo

<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>

時間轉換

時間的三種存在方式:時間對象,時間字符串,時間戳。

時間對象,比如前面介紹的 date 、 datetime 、 time 對象等;時間字符串,如:"2020-10-12";時間戳,如 time.time() 返回的就是時間戳。

在數據處理過程中,經常會遇到需要將不同形式的時間進行轉換。這裡給大家介紹下常用的方法:

時間對象轉字符串

時間對象轉換為字符串,可以通過 isoformat 或 strftime 方法來實現。

strftime 的英文全稱是 str format time ,根據給定的格式將時間對象轉換為字符串

# 將 date 時間對象轉換為字符串
d1 = datetime.date(2020,10,12)
d1.isoformat()

'2020-10-12'

# 用 srtftime 來轉換
# YYYY-MM-DD 形式
d1.strftime('%Y-%m-%d')

'2020-10-12'

# MM DD,YYYY 形式
d1.strftime('%b %d,%Y')

'Oct 12,2020'

# 將 time 時間對象轉換為字符串
t1 = datetime.time(20,10,1)
t1.strftime('%H:%M:%S')

'20:10:01'

# 將 datetime 時間對象轉換為字符串
dt2 = datetime.datetime.now()
dt2.strftime('%Y-%m-%d %H:%M:%S')

'2020-10-14 15:12:20'

dt2.isoformat()

'2020-10-14T15:12:20.403113'

python 中常見的時間日期格式化符號:

指令意義示例%a當地工作日的縮寫。Sun, Mon, ..., Sat (en_US);So, Mo, ..., Sa (de_DE)%A本地化的星期中每日的完整名稱。Sunday, Monday, ..., Saturday (en_US);Sonntag, Montag, ..., Samstag (de_DE)%w以十進位數顯示的工作日,其中0表示星期日,6表示星期六。0, 1, ..., 6%d補零後,以十進位數顯示的月份中的一天。01, 02, ..., 31%b當地月份的縮寫。Jan, Feb, ..., Dec (en_US);Jan, Feb, ..., Dez (de_DE)%B本地化的月份全名。January, February, ..., December (en_US);Januar, Februar, ..., Dezember (de_DE)%m補零後,以十進位數顯示的月份。01, 02, ..., 12%y補零後,以十進位數表示的,不帶世紀的年份。00, 01, ..., 99%Y十進位數表示的帶世紀的年份。0001, 0002, ..., 2013, 2014, ..., 9998, 9999%H以補零後的十進位數表示的小時(24 小時制)。00, 01, ..., 23%I以補零後的十進位數表示的小時(12 小時制)。01, 02, ..., 12%p本地化的 AM 或 PM 。AM, PM (en_US);am, pm (de_DE)%M補零後,以十進位數顯示的分鐘。00, 01, ..., 59%S補零後,以十進位數顯示的秒。00, 01, ..., 59%f以十進位數表示的微秒,在左側補零。000000, 000001, ..., 999999%zUTC 偏移量,格式為 ±HHMM[SS[.ffffff]] (如果是簡單型對象則為空字符串)。(空), +0000, -0400, +1030, +063415, -030712.345216%Z時區名稱(如果對象為簡單型則為空字符串)。(空), UTC, GMT%j以補零後的十進位數表示的一年中的日序號。001, 002, ..., 366%U以補零後的十進位數表示的一年中的周序號(星期日作為每周的第一天)。在新的一年中第一個星期日之前的所有日子都被視為是在第 0 周。00, 01, ..., 53%W以十進位數表示的一年中的周序號(星期一作為每周的第一天)。在新的一年中第一個第期一之前的所有日子都被視為是在第 0 周。00, 01, ..., 53%c本地化的適當日期和時間表示。Tue Aug 16 21:30:00 1988 (en_US);Di 16 Aug 21:30:00 1988 (de_DE)%x本地化的適當日期表示。08/16/88 (None);08/16/1988 (en_US);16.08.1988 (de_DE)%X本地化的適當時間表示。21:30:00 (en_US);21:30:00 (de_DE)%%字面的 '%' 字符。%字符串轉時間對象

字符串轉時間對象,用的是 strptime 方法,與 strftime 方法剛好相反。

strptime 的英文全稱是 str parse time ,將字符串解析為給定相應格式的時間對象。

s1 = '2020-10-09'
d = datetime.datetime.strptime(s1,'%Y-%m-%d')
d

datetime.datetime(2020, 10, 9, 0, 0)

下面提供了 strftime 方法與 strptime 方法的比較:


strftimestrptime用法根據給定的格式將對象轉換為字符串將字符串解析為給定相應格式的 datetime對象方法類型實例方法類方法方法date; datetime; timedatetime籤名strftime(format)strptime(date_string, format)

需要注意的是,strftime 方法可供 date、time 和 datetime 對象使用,而 strptime 方法僅供 datetime 對象使用。

時間戳轉換為時間對象

時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。

# 獲取當前的時間戳
ts_1 = time.time()
ts_1

1602660751.071785

# 獲取當天00:00:00的時間戳
ts_2 = int(time.time()/86400)*86400
ts_2

1602633600

# 獲取當天23:59:59的時間戳
# 一天有 24*60*60 =  86400 秒
ts_3 = int(time.time()/86400)*86400+86400-1
ts_3

1602719999

# 將時間戳轉換為時間對象
datetime.datetime.fromtimestamp(ts_1)

datetime.datetime(2020, 10, 14, 15, 32, 31, 71785)

# 將時間戳轉換為時間對象
datetime.date.fromtimestamp(ts_1)

datetime.date(2020, 10, 14)

將時間對象轉換為時間戳

鑑於,時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。

因此,將時間對象轉換為時間戳時,直接計算兩個時間對象的 timedelta ,並將timedelta 以 「秒」 來表示就可以了。

dt1

datetime.datetime(2020, 10, 11, 20, 10, 1)

# 注意這裡要用 北京時間
dt_s = datetime.datetime(1970,1,1,8)
dt_s

datetime.datetime(1970, 1, 1, 8, 0)

timedelta_1 = dt1 -dt_s
# 返回時間間隔包含了多少秒
timedelta_s = timedelta_1.total_seconds()
timedelta_s

1602418201.0

這裡我們來反推下,看我們將時間對象轉換為時間戳,是否正確。

# 將時間戳轉換為時間對象
datetime.datetime.fromtimestamp(timedelta_s)

datetime.datetime(2020, 10, 11, 20, 10, 1)

時間對象的運算獲取當天最小時間和最大時間
# 獲取當天最小時間
datetime.datetime.combine(datetime.date.today(),datetime.time.min)

datetime.datetime(2020, 10, 14, 0, 0)

# 獲取當天最大時間
datetime.datetime.combine(datetime.date.today(),datetime.time.max)

datetime.datetime(2020, 10, 14, 23, 59, 59, 999999)

獲取當前日期的前幾天/後幾天
# 獲取明天
datetime.date.today() + datetime.timedelta(days=1)

datetime.date(2020, 10, 15)

# 獲取明天
datetime.date.today() - datetime.timedelta(days=1)

datetime.date(2020, 10, 13)

獲取本周或本月第一天及最後一天
d_today = datetime.date.today()
d_today

datetime.date(2020, 10, 14)

# 獲取本周第一天
d_today - datetime.timedelta(d_today.weekday())

datetime.date(2020, 10, 12)

# 獲取本周最後一天
d_today + datetime.timedelta(6-d_today.weekday())

datetime.date(2020, 10, 18)

計算兩個日期相差多少天
# timedelta 對象的計算
td1 = dt2 - dt1
td1

datetime.timedelta(days=2, seconds=68539, microseconds=403113)

td1.days

2

注意下,如果需要計算兩個日期之間總共相差多少秒,應該用 total_seconds() 方法。

td1.seconds

68539

td1.total_seconds()

241339.403113

參考文檔:

https://docs.python.org/zh-cn/3/library/datetime.html#strftime-strptime-behaviorhttps://segmentfault.com/a/1190000012112097https://blog.csdn.net/qq_34493908/article/details/80888052https://zhuanlan.zhihu.com/p/96384066


相關焦點

  • python基礎系列|示例講解時間模塊datetime
    Python 有很多種方式處理日期和時間,常見的時間處理的模塊是datetime、time、calendar。能融匯貫通的了解和使用這三個模塊,才能輕而易舉地用python處理時間。本文以此為目的,通過講述各個時間模塊的概述、函數及相關知識細節、以及相應的示例來講透它們的使用方式。
  • Python時間模塊(筆記)
    「關於python處理時間常用的庫,分別是time、datetime、calendar這三個庫,以下是整理總結的常用方法:1、time庫# 獲取本地時間戳,返回浮點數print(time.time()) # 1590921425.7660675# 獲取結構化時間,time.gmtime(時間戳),不傳參默認當前 UTC時間print(time.gmtime
  • python時間序列:日期和時間數據
    實驗或過程時間,每個時間點都是相對於特定起始時間的一個度量。例如,從放入烤箱起,每秒鐘餅乾的直徑。Pandas提供了一組標準的時間序列處理工具和數據算法。因此,可以高效處理非常大的時間序列,輕鬆地進行切片/切塊、聚合、對定期/不定期的時間序列進行重採樣等。
  • Python入門小迷宮,走完這個迷宮,就能掌握python編程基礎
    這是一個很神奇的迷宮,走完這個迷宮就能掌握python基礎。其實,這是一個用python做的迷宮小遊戲,非常簡單,但對於python初學者來說,還是有一定的挑戰性,但TONOW有源碼和教程,只要跟著python迷宮小遊戲的教程和相應的源碼,不僅很容易就能自己開發出這個遊戲,還能在這個過程中,掌握python編程的基礎哦!
  • 13個小案例輕鬆認識python
    python流行一段時間了,開始的就感覺只是一種新的語言罷了,可是這個世界總是對新事物非常尊崇,平時用的不多,看起來也沒多大動力,結合著平時講VB(信息技術《算法與程序設計》9講)的套路,用案例簡單自學下python,這13個小案例不像網絡上的圖形處理等那麼酷炫,不能做出酷炫的作品,也沒有涉及基礎的算法,但也是python的基礎吧
  • Python利用openpyxl處理excel文件(openpyxl的安裝及簡介)
    $B$3:$A$30000, 1, FALSE), " ", ""),"")), ""),我相信大多數人要想理解這個公式,是很需要一段時間的,面對這種繁雜的公式,一般人肯定是力不從心的。但是試想,如果把上述excel公式變成諸如python中的if-else結構,其可讀性肯定是不容置疑的……今天,我們來介紹一款excel處理利器—openpyxl(python庫文件)。
  • python sys模塊的常見用法匯總
    python的內置模塊sys,提供了系統相關的一些變量和函數,在實際開發中,常見的有以下幾種用法1.6. sys.path該變量存儲了python尋找模塊的路徑>可以在代碼中動態修改sys.path列表中的元素,已達到成功導入某個模塊的目的。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    (6套課程) 注:零基礎全能篇中,針對windows和liunx系統均有兩套課程可供選擇學習,單純學python,哪個系統都一樣,初學者只需選擇自己熟悉的系統學習相應課程即可。基於liunx系統的python教程,課程裡也有liunx操作的詳細教學,不用擔心學習時不會操作liunx系統。
  • python日期和時間的操作方法匯總
    在python的內置模塊中,時間與日期相關的有以下3個datatimetimecalendar在實際開發中,處理日期和時間主要有以下時區,不同國家,地區之間存在時差,為了方便換算,規定格林尼治天文臺為中時區,依次為零點,每15經度定義一個時區,每個時區時差為1小時,全球共劃分為24個時區夏令時,英文縮寫為DST,是一種人為規定的時間制度,在夏季將時間調快1小時,以達到早睡早起,節約能源的目的,在秋冬季的某一天再將時間調整回來
  • 三分鐘從入門到精通——Python模塊
    中的模塊:假設您正在使用python解釋器。因此,python有一種方法可以將該函數定義放入文件中並隨時使用。模塊是ModuleType類型的對象。該模塊基本上是一個python文件(擴展名為的文件.py),其中包含定義和語句(例如:類,函數,變量等)。Python中的模塊為我們提供了邏輯上組織代碼的靈活性。我們使用模塊將大型程序分解為小的可管理文件。
  • 利用Python的PIL圖像處理庫對圖片批量加水印
    在圖處處理之前必須Python的PIL圖像處理庫。第一步:安裝PIL庫打開命令窗口輸入pip install pillow等安裝結束。from PIL import Imagefrom PIL import ImageDrawfrom PIL import ImageFontimport datetime #獲取當前日期和時間import
  • 科悟學院介紹什麼是Python、python能做什麼?
    常見的,我們用Python來進行web開發、計算和數據統計、數據分析與整理、人工智慧、軟體開發、網絡爬蟲等領域。凡是需要重複勞動的工作我們都可以使用Python來輔助我們完成工作。Python編輯器安裝?
  • 廣州Python測試培訓
    基礎編程語法;2、使用模塊進行程序設計3、使用Python創建文件、訪問、刪除文件。 主要內容: Python不同系統環境搭建、Linux常用命令、編輯器使用、伺服器及搭建、Python基本語法、python控制語句、Python模塊、Python模塊設計、Python函數、Json數據操作、Python文件操作、Python異常處理。
  • python之OS模塊39個常用函數詳解
    作者:小伍哥 來源:AI入門學習os,語義作業系統,所以該模塊就是作業系統相關的功能了,用於處理文件和目錄這些我們日常手動需要做的操作,比如新建文件夾、獲取文件列表、刪除某個文件、獲取文件大小、重命名文件、獲取文件修改時間等,該模塊就包含了大量的作業系統操作函數,精選常用的進行解析,希望對大家有所幫助。
  • Python的武器庫04:numpy模塊(上)
    說到程式語言python,有一個著名的格言"餘生太短,只用python"。如果要分析為什麼會存在這麼一句格言?python的語法並不簡單,有複雜難懂的部分,之所以又這樣一句格言,是因為python中有很多強大的模塊,就像一個武器庫。Python正式由於這些模塊的出現,只要引入這個模塊,調用這個模塊的集成函數,問題迎刃而解;不需要從頭開始,節省了大量的時間。
  • Python的武器庫05:numpy模塊(下)
    說到程式語言python,有一個著名的格言"餘生太短,只用python"。如果要分析為什麼會存在這麼一句格言?python的語法並不簡單,有複雜難懂的部分,之所以有這樣一句格言,是因為python中有很多強大的模塊,就像一個武器庫。
  • Python內置模塊math介紹
    # 導入模塊import math#dir(module):可以通過它查看任何模塊中所包含的工具
  • Python初學者請注意!別這樣直接運行python命令
    曉查 編譯整理量子位 報導 | 公眾號 QbitAIPython已經成為全球最受歡迎的程式語言之一。原因當然是Python簡明易用的腳本語法,只需把一段程序放入.py文件中,就能快速運行。而且Python語言很容易上手模塊。比如你編寫了一個模塊my_lib.py,只需在調用這個模塊的程序中加入一行import my_lib即可。
  • 乾貨| 完美Python入門基礎知識點總結
    如:sum =lambda arg1, arg2: arg1 + arg2;print"相加後的值為 : ", sum(10,20) //輸出30python import語句From...import語句Python 的 from 語句讓你從模塊中導入一個指定的部分到當前命名空間中。
  • 中科大統計學python_python 中科大 - CSDN
    模塊教程。,科學計算模塊: Numpy 和 Pandas。這門課程的主要目標是希望學生能學到現代深度學習相關知識,特別是和NLP相關的一些知識點;能從宏觀上了解人類語言以及理解和產生人類語言的難度;能理解和用代碼(PyTorch)實習NLP中的一些主要問題和人物,例如詞義理解、依存句法分析、機器翻譯、問答系統等。