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

一、前言

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

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

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

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

Mc 101209091709
Mc 101209091709


追蹤量化通的粉絲專頁量化通QuantPass」即時獲取實用的資源!

二、時間格式

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

  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社群量化交易討論群」無壓力討論與分享!

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

RoWay
RoWay

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

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

文章: 27

發佈留言

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