在處理時序資料的時候,常會遇到需要進行時間轉換的問題
像是查詢往後22天的日期是哪一天 ?
這個日期是星期幾 ?
如何將字串轉成 datetime 格式 ?

以下介紹兩個在處理時間常會用到的 python package,分別是 datetime 以及 dateutil

- datetime

  1. 查詢現在時間

    1
    2
    3
    4
    5
    import datetime
    datetime.datetime.now()
    #datetime.datetime(2019, 5, 15, 22, 10, 54, 789000)
    datetime.date.today()
    #datetime.date(2019, 5, 15)
  2. 將datetime及date轉成字串

    1
    2
    datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    #'2019-05-15 22:01:57'

%y 兩位數的年份表示(00-99), %Y 四位數的年份表示(000-9999), %m 月份(01-12),%d 月内中的一天(0-31),%H 24小時制小時数(0-23), %I 12小時制小時数(01-12),%M 分鐘数(00=59), %S 秒(00-59)

  1. 獲取當天開始以及結束時間

    1
    2
    3
    4
    datetime.datetime.combine(datetime.date.today(), datetime.time.min)
    #datetime.datetime(2019, 5, 15, 0, 0)
    datetime.datetime.combine(datetime.date.today(), datetime.time.max)
    #datetime.datetime(2019, 5, 15, 23, 59, 59, 999999)
  2. 獲取兩個datetime的時間差

    1
    2
    (datetime.datetime(2019,5,20,12,0,0) - datetime.datetime.now()).total_seconds()
    #394778.361 (s)
  3. 獲取日期的相關資訊

    1
    2
    datetime.datetime(2019,5,15).weekday()
    #2 (Monday is 0 and Sunday is 6)

- dateutil (擴增datetime package的功能)

  1. 將現在時間往前往後移動
1
2
3
4
5
6
datetime.datetime.now()
#datetime.datetime(2019, 5, 15, 22, 33, 23, 594000)
datetime.datetime.now() + relativedelta(months=+1)
#datetime.datetime(2019, 6, 15, 22, 33, 23, 594000)
datetime.datetime.now() + relativedelta(months=+1, days=+1)
#datetime.datetime(2019, 6, 16, 22, 33, 23, 594000)

relativedelta可調參數: years, months, days, weeks, hours, minutes, seconds, microseconds (數值可正可負,負代表過去,正代表未來)

  1. 常用function
1
2
3
4
5
def last_month_cal(time_, month):
return (datetime.datetime.strptime(time_,"%Y-%m-%d") + relativedelta(months=(-month))).strftime("%Y-%m-%d")

last_month_cal("2019-05-01", 3)
#'2019-02-01'