天天看點

資料分析學習之時間序列(1)時間序列

時間序列

日常生活中我們的大多數詩句都是跟時間相關的,比如股票資料,每一個時間段的盈虧,是以,我了解了時間序列這個友善我們分析與時間相關的資料。

時間戳

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