datetime的各種時間格式轉換-Python 套件使用(一)

一、前言

對於資料處理而言,最重要的一環莫過於時間了,尤其是金融相關的資料,每個環節都會涉及時間,那就馬上開始吧!

一般而言,會習慣用「 from datetime import datetime」這個語法,對於剛入門的人來說,語法中出現相同名稱會很難理解,第一個 datetime 指的是腳本的名稱。

假如 main 腳本中有「def hello(): 」函式,要呼叫出此函式來使用時,就可以用「from main import hello」,邏輯上是一樣的,接下來就直接看例子吧!

from datetime import datetime
print(datetime.now())  # 取得現在時間

立即訂閱電子報,掌握最新資訊!

    電子郵件

    有興趣的主題
    量化交易金融知識台灣股市國內期貨海外期貨虛擬貨幣

    有興趣的量化交易軟體/平台
    不清楚MultiChartsTradingViewPythonXQMT4MT5

    還有什麼詢問的?

    【早鳥報名中】元富證券 X 量化通 模擬量化交易競賽

    好富投 1920x400
    好富投 978x258

    點我了解更多資訊


    二、時間格式

    一般而言,時間有幾種格式:

    1. datetime type:datetime生產出來的都是這個格式。
    2. timestamp:時間戳,電腦判斷時間用的格式。
    3. string:字串,通常為爬蟲拿到的資料或某些表格的儲存方式。
    4. isoformat:標準日期格式(datetime.isoformat),通常使用在跨時區的時間格式。

    Py 101209161710
    Py 101209161711

    三、基本使用:

    可以按照相同順序,將其傳入 datetime.datetime(),其實這個做法非常麻煩(因為你要手動輸入年、月、日、小時、分鐘、秒),所以後續會教各位更簡單的方式。

    # datetime(年, 月, 日, 時, 分, 秒)
    print(datetime(2021, 10, 15, 17, 37, 0))
    # >>> 2021-10-15 17:37:00

    若只想獲取日期信息,可以統一用「datetime.datetime」內的函式。參考以下範例:

    print(datetime.now())  # 2021-10-27 14:08:47.006039
    
    print(datetime.now().date()) # 取得現在日期
    # >>> 2021-05-30
    
    print(datetime.now().time()) # 取得現在時間
    # >>> 00:03:53.336914

    以下給大家看一些常見的範例,但多數不用硬背,要用到時再來查詢即可:

    from datetime import datetime
    print(datetime(2021, 10, 15, 17, 37, 7, 490703))
    print(datetime(2021, 10, 15, 9, 37, 43, 823644))
    
    tt = datetime.today() # 現在的時間,計到微秒
    print(tt)
    tn = datetime.now()
    print(tn)
    print(datetime.utcnow()) # UTC標準時間(台灣是+8)
    
    # isoformat語法印出的結果會用「T」來分隔日期和時間
    print(str(tn.now()))
    print(tn.isoformat())

    輸出結果如下:

    2021-10-15 17:37:07.490703 # datetime(2021, 10, 15, 17, 37, 7, 490703)
    2021-10-15 09:37:43.823644 # datetime(2021, 10, 15, 9, 37, 43, 823644)
    2021-10-27 12:48:20.658352 # datetime.today()
    2021-10-27 12:48:20.658357 # datetime.utcnow()
    2021-10-27 04:48:20.658359 # datetime.utcnow() 
    2021-10-27 12:48:20.658361 # str(tn.now())
    2021-10-27T12:48:20.658357 # tn.isoformat()

    1. timestamp 時間戳

    時間戳是電腦使用的時間格式,我們可以利用時間戳的邏輯,進行時間的比較、加減,換算出時間差。時間戳在資料處理上,可以使時間格式統一在同樣條件下。

    舉例來說,資料來自世界各地,描述方式各有不同,若使整體的資料都以 10 位數、int(整數)的方式計算,資料處理的難度會降低許多。因此我們可以藉由時間戳的邏輯統一資料格式。

    若要換算時間差或是做加減,可以利用delta的套件,一個與 datetime 同個套件但專門做時間加減的工具包,底下看個範例就很好理解囉。

    from datetime import datetime
    tn = datetime.now() 
    print(tn)
    ts = tn.timestamp()
    print(ts)
    
    print(datetime.fromtimestamp(ts))
    tn = datetime.now() # 取得現在時間
    ts = tn.timestamp()  # 將現在時間轉成時間戳
    tiso = tn.isoformat() # 取得ISO時間
    print(tn)
    print(ts)
    print(tiso)
    
    print(datetime.fromtimestamp(ts))  # 將時間戳轉回標準的日期時間格式(datetime格式)
    print(datetime.utcfromtimestamp(ts)) # 將時間戳轉回UTC+0格式
    print(datetime.fromisoformat(tiso)) # 將ISO time轉回 datetime格式
    

    結果:

    2021-05-30 00:59:00.475002 # 現在時間
    1622307540.475002 # 現在時間戳
    2021-05-30T00:59:00.475002 # 現在ISO時間
    2021-05-30 00:59:00.475002 # 將時間戳轉回現在時間
    2021-05-29 16:59:00.475002 # 將時間戳轉回UTC+8的時間(有注意到時間少了8小時嗎?)
    2021-05-30 00:59:00.475002 # 將ISO時間轉回現在時間

    時間戳的設計有 10 位數與 13 位數,這部分在轉換時是只能使用 10 位數轉換喔!

    所以如果遇到 13 位數,記得先轉成除以 1000,再轉成 int 哦!

    2. TimeDelta:

    這個功能我個人比較少見,但是在很多時間資料處理的調整或是計算上會比較常用到,

    timedelta顧名思義就是時間(time) 的差值( delta),所以這個函式是用來計算時間差。

    因為是針對時間進行加減,所以除了數值外,還得選週期,而可選的週期包含:weeks、days (預設)、hours、minutes、seconds、microseconds。

    # 呈上數據
    from datetime import timedelta, datetime
    add_30d = tn + timedelta(days=30)
    from datetime import datetime, timedelta
    
    curr_date = "2021/10/15" 
    curr_date_temp = datetime.strptime(curr_date, "%Y/%m/%d") # 轉換格式
    
    new_date = curr_date
    print(curr_date_temp)
    # >>> 2021-10-20 00:00:00

    同理,也可以減掉 timedelta。

    timedelta 提供的另一個便利是,你可以創建以天、星期、小時表示的任意的時間組合。它可以將組合簡化:

    td = timedelta(weeks=1, days=30, hours=2, minutes=40)
    print(td)  # 37 days, 2:40:00
    
    dt1 = datetime(2021, 10, 15, 11, 18, 0)
    dt2 = datetime(2021, 10, 14, 9, 11, 0)
    print(dt1 - dt2) # 1 day, 2:07:00
    
    
    # 將兩個時間間隔相減,可以得到另一個 timedelta 對象:
    td1 = timedelta(days=25) # 30 days
    td2 = timedelta(weeks=1) # 1 week
    print(td1 - td2) # 18 days, 0:00:00
    
    

    3. 時間字串(String):

    這個部分基本上很常用到,尤其很多傳統金融的報表、數據資料,都是字串的日期格式,故如何處理這些格式,就是大家一定要熟練的技巧了。

    備註:關於每個 %Y, %m 等等對應的意思,可以查 python 官方文件的表,當中有清楚的說明哦

    1. strftime() :  string from time,就是將時間資料轉換成字串。
    2. strptime(): 將字串資料轉換成時間。
    from datetime import datetime
    now = datetime.now() # current date and time
    print(now)
    
    year = now.strftime("%Y")
    print("year:", year)
    
    month = now.strftime("%m")
    print("month:", month)
    
    day = now.strftime("%d")
    print("day:", day)
    
    time = now.strftime("%H:%M:%S")
    print("time:", time)
    
    date_time = now.strftime("%Y-%m-%d, %H:%M:%S")
    print("date and time:",date_time)

    結果:

    2021-05-30 01:19:18.453923  #當下時間,顯示到秒以下的單位
    year: 2021
    month: 05
    day: 30
    time: 01:19:18
    date and time: 2021-05-30, 01:19:18   # 這一項只顯示到秒

    以字串操作:

    from datetime import datetime
    print(datetime.strptime("2021-10-15", "%Y-%m-%d"))
    
    dateString = "15/12/2021"
    dateFormatter = "%d/%m/%Y"
    print(datetime.strptime(dateString, dateFormatter))
    
    dateString = "15/12/2020"
    dateFormatter = "%d/%m/%Y"
    print(datetime.strptime(dateString, dateFormatter))
    
    dateString = "Monday, May 13, 2020 20:01:56"
    dateFormatter = "%A, %B %d, %Y %H:%M:%S"
    print(datetime.strptime(dateString, dateFormatter))

    結果:

    2021-10-15 00:00:00
    2021-12-15 00:00:00
    2020-12-15 00:00:00
    2020-05-13 20:01:56

    四、小結

    對於時間處理還有很多應用,但是我也得誠心說一句,對於 datetime 套件的處理講求的是方便與好管理。

    但這類的時間轉換在數據大的時候會拖慢運算的速度,所以建議是第一次拿到資料的時候都先統一轉好格式,之後才開始做各式各樣的數據運算哦!

    這章節就到這邊啦~如果各位有任何問題歡迎留言討論囉!

      電子郵件

      有興趣的主題
      量化交易金融知識台灣股市國內期貨海外期貨虛擬貨幣

      有興趣的量化交易軟體/平台
      不清楚MultiChartsTradingViewPythonXQMT4MT5

      還有什麼詢問的?


      量化通粉絲社群,一起討論程式交易!

      加入LINE社群量化交易討論群」無壓力討論與分享!

      加入臉書社團「程式交易 Taiwan」即時獲取實用的資源!

      RoWay
      RoWay

      多年投資經驗的兩岸三地操盤手,曾任海外資產管理公司交易平台的產品經理、與各外商投資公司合作開發各式交易策略與系統。

      擅長用Python執行資料蒐集、整理、分析與交易;也善於用Multicharts、MetaTrader等系統建構並回測期貨、期權、區塊鏈策略進而完成投資組合管理。

      文章: 28

      發佈留言

      發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *