- 登入
- 註冊
對於資料處理而言,最重要的一環莫過於時間了,尤其是金融相關的資料,每個環節都會涉及時間,那就馬上開始吧!
一般而言,會習慣用「 from datetime import datetime」這個語法,對於剛入門的人來說,語法中出現相同名稱會很難理解,第一個 datetime 指的是腳本的名稱。
假如 main 腳本中有「def hello(): 」函式,要呼叫出此函式來使用時,就可以用「from main import hello」,邏輯上是一樣的,接下來就直接看例子吧!
from datetime import datetime
print(datetime.now()) # 取得現在時間
一般而言,時間有幾種格式:
可以按照相同順序,將其傳入 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()
時間戳是電腦使用的時間格式,我們可以利用時間戳的邏輯,進行時間的比較、加減,換算出時間差。時間戳在資料處理上,可以使時間格式統一在同樣條件下。
舉例來說,資料來自世界各地,描述方式各有不同,若使整體的資料都以 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 哦!
這個功能我個人比較少見,但是在很多時間資料處理的調整或是計算上會比較常用到,
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
這個部分基本上很常用到,尤其很多傳統金融的報表、數據資料,都是字串的日期格式,故如何處理這些格式,就是大家一定要熟練的技巧了。
備註:關於每個 %Y, %m 等等對應的意思,可以查 python 官方文件的表,當中有清楚的說明哦
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 套件的處理講求的是方便與好管理。
但這類的時間轉換在數據大的時候會拖慢運算的速度,所以建議是第一次拿到資料的時候都先統一轉好格式,之後才開始做各式各樣的數據運算哦!
這章節就到這邊啦~如果各位有任何問題歡迎留言討論囉!