主要:datetime.date()、datetime.datetime()虱痕、datetime.timedelta()
日期解析方法:parser.parse
一、時間模塊 import datetime
1.datetime.date:date對象,date是datetime中的方法
(1)datetime.date.today()#today()會根據(jù)日期的變化輸出今天的日期,返回的是datetime.date類忘古,例如:想把一個月數(shù)據(jù)聚合成四周的產(chǎn)量--如果是str需要手動按照七天間隔路操,而datetime.date可以直接用來做
(2)datetime.date(2018,10,1)
2.datetime.datetime:直接生成時間戳
(1)datetime.datetime.now()#返回今天的年月日時分秒疾渴,返回的是datetime.datetime類
(2)datetime.datetime類相減得到相差的時間,返回的是datetime.timedelta時間差類
3.datetime.timedelta:時間差,默認是天
datetime.timedelta(100,3600)#時間差為100天+3600秒
4.日期和字符串轉換方法:parser.parse,可以識別任何相似于時間的字符串
from dateutil.parser import parse
print(parse('2000-11-1'))
print(parse('11/11/2000'))
print(parse('5/1/2018',dayfirst = True))#dayfirst為True可以設置日在月之前
print(parse('Jan 31,1997 10:45PM'))
#各種格式都可以判斷屯仗,但不能出現(xiàn)中文
二搞坝、pandas里的時刻數(shù)據(jù):pd.Timestamp
1. 時刻數(shù)據(jù)代表時間點,是pd的數(shù)據(jù)類型魁袜;pd.Timestamp():時間點可以是一個月 一分鐘 一秒,直接生成pandas的時刻數(shù)據(jù)--即時間戳桩撮,類型為pandas.Timestamp
注意:只適用于單個時間
2.pd.to_datetime():多個時間數(shù)據(jù)轉換時間戳索引pandas的DatetimeIndex,單個時間數(shù)據(jù)轉換成Timestamp
t3 = ['2017-10-20','2017-10-20','2017-10-20','2017-10-20']
(1)當為多個時間數(shù)據(jù)時峰弹,返回DatetimeIndex時間序列標簽類店量,可以變成Series的index
(2)當一組時間序列中有其他格式數(shù)據(jù),會報錯鞠呈;也可以用errors='ignore'參數(shù)返回原始輸入融师,生成一般的數(shù)組;errors='coerce'參數(shù)返回datetimeIndex,并變?yōu)槿笔е礜aT
(3)print(pd.Timestamp(t3),type(t3))#會報錯
三蚁吝、pandas時戳索引
pd.DatetimeIndex()時間戳索引:直接把時間序列變成時間戳索引
rng[0]#按照索引生成時間戳Timestamp
** TimeSeries時間序列:以DatetimeIndex的index的Series旱爆,為TimeSeries,時間序列
四窘茁、pd.date_range()日期范圍/工作日pd.bdate_range
pd.date_range(start開始時間怀伦,end結束時間,periods時期山林,freq默認頻率day房待,normalize=True把時間歸為凌晨零點)
2種生成方式:start+end or start/end+periods
例如:rng1 = pd.date_range('1/1/2017','1/10/2017')
rng2 = pd.date_range(start = '1/1/2017',periods =10,freq = 'H')#freq='H'按小時
print(pd.date_range('1/1/2017','1/11/2017',closed='right'))closed:默認為左閉右閉;left為左閉右開捌朴;right為左開右閉
注意:由于date_range返回的是DatetimeIndex類吴攒,當被list后返回的是一個個的時間戳Timestamp(pandas中精度最小的時間單位)
五、afreq:時期頻率的轉換
ts = pd.Series(np.random.rand(4),index=pd.date_range('20170101','20170104'))
print(ts.asfreq('4H',method='ffill'))#method參數(shù):插值 ffill用之前的填充 bfill用之后的填充
六砂蔽、pd.date_range()超前和滯后
ts = pd.Series(np.random.rand(4),index=pd.date_range('20170101','20170104'))
print(ts.shift(2))#.shift(正數(shù)):向后移
print(ts.shift(-2))#.shift(負數(shù)):向前移
#意義:比如有十天的營收數(shù)據(jù)洼怔,想看當天比前一天的漲跌情況,得到的負數(shù)就是跌了,正數(shù)就是漲了
per? = ts/ts.shift(1)-1
#加上freq參數(shù)左驾,多時間戳進行位移镣隶,而不僅對數(shù)值進行位移=D按照天极谊,=T按照小時
print(ts.shift(2,freq = 'D'))、print(ts.shift(2,freq = 'T'))
七安岂、pandas的時期pd.period()
1.pd.Period() 類似于DatatimeIndex時間戳:
p = pd.Period('2017',freq='M')生成以2017-01開始轻猖,月為頻率的時間構造器;freq指明period長度域那,時間戳則說明該period在時間軸上的位置
注意:print(p+1)#按照freq進行運算
2.pd.period_range()類似于date_range()時間戳
prng = pd.period_range('1/1/2011','1/1/2013',freq='M')生成的按月 2011-01咙边,數(shù)據(jù)格式為PeriodIndex,單個數(shù)值為Period
rng = pd.date_range('1/1/2011','1/1/2013',freq='M')生成的按天2011-01-01
3.asfreq頻率轉換
p = pd.Period('2017','A-DEC')--每年制定月份的最后一個日歷日所在的年次员,變?yōu)镸/D
print(p.asfreq('M',how='start'))#how參數(shù)=start以開始败许,=end以結束 print(p.asfreq('D',how='end'))
ts2 = pd.Series(np.random.rand(len([prng])),
? ? ? ? ? ? ? index=prng.asfreq('D',how='end'))#asfreq也可以轉換TimeSeries的index
4.時間戳DatatimeIndex與時期Period的轉換:pd.to_period()/pd.timestamp()
ts1.to_period()、ts2.to_timestamp()
八淑蔚、時間序列的重采樣
將時間序列的一個頻率轉換成另一個頻率市殷,且會有數(shù)據(jù)的結合
降采樣:高頻數(shù)據(jù)-低頻數(shù)據(jù),eg以天為頻率的數(shù)據(jù)轉換為以月為頻率的數(shù)據(jù)
升采樣:低頻數(shù)據(jù)-高頻數(shù)據(jù)刹衫,eg以年為頻率的數(shù)據(jù)轉換為以月為頻率的數(shù)據(jù)?
1.降采樣:需要聚合
ts.resample('5D') #得到重采樣的構建器DatetimeIndexResampler醋寝,是個中間值,需要指示聚合方式带迟,頻率為5天
ts_re2 = ts.resample('5D',closed='left',label='right').sum()#重采樣的最終值音羞,得到聚合后的Series;
label:重采樣后以那個標簽為索引,默認寫left邮旷;closed:默認左閉右閉
聚合方法:
print(ts.resample('5D').sum())#均值
print(ts.resample('5D').max())#最大值
print(ts.resample('5D').min())#最小值
print(ts.resample('5D').median())#中值
print(ts.resample('5D').first())#第一個值
print(ts.resample('5D').last())#第二個值
print(ts.resample('5D').ohlc())#OHLC重采樣:open開盤 high最大值 low最小值 close收盤-金融
2.升采樣:需要填充
ts.resample('15T').asfreq() #不做填充黄选,返回NaN
ts.resample('15T').ffill()/bfill():上填充和下填充
九蝇摸、時間序列中的索引和切片
1.索引:方法與DataFrame和Series相似--只要能表示時間的都可以拿來做標簽的索引下標索引和標簽索引
2.切片:下標切片婶肩,類似Series,左閉右開貌夕;標簽切片律歼,左閉右閉;#標簽切片只寫月會出現(xiàn)月的所有日
3.重復索引的時間序列 .is_unique值是否唯一啡专,index.is_unique判斷index是否唯一,返回True和False险毁,可以用來做布爾型索引
總結:pandas的時間模塊
pd.Timestamp():單數(shù)據(jù)時間戳
pd.to_datetime():多數(shù)據(jù)的時間戳
pd.DatatimeIndex():多數(shù)據(jù)的時間戳,可以作為Series的index们童;還可以索引
在沒有現(xiàn)成時間數(shù)據(jù)情況下:pd.date_range()日期范圍
附:pd.date_range():日期范圍一講畔况,頻率freq
# print(pd.date_range('2017/1/1','2017/1/4'))#默認freq='D',每日歷日
# print(pd.date_range('2017/1/1','2017/1/4',freq='B'))#freq='B',每工作日
# print(pd.date_range('2017/1/1','2017/1/4',freq='H'))#freq='H',每小時
# print(pd.date_range('2017/1/1 12:00','2017/1/4 12:10',freq='T'))#freq='T/MIN',每分鐘
# print(pd.date_range('2017/1/1 12:00:00','2017/1/4 12:10:10',freq='S'))#freq='S',每秒
# print(pd.date_range('2017/1/1 12:00','2017/1/4 12:10',freq='L'))#freq='L',每毫秒
# print(pd.date_range('2017/1/1 12:00','2017/1/4 12:10',freq='U'))#freq='U',每微秒
print(pd.date_range('2017/1/1','2017/1/4',freq='W-MON'))
# W-MON從指定星期幾開始算起,每周
print(pd.date_range('2017/1/1','2018/1/4',freq='WOM-2MON'))
# WOM-nMON,每月的第幾個星期幾開始算
# 時間序列:DatimeIndex與TimeSeries
pd.date_range()-日期范圍二講慧库,頻率
print(pd.date_range('2017','2018',freq='M'))
print(pd.date_range('2017','2020',freq='Q-MAY'))
print(pd.date_range('2017','2018',freq='A-DEC'))
print('--'*20)
#M:每月最后一個日歷日
#Q-月:指定月為季度末跷跪,每個季度末最后一月的最后一個日歷日
#A-月:每年制定月份的最后一個日歷日
#月編寫:JAN
#所以Q-月只有三種情況:1-4-7-10,2-5-8-11齐板,3-6-9-12
print(pd.date_range('2017','2018', freq = 'BM'))?
print(pd.date_range('2017','2020', freq = 'BQ-DEC'))?
print(pd.date_range('2017','2020', freq = 'BA-DEC'))
print('------')
# BM:每月最后一個工作日
# BQ-月:指定月為季度末吵瞻,每個季度末最后一月的最后一個工作日
# BA-月:每年指定月份的最后一個工作日
print(pd.date_range('2017','2018', freq = 'MS'))?
print(pd.date_range('2017','2020', freq = 'QS-DEC'))?
print(pd.date_range('2017','2020', freq = 'AS-DEC'))
print('------')
# M:每月第一個日歷日
# Q-月:指定月為季度末葛菇,每個季度末最后一月的第一個日歷日
# A-月:每年指定月份的第一個日歷日
print(pd.date_range('2017','2018', freq = 'BMS'))?
print(pd.date_range('2017','2020', freq = 'BQS-DEC'))?
print(pd.date_range('2017','2020', freq = 'BAS-DEC'))
print('------')
# BM:每月第一個工作日a
# BQ-月:指定月為季度末,每個季度末最后一月的第一個工作日
# BA-月:每年指定月份的第一個工作日
pd.date_range()-日期范圍橡羞,復合頻率
print(pd.date_range('2017/1/1','2017/2/1',freq='7D'))# 7天
print(pd.date_range('2017/1/1','2017/2/1',freq='2h30min'))# 2.5小時
print(pd.date_range('2017/1/1','2018/2/1',freq='2MS'))#每間隔2個月眯停,每月第一個日歷日