顧名思義,時(shí)間序列(time series),就是由時(shí)間構(gòu)成的序列,它指的是在一定時(shí)間內(nèi)按照時(shí)間順序測量的某個(gè)變量的取值序列,比如一天內(nèi)的溫度會(huì)隨時(shí)間而發(fā)生變化,或者股票的價(jià)格會(huì)隨著時(shí)間不斷的波動(dòng),這里用到的一系列時(shí)間,就可以看做時(shí)間序列。時(shí)間序列包含三種應(yīng)用場景,分別是:
在處理時(shí)間序列的過程中,我們一般會(huì)遇到兩個(gè)問題,第一,如何創(chuàng)建時(shí)間序列;第二,如何更改已生成時(shí)間序列的頻率。 Pandas 為解決上述問題提供了一套簡單、易用的方法。
下面用 Python 內(nèi)置的 datetime 模塊來獲取當(dāng)前時(shí)間,通過該模塊提供的now()方法即可實(shí)現(xiàn)。
from datetime import datetime
#數(shù)據(jù)類型為datetime
print(datetime.now())
輸出結(jié)果:
2020-12-16 16:36:18.791297
TimeStamp(時(shí)間戳) 是時(shí)間序列中的最基本的數(shù)據(jù)類型,它將數(shù)值與時(shí)間點(diǎn)完美結(jié)合在一起。Pandas 使用下列方法創(chuàng)建時(shí)間戳:
import pandas as pd
print (pd.Timestamp('2017-03-01'))
輸出結(jié)果:
2017-03-01 00:00:00
同樣,可以將整型或浮點(diǎn)型表示的時(shí)間轉(zhuǎn)換為時(shí)間戳。默認(rèn)的單位是納秒(時(shí)間戳單位),示例如下:
import pandas as pd
print(pd.Timestamp(1587687255,unit='s'))
輸出結(jié)果:
2020-04-24 00:14:15
通過 date_range() 方法可以創(chuàng)建某段連續(xù)的時(shí)間或者固定間隔的時(shí)間時(shí)間段。該函數(shù)提供了三個(gè)參數(shù),分別是:
示例如下:
import pandas as pd
#freq表示時(shí)間頻率,每30min變化一次
print(pd.date_range("9:00", "18:10", freq="30min").time)
輸出結(jié)果:
[datetime.time(9, 0) datetime.time(9, 30) datetime.time(10, 0) datetime.time(10, 30) datetime.time(11, 0) datetime.time(11, 30) datetime.time(12, 0) datetime.time(12, 30) datetime.time(13, 0) datetime.time(13, 30) datetime.time(14, 0) datetime.time(14, 30) datetime.time(15, 0) datetime.time(15, 30) datetime.time(16, 0) datetime.time(16, 30) datetime.time(17, 0) datetime.time(17, 30) datetime.time(18, 0)]
import pandas as pd
#修改為按小時(shí)
print(pd.date_range("6:10", "11:45", freq="H").time)
輸出結(jié)果:
[datetime.time(6, 10) datetime.time(7, 10) datetime.time(8, 10) datetime.time(9, 10) datetime.time(10, 10) datetime.time(11, 10)]
您可以使用 to_datetime() 函數(shù)將 series 或 list 轉(zhuǎn)換為日期對象,其中 list 會(huì)轉(zhuǎn)換為DatetimeIndex。示例如下:
import pandas as pd
print(pd.to_datetime(pd.Series(['Jun 3, 2020','2020-12-10', None])))
輸出結(jié)果:
0 2020-06-03
1 2020-12-10
2 NaT
dtype: datetime64[ns]
注意:NaT 表示的不是時(shí)間 ,它等效于 NaN。
最后再來看一個(gè)示例:
import pandas as pd
#傳入list,生成Datetimeindex
print(pd.to_datetime(['Jun 3, 2020','2020-12-10', None]))
輸出結(jié)果:
DatetimeIndex(['2020-06-03', '2020-12-10', 'NaT'], dtype='datetime64[ns]', freq=None)
Time Periods 表示時(shí)間跨度,一段時(shí)間周期,它被定義在 Pandas Periods 類中,通過該類提供的方法可以實(shí)現(xiàn)將頻率轉(zhuǎn)換為周期。比如 Periods() 方法,可以將頻率 "M"(月)轉(zhuǎn)換為 Period(時(shí)間段)。
下面示例,使用 asfreq() 和 start 參數(shù),打印 "01" ,若使用 end 參數(shù),則打印 "31"。示例如下:
import pandas as pd
x = pd.Period('2014', freq='M')
#start參數(shù)
print(x.asfreq('D', 'start'))
#end參數(shù)
print(x.asfreq('D', 'end'))
輸出結(jié)果:
2014-01-01 2014-01-31
對于常用的時(shí)間序列頻率,Pandas 為其規(guī)定了一些字符串別名,我們將這些別名稱為“offset(偏移量)”。如下表所示:
別名 | 描述 | 別名 | 描述 |
---|---|---|---|
B | 工作日頻率 | BQS | 工作季度開始頻率 |
D | 日歷日頻率 | A | 年終頻率 |
W | 每周頻率 | BA | 工作年度結(jié)束頻率 |
M | 月末頻率 | BAS | 工作年度開始頻率 |
SM | 半月結(jié)束頻率 | BH | 營業(yè)時(shí)間頻率 |
BM | 工作月結(jié)束頻率 | H | 小時(shí)頻率 |
MS | 月開始頻率 | T,min | 每分鐘頻率 |
SMS | 半月開始頻率 | S | 每秒鐘頻率 |
BMS | 工作月開始頻率 | L,ms | 毫秒 |
Q | 季末頻率 | U,us | 微妙 |
BQ | 工作季度結(jié)束頻率 | N | 納秒 |
QS | 季度開始頻率 |
周期計(jì)算,指的是對時(shí)間周期進(jìn)行算術(shù)運(yùn)算,所有的操作將在“頻率”的基礎(chǔ)上執(zhí)行。
import pandas as pd
#S表示秒
x = pd.Period('2014', freq='S')
print(x)
輸出結(jié)果:
2014-01-01 00:00:00
執(zhí)行計(jì)算示例:
import pandas as pd
x = pd.Period('2014', freq='S')
#加1s的時(shí)間
print(x+1)
輸出結(jié)果:
2014-01-01 00:00:01
再看一組完整的示例:
import pandas as pd
#定義時(shí)期period,默認(rèn)freq="Y"年份
p1=pd.Period('2020')
p2=pd.Period('2019')
#使用f''格式化輸出
print(f'p1={p1}年')
print(f'p2={p2}年')
print(f'p1和p2間隔{p1-p2}年')
#f''表示字符串格式化輸出
print(f'五年前是{p1-5}年')
輸出結(jié)果:
p1=2020年 p2=2019年 p1和p2間隔<YearEnd: month=12>年 五年前是2015年
我們可以使用 period_range() 方法來創(chuàng)建時(shí)間周期范圍。示例如下:
import pandas as pd
#Y表示年
p = pd.period_range('2016','2018', freq='Y')
print(p)
輸出結(jié)果:
PeriodIndex(['2016', '2017', '2018'], dtype='period[A-DEC]', freq='A-DEC')
如果想要把字符串日期轉(zhuǎn)換為 Period,首先需要將字符串轉(zhuǎn)換為日期格式,然后再將日期轉(zhuǎn)換為 Period。示例如下:
import pandas as pd
# 創(chuàng)建時(shí)間序列
index=pd.date_range("2020-03-17","2020-03-30",freq="1.5H")
#隨機(jī)選取4個(gè)互不相同的數(shù)
loc=np.random.choice(np.arange(len(index)),size=4,replace=False)
loc.sort()
ts_index=index[loc]
print(ts_index)
pd_index=ts_index.to_periods('D')
print(pd_index())
輸出結(jié)果:
DatetimeIndex(['2020-03-17 12:00:00', '2020-03-22 04:30:00', '2020-03-27 03:00:00', '2020-03-30 00:00:00'], dtype='datetime64[ns]', freq=None) PeriodIndex(['2020-03-17', '2020-03-19', '2020-03-19', '2020-03-27'], dtype='period[D]', freq='D')
使用 to_timestamp() 能夠?qū)?Period 時(shí)期轉(zhuǎn)換為時(shí)間戳(timestamp),示例如下:
import pandas as pd
p1=pd.Periods("2020-2-3")
print(p1.to_timestamp())
輸出結(jié)果:
Timestamp('2020-02-03 00:00:00')
Pandas 提供了用來創(chuàng)建日期序列的函數(shù) date_range(),該函數(shù)的默認(rèn)頻率為 "D", 也就是“天”。日期序列只包含年、月、日,不包含時(shí)、分、秒。
下面是一組簡單的示例,如下所示:
import pandas as pd
print(pd.date_range('12/15/2020', periods=10))
輸出結(jié)果:
DatetimeIndex(['2020-12-15', '2020-12-16', '2020-12-17', '2020-12-18', '2020-12-19', '2020-12-20', '2020-12-21', '2020-12-22', '2020-12-23', '2020-12-24'], dtype='datetime64[ns]', freq='D')
當(dāng)我們使用 date_range() 來創(chuàng)建日期范圍時(shí),該函數(shù)包含結(jié)束的日期,用數(shù)學(xué)術(shù)語來說就是區(qū)間左閉右閉,即包含起始值,也包含結(jié)束值。示例如下:
import pandas as pd
#建議使用Python的datetime模塊創(chuàng)建時(shí)間
start = pd.datetime(2019, 1, 1)
end = pd.datetime(2019, 1, 5)
print(pd.date_range(start,end)
輸出結(jié)果:
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04','2019-01-05'] ,dtype='datetime64[ns]', freq='D')
使用下列方法可以修改頻率,比如按“天”為按“月”,示例如下:
import pandas as pd
print(pd.date_range('12/15/2011', periods=5,freq='M'))
輸出結(jié)果:
DatetimeIndex(['2020-12-31', '2021-01-31', '2021-02-28', '2021-03-31', '2021-04-30'],dtype='datetime64[ns]', freq='M')
bdate_range() 表示創(chuàng)建工作日的日期范圍,它與 date_range() 不同,它不包括周六、周日。
import pandas as pd
print(pd.date_range('11/25/2020', periods=8))
輸出結(jié)果:
DatetimeIndex(['2020-11-25', '2020-11-26', '2020-11-27', '2020-11-28','2020-11-29', '2020-11-30', '2020-12-01', '2020-12-02'],dtype='datetime64[ns]', freq='D')
上述方法中,date_range() 默認(rèn)頻率是日歷日,而 bdate_range() 的默認(rèn)頻率是工作日。
更多建議: