Shopping Cart

購物車內沒有任何商品。

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

一、前言

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

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

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

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

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

    稱呼

    電子郵件

    以下非必填,但若您願意分享,我們將能推送更精準的內容給您

    投資經驗

    是否為理工科背景、工程師或有寫程式的經驗?

    有興趣的主題
    量化交易台股期貨海外期貨虛擬貨幣美股

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

    想透過量化交易達成甚麼目的?
    不確定自動交易選股回測投資績效量化自己的投資方法想找現成的策略套用

    還有什麼想詢問的?

    2024tv黑五 1920 X 400 像素(pc端的banner)
    2024tv黑五 978 X 258(移動端的banner)


    二、時間格式

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

    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 套件的處理講求的是方便與好管理。

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

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


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

    加入Discord 「量化交易討論群」即時獲取實用的資源!

    Write Together 101306261122
    Write Together 101306261121
    RoWay
    RoWay

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

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

    文章: 28

    發佈留言

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