時間序列
日常生活中我們的大多數詩句都是跟時間相關的,比如股票資料,每一個時間段的盈虧,是以,我了解了時間序列這個友善我們分析與時間相關的資料。
時間戳
import time
time.time() # 檢視目前的時間戳
# 輸出
1584431953.366432
# 将時間戳轉換成本地時間類型
t = time.time()
loc_t = time.localtime(t)
loc_t
# 可以看出 有年 月 日 小時 分鐘 秒 星期幾 一年中第幾天
# 輸出
time.struct_time(tm_year=2020, tm_mon=3, tm_mday=17, tm_hour=16, tm_min=0, tm_sec=9, tm_wday=1, tm_yday=77, tm_isdst=0)
# 将localtime 類型的時間轉換成 格式化時間
str_f_time = time.strftime("%Y-%m-%d",loc_t)
str_f_time
# 輸出
'2020-03-17'
字母 | 含義 |
---|---|
%Y | 以十進制數字表示的年份 |
%m | 以十進制數字表示的月份[01,12]。. |
%d | 以十進制數字[01,31]表示的每月的一天. |
%H | 小時(24小時時鐘)作為一個小數[00,23]. |
%M | 十進制的分數[00,59]. |
%S | 第二位是小數[00,61]. |
%z | 與協調世界時的時區偏移. |
%a | 區域設定的縮寫工作日名稱. |
%A | 區域設定的縮寫工作日名稱. |
%b | 語言環境的縮寫月份名稱. |
%B | 本地的月份全名. |
%c | 區域設定的适當的日期和時間表示. |
%I | 小時(12小時鐘)作為一個小數[01,12]. |
%p | 相當于 AM 或 PM. |
日期和時間資料類型的工具
import pandas as pd
import numpy as np
from datetime import datetime
# 檢視目前時間
now = datetime.now()
now
# 年 月 日 時 分
datetime.datetime(2020, 3, 17, 16, 5, 23, 917793)
# 取時間
# now 是一個對象 可以通過通路對象的方法取出時間
now.day,now.year
#輸出
(17, 2020)
# 兩個時間相減
d = datetime(2008,6,25) - datetime(2008,6,24,8,15)
d
# 相差的 第一個是天 第二個是秒
datetime.timedelta(0, 56700)
from datetime import timedelta
# 也可以用這個來計算時間的增減
start = datetime(2020,3,14)
# 在 start 的基礎上 增加 一天 2400秒 也就是40分鐘 預設如果不寫 時分秒 從14号0點開始算
start + timedelta(1,2400)
# 輸出
datetime.datetime(2020, 3, 15, 0, 40)
字元串和datetime的轉換
#我們導入工具
from dateutil.parser import parse
v = '2020-03-16'
# 這裡 時間格式要和v對應
datetime.strptime(v,"%Y-%m-%d")
# 就變成了datetime的資料類型
# 輸出
datetime.datetime(2020, 3, 16, 0, 0)
# 我們能不能有一種方法批量的将字元串的時間資料類型轉換成datetime時間資料類型呢?第一種方法可以利用 清單推導式
d = ['8/4/2020','10/1/2020']
[datetime.strptime(x,"%m/%d/%Y") for x in d]
# 輸出
[datetime.datetime(2020, 8, 4, 0, 0), datetime.datetime(2020, 10, 1, 0, 0)]
# 第二鐘方法
d = ['8/4/2020 12:00:00','10/1/2020 21:00:00']
pd.to_datetime(d)
# 這裡轉換成的也是datetime的時間資料類型
DatetimeIndex(['2020-08-04 12:00:00', '2020-10-01 21:00:00'], dtype='datetime64[ns]', freq=None)
帶重複索引的時間序列
dates = pd.DatetimeIndex(['1/1/2000', '1/2/2000', '1/2/2000','1/2/2000', '1/3/2000'])
dates
#輸出
DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-02', '2000-01-02',
'2000-01-03'],
dtype='datetime64[ns]', freq=None)
ts2 = pd.Series(np.arange(5),index=dates)
ts2
#輸出
2000-01-01 0
2000-01-02 1
2000-01-02 2
2000-01-02 3
2000-01-03 4
dtype: int32
# 索引 支援 位置索引 标簽索引
ts2['1/3/2000']
ts2[4]
ts['2000-1-2']
# 會選出所有1月2号的值
2000-01-02 1
2000-01-02 2
2000-01-02 3
dtype: int32
# 我們對時間序列進行分組 這裡示範的對象是series對象
# series 隻有一列 是以們隻能按照 層級來分組
ts2.groupby(level=0).mean()
2000-01-01 0
2000-01-02 2
2000-01-03 4
dtype: int32
日期的範圍,頻率以及移動
生成日期範圍
index = pd.date_range('2013-02-01','2013-03-01')
index
# 生成索引datetimeindex的索引 從2 1 到 3 1
DatetimeIndex(['2013-02-01', '2013-02-02', '2013-02-03', '2013-02-04',
'2013-02-05', '2013-02-06', '2013-02-07', '2013-02-08',
'2013-02-09', '2013-02-10', '2013-02-11', '2013-02-12',
'2013-02-13', '2013-02-14', '2013-02-15', '2013-02-16',
'2013-02-17', '2013-02-18', '2013-02-19', '2013-02-20',
'2013-02-21', '2013-02-22', '2013-02-23', '2013-02-24',
'2013-02-25', '2013-02-26', '2013-02-27', '2013-02-28',
'2013-03-01'],
dtype='datetime64[ns]', freq='D')
pd.date_range('2012-04-01',periods=20) # 指定生成多少天
# 輸出
DatetimeIndex(['2012-04-01', '2012-04-02', '2012-04-03', '2012-04-04',
'2012-04-05', '2012-04-06', '2012-04-07', '2012-04-08',
'2012-04-09', '2012-04-10', '2012-04-11', '2012-04-12',
'2012-04-13', '2012-04-14', '2012-04-15', '2012-04-16',
'2012-04-17', '2012-04-18', '2012-04-19', '2012-04-20'],
dtype='datetime64[ns]', freq='D')
pd.date_range(end='2012-04-01',periods=20) # 指定截至時間 可以從截至時間往前生成時間序列
# 輸出
DatetimeIndex(['2012-03-13', '2012-03-14', '2012-03-15', '2012-03-16',
'2012-03-17', '2012-03-18', '2012-03-19', '2012-03-20',
'2012-03-21', '2012-03-22', '2012-03-23', '2012-03-24',
'2012-03-25', '2012-03-26', '2012-03-27', '2012-03-28',
'2012-03-29', '2012-03-30', '2012-03-31', '2012-04-01'],
dtype='datetime64[ns]', freq='D')
pd.date_range('2020-01-01','2020-12-01',freq='MS') # ms 生成的時間序列是從一号開始
# 輸出
DatetimeIndex(['2020-01-01', '2020-02-01', '2020-03-01', '2020-04-01',
'2020-05-01', '2020-06-01', '2020-07-01', '2020-08-01',
'2020-09-01', '2020-10-01', '2020-11-01', '2020-12-01'],
dtype='datetime64[ns]', freq='MS')
更多freq參數詳見與
https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases
移動資料
ts = pd.Series(np.random.randn(4),
index=pd.date_range('1/1/2000', periods=4, freq='M'))
ts
2000-01-31 1.075073
2000-02-29 -1.001103
2000-03-31 3.097602
2000-04-30 1.184195
Freq: M, dtype: float64
ts.shift(2) # 把資料往下移動 上面的資料沒有了 就用nan填充
# 輸出
2000-01-31 NaN
2000-02-29 NaN
2000-03-31 1.075073
2000-04-30 -1.001103
Freq: M, dtype: float64
ts.shift(-2) # 把資料往上移動
# 輸出
2000-01-31 3.097602
2000-02-29 1.184195
2000-03-31 NaN
2000-04-30 NaN
Freq: M, dtype: float64
ts.shift(2,freq='M') # 這是每一種資料的時間 都增加兩個月 并不會移動資料 隻是對應關系改變了
2000-03-31 1.075073
2000-04-30 -1.001103
2000-05-31 3.097602
2000-06-30 1.184195
Freq: M, dtype: float64