iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 9
1
AI & Data

資幾資比系列 第 9

[Series - 8] Python時間轉換介紹

前言

在這篇文章我們將介紹如何將手上關於時間的數據轉換成想要的形式。


實作連結

colab連結


時間轉換

有時我們拿到的數據會類似這種形式:「2020年09月09號3:25PM」,一個字串,對於我們來說很好理解,一看就知道是什麼時間,但對於電腦來說,其實不然,因此Python有提供函數庫,讓我們在分析時間類別的數據時可以轉換成電腦能理解的型態。常用的函數庫

  1. import time
  2. import datetime

那麼time與datetime的差別在哪呢?簡單來說,datetime是time的進階版,它多增加了許多更方便的函數。


名詞介紹

  1. 時間戳(timestamp) : 以秒為單位的一個時間類型,起始時間為1970年1月1日0點0分0秒,因此假如現在是1970年1月1日12點0分0秒,所對應到的時間戳會為43200($12\times60\times60$),通常時間戳最常被拿來用作時間的分析,因為它的形式最為簡單,沒有什麼格式需要考量,它的缺點就是有範圍的限制,因為起始值是1970年,那麼1970年前就沒有時間戳了,而且它也有限制最大的年份大約在2262年。
import pandas as pd

pd.Timestamp.max # 查看timestamp的最大值

output

Timestamp('2262-04-11 23:47:16.854775807')
  1. 時間元組(struct_time) : 這是一個由九個數值組裝起來的時間類型。如下表所示
位置 參數 意義 範圍
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
``python
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

time 常用的函數

time.sleep()

sleep()常常用來做延遲的功能,裡頭放的數值是秒數。

實作

time.sleep(5)
print("You wait 5 secs.")

output

You wait 5 secs.

要等五秒才會印出訊息。

time.time()

取得當前時間的時間戳

實作

nowTime = time.time()
print(nowTime)

output

1599655036.4895947

time.localtime()

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)

time.gmtime()

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)

time.mktime()

mktime()則得作法則是將時間元組轉成時間戳。

實作

gm_time = time.gmtime() # 取得時間元組
mk_time = time.mktime(gm_time) # 將時間員組轉成時間戳
print(mk_time)

output

1599656030.0

time.strptime()

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.strftime()

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

datetime常用的函數

datatime.date

它的內容包含年份(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

datatime.time

它的內容包含小時(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

datetime的所包含的參數及是前面兩個的合併。

實作

datetime_now = datetime.datetime.now() # 取得現在時間
print(datetime_now)

output

2020-09-09 13:34:34.063506

datatime.timedelta

有時候想要做時間的加減法的時候,可以使用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中提供時間轉換的方式十分的多元,但是不需要了解透徹,有了這個基本的概念,到時候要分析數據的時候,再去查資料要怎麼操作即可。


參考資料


上一篇
[Series - 7] 特徵工程介紹
下一篇
[Series - 9] 實戰演練
系列文
資幾資比31

尚未有邦友留言

立即登入留言