在這篇文章我們將介紹如何將手上關於時間的數據轉換成想要的形式。
此篇文是由 Joyce 所撰寫
有時我們拿到的數據會類似這種形式:「2020年09月09號3:25PM」,一個字串,對於我們來說很好理解,一看就知道是什麼時間,但對於電腦來說,其實不然,因此Python有提供函數庫,讓我們在分析時間類別的數據時可以轉換成電腦能理解的型態。常用的函數庫
那麼time與datetime的差別在哪呢?簡單來說,datetime是time的進階版,它多增加了許多更方便的函數。
import pandas as pd
pd.Timestamp.max # 查看timestamp的最大值
output
Timestamp('2262-04-11 23:47:16.854775807')
位置 | 參數 | 意義 | 範圍 |
---|---|---|---|
0 | tm_year | 西元年 | 四位數 |
1 | tm_mon | 月份 | 1~12 |
2 | tm_day | 日期 | 1~31 |
3 | tm_hour | 小時 | 0~23 |
4 | tm_min | 分鐘 | 0~59 |
5 | tm_sec | 秒數 | 0~59 |
6 | tm_wday | 星期 | 0~6 |
7 | tm_yday | 今年第幾天 | 1~366 |
8 | tm_isdst | 夏令時間 | 0 or 1 or -1 |
import time # 引入time
time.localtime() # 查看目前時間元組
output
time.struct_time(tm_year=2020, tm_mon=9, tm_mday=9, tm_hour=8, tm_min=49, tm_sec=6, tm_wday=2, tm_yday=253, tm_isdst=0)
夏令時間的解釋依照各國的規定不一定一樣,這裡只做數字的解釋
- 0 : 不使用夏令時間
- 1 : 使用夏令時間
- -1 : 不確定
時間格式全部都是使用一個%,加上一個字母來代表,其中大小寫會有不同的意義,這裡舉一寫比較常使用到的引述作為舉例。
引述 | 代表 | 例子 |
---|---|---|
%a | 星期簡寫 | Mon |
%A | 星期 | Monday |
%b | 月份簡寫 | Jan |
%B | 月份 | January |
%d | 日期 | 31 |
%H | 小時(24小時制) | 23 |
%I | 小時(12小時制) | 12 |
%p | AM 或 PM | AM |
%P | am 或 pm | am |
%m | 月份(十進制) | 01 |
%M | 分鐘 | 59 |
%S | 秒數 | 59 |
%y | 年份(沒有世紀) | 99 |
%Y | 年份(有世紀) | 1999 |
這種做法是在分析資料中最常用到的作法,因為當資料室字串的時候,我們無法直接使用字串來做運算或比較,最快也做方便的方式就是直接轉成時間戳,讓大家都變成一個數值,再作分析。
舉例 : 將字串"2020-09-09 19:00:00"轉換成時間戳的形式。
import time # 引入time
timeString = "2020-09-09 19:00:00" # 時間格式為字串
struct_time = time.strptime(timeString, "%Y-%m-%d %H:%M:%S") # 轉成時間元組
time_stamp = int(time.mktime(struct_time)) # 轉成時間戳
print(time_stamp)
output
1599678000
這個做法最常用在輸出資料的時候,當所有數據處理完,因為通常是用時間戳作分析,但是時間戳的形式,我們不能一眼馬上判斷是何時,所以需要轉化成想要或者規定的字串形式。
舉例 : 將時間戳1599678000轉換成"西元年-月份-日期 小時:分鐘:秒數"的形式。
import time # 引入time
time_stamp = 1599678000 # 設定timeStamp
struct_time = time.localtime(time_stamp) # 轉成時間元組
timeString = time.strftime("%Y-%m-%d %H:%M:%S", struct_time) # 轉成字串
print(timeString)
output
'2020-09-09 19:00:00'
時間格式的更改一定要透過時間元組的幫忙,先將原本的字串轉成時間元組,在將時間元組轉成新的字串。
舉例 : 將"2020-09-09 19:00:00"轉成"2020 Sep 09 07:00:00 PM"
import time # 引入time
timeString = "2020-09-09 19:00:00" # 輸入原始字串
struct_time = time.strptime(timeString, "%Y-%m-%d %H:%M:%S") # 轉成時間元組
new_timeString = time.strftime("%Y %b %d %I:%M:%S %p", struct_time)
print(new_timeString)
output
'2020 Sep 09 07:00:00 PM'
取得後可經由轉換成想要的字串,作為其他的用途。
import time # 引入time
nowTime = int(time.time()) # 取得現在時間
struct_time = time.localtime(nowTime) # 轉換成時間元組
timeString = time.strftime("%Y %m %d %I:%M:%S %P", struct_time) # 將時間元組轉換成想要的字串
print(timeString)
output
2020 09 09 12:05:24 pm
import datetime # 引入datetime
nowTime = datetime.datetime.now() # 取得現在時間
print(nowTime)
output
2020-09-09 12:18:41.213858
sleep()常常用來做延遲的功能,裡頭放的數值是秒數。
time.sleep(5)
print("You wait 5 secs.")
output
You wait 5 secs.
要等五秒才會印出訊息。
取得當前時間的時間戳
nowTime = time.time()
print(nowTime)
output
1599655036.4895947
localtime裡放的是時間戳,而根據當地時間,或是伺服器放置的時區,將時間戳轉換成時間元組,如果沒有放時間戳的話,預設為當下的時間。
台灣所在的時區為(UTC+8)
struct_time = time.localtime(1599678000)
print(struct_time)
output
time.struct_time(tm_year=2020, tm_mon=9, tm_mday=9, tm_hour=19, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=253, tm_isdst=0)
gmtime()跟localtime()一樣是將時間戳轉換出時間元組,只是依據的時間是(UTC+0)的時區。
gm_time = time.gmtime()
print(gm_time)
output
time.struct_time(tm_year=2020, tm_mon=9, tm_mday=9, tm_hour=12, tm_min=47, tm_sec=57, tm_wday=2, tm_yday=253, tm_isdst=0)
mktime()則得作法則是將時間元組轉成時間戳。
gm_time = time.gmtime() # 取得時間元組
mk_time = time.mktime(gm_time) # 將時間員組轉成時間戳
print(mk_time)
output
1599656030.0
time.strptime(string, 時間形式),string放的是你要轉換的字串,後面放的是你的字串是怎樣的形式,轉換完後是一個時間元組。
例如 : "2020/09/09 21:00"
timeString = "2020/09/09 21:00" # 時間格式為字串
struct_time = time.strptime(timeString, "%Y/%m/%d %H:%M") # 轉成時間元組
print(struct_time)
output
time.struct_time(tm_year=2020, tm_mon=9, tm_mday=9, tm_hour=21, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=253, tm_isdst=-1)
time.strptime(字串形式, 時間元組),方式剛好跟strptime相反,它是將時間元組轉換成想要的字串形式。
local_time = time.localtime() # 取得時間元組
timeString = time.strftime("%Y/%m/%d %H:%M", local_time) # 轉成想要的字串形式
print(timeString)
output
2020/09/09 13:07
它的內容包含年份(year)、月份(month)、日期(day)。
date_today = datetime.date.today() # 取得今天的日期
print(date_today)
output
2020-09-09
max = datetime.date.max # 查看date的最大值
min = datetime.date.min # 查看date的最小值
print(max)
print(min)
output
9999-12-31
0001-01-01
它的內容包含小時(hour)、分鐘(minute)、秒數(second)、毫秒(microsecond)、時區(tzinfo)。
max = datetime.time.max # 查看time的最大值
min = datetime.time.min # 查看time的最小值
print(max)
print(min)
output
23:59:59.999999
00:00:00
datetime的所包含的參數及是前面兩個的合併。
datetime_now = datetime.datetime.now() # 取得現在時間
print(datetime_now)
output
2020-09-09 13:34:34.063506
有時候想要做時間的加減法的時候,可以使用timedelta的函數,它的意思就是差距,想是察看前一天的日期,查看一小時後的時間之類的。
time_range = datetime.timedelta(hours = 1) # 一小時
time = datetime.datetime(2020, 9, 9, 21, 59, 59)
new_time = time + time_range # 查看一小時後的時間
print(new_time)
output
2020-09-09 22:59:59
在python中提供時間轉換的方式十分的多元,但是不需要了解透徹,有了這個基本的概念,到時候要分析數據的時候,再去查資料要怎麼操作即可。