一、datetime模塊
1.datetime構(gòu)造
import datetime
date=datetime.date(2018,3,2)
date
Out[ ]:datetime.date(2018, 3, 2)
date.year
Out[ ]:2018
date.month
Out[ ]:3
time=datetime.time(9,10,34)
time
Out[ ]:datetime.time(9, 10, 34)
time.second
Out[ ]:34
time.hour
Out[ ]:9
now=datetime.datetime.now()
now
Out[ ]:datetime.datetime(2020, 7, 4, 17, 20, 12, 682627)
timedelta類數(shù)據(jù)為兩個(gè)datetime類數(shù)據(jù)的差,可通過datetime類對(duì)象加或減timedelta類對(duì)象,來獲取新的datetime類對(duì)象。
delta=now-datetime.datetime(2018,3,5,9,12)
delta
Out[ ]:datetime.timedelta(days=852, seconds=29720, microseconds=911440)
delta2=now+datetime.timedelta(10)
delta2
Out[ ]:datetime.datetime(2020, 7, 14, 17, 27, 20, 911440)
2.數(shù)據(jù)轉(zhuǎn)換
轉(zhuǎn)化為字符串
test=datetime.datetime(2018,5,12)
test
Out[ ]:datetime.datetime(2018, 5, 12, 0, 0)
str(test)
Out[ ]:'2018-05-12 00:00:00'
轉(zhuǎn)化為特定格式的字符串
test.strftime('%Y/%m/%d')
Out[ ]:'2018/05/12'
test.strftime('%W')
Out[ ]:'19'
通過datetime.strptime方法可以將字符串格式轉(zhuǎn)換為datetime數(shù)據(jù)類型
value='2018-4-12'
datetime.datetime.strptime(value,'%Y-%m-%d')
Out[ ]:datetime.datetime(2018, 4, 12, 0, 0)
在pandas中,可以通過to_datetime方法將一列字符串轉(zhuǎn)換為時(shí)間數(shù)據(jù)
salary['HireDate']=pd.to_datetime(salary['HireDate'])
二、時(shí)間序列基礎(chǔ)
1.時(shí)間序列構(gòu)造
pandas 中的時(shí)間序列指的是以時(shí)間數(shù)據(jù)為索引的Series或DataFrame
import numpy as np
import pandas as pd
from datetime import datetime
date=[datetime(2018,4,1),datetime(2018,4,5),
datetime(2018,4,7),datetime(2018,4,9),
datetime(2018,4,10),datetime(2018,4,15)]
s=pd.Series(np.arange(6),index=date)
s
Out[ ]:
2018-04-01 0
2018-04-05 1
2018-04-07 2
2018-04-09 3
2018-04-10 4
2018-04-15 5
dtype: int32
2.索引與切片
s['20180415']
Out[ ]:5
s['2018/4/1']
Out[ ]:0
s['20180405':'20180411']
Out[ ]:
2018-04-05 1
2018-04-07 2
2018-04-09 3
2018-04-10 4
dtype: int32
s[datetime(2018,4,7):]
Out[ ]:
2018-04-07 2
2018-04-09 3
2018-04-10 4
2018-04-15 5
dtype: int32
對(duì)于長時(shí)間序列來說,可以通過年、月來輕松獲取時(shí)間序列的切片。
date2=[datetime(2018,4,1),datetime(2018,4,5),
datetime(2018,4,13),datetime(2018,4,27),
datetime(2018,9,4),datetime(2018,9,8),
datetime(2019,3,2),datetime(2019,6,17)]
s2=pd.Series(np.arange(8),index=date2)
s2
Out[ ]:
2018-04-01 0
2018-04-05 1
2018-04-13 2
2018-04-27 3
2018-09-04 4
2018-09-08 5
2019-03-02 6
2019-06-17 7
dtype: int32
s2['2018']
Out[ ]:
2018-04-01 0
2018-04-05 1
2018-04-13 2
2018-04-27 3
2018-09-04 4
2018-09-08 5
dtype: int32
s2['2018-04']
Out[ ]:
2018-04-01 0
2018-04-05 1
2018-04-13 2
2018-04-27 3
dtype: int32
三、日期
1. 日期范圍
使用pd.date_range函數(shù)可以創(chuàng)建指定長度的DatetimeIndex索引,默認(rèn)時(shí)間頻率是天,通過freq參數(shù)可以使用其他頻率。
index=pd.date_range('2018/4/1','2018/5/30')
index
Out[ ]:
DatetimeIndex(['2018-04-01', '2018-04-02', '2018-04-03', '2018-04-04',
'2018-04-05', '2018-04-06', '2018-04-07', '2018-04-08',
'2018-04-09', '2018-04-10', '2018-04-11', '2018-04-12',
'2018-04-13', '2018-04-14', '2018-04-15', '2018-04-16',
'2018-04-17', '2018-04-18', '2018-04-19', '2018-04-20',
'2018-04-21', '2018-04-22', '2018-04-23', '2018-04-24',
'2018-04-25', '2018-04-26', '2018-04-27', '2018-04-28',
'2018-04-29', '2018-04-30', '2018-05-01', '2018-05-02',
'2018-05-03', '2018-05-04', '2018-05-05', '2018-05-06',
'2018-05-07', '2018-05-08', '2018-05-09', '2018-05-10',
'2018-05-11', '2018-05-12', '2018-05-13', '2018-05-14',
'2018-05-15', '2018-05-16', '2018-05-17', '2018-05-18',
'2018-05-19', '2018-05-20', '2018-05-21', '2018-05-22',
'2018-05-23', '2018-05-24', '2018-05-25', '2018-05-26',
'2018-05-27', '2018-05-28', '2018-05-29', '2018-05-30'],
dtype='datetime64[ns]', freq='D')
index=pd.date_range('2018/4/1','2018/12/31',freq='M')
index
Out[ ]:
DatetimeIndex(['2018-04-30', '2018-05-31', '2018-06-30', '2018-07-31',
'2018-08-31', '2018-09-30', '2018-10-31', '2018-11-30',
'2018-12-31'],
dtype='datetime64[ns]', freq='M')
在pd.date_range函數(shù)中傳入起始或結(jié)束日期,再用period參數(shù)傳入一個(gè)表示一段時(shí)間的數(shù)據(jù),就可以創(chuàng)建指定長度的DatetimeIndex索引。
pd.date_range(start='2018/4/1',periods=20)
Out[ ]:
DatetimeIndex(['2018-04-01', '2018-04-02', '2018-04-03', '2018-04-04',
'2018-04-05', '2018-04-06', '2018-04-07', '2018-04-08',
'2018-04-09', '2018-04-10', '2018-04-11', '2018-04-12',
'2018-04-13', '2018-04-14', '2018-04-15', '2018-04-16',
'2018-04-17', '2018-04-18', '2018-04-19', '2018-04-20'],
dtype='datetime64[ns]', freq='D')
pd.date_range(end='2018/4/1',periods=20)
Out[ ]:
DatetimeIndex(['2018-03-13', '2018-03-14', '2018-03-15', '2018-03-16',
'2018-03-17', '2018-03-18', '2018-03-19', '2018-03-20',
'2018-03-21', '2018-03-22', '2018-03-23', '2018-03-24',
'2018-03-25', '2018-03-26', '2018-03-27', '2018-03-28',
'2018-03-29', '2018-03-30', '2018-03-31', '2018-04-01'],
dtype='datetime64[ns]', freq='D')
2. 頻率與移動(dòng)
- 時(shí)間序列的常用基礎(chǔ)頻率
D:每日歷日
B:每工作日
H:每小時(shí)
T或者min:每分鐘
S:每秒
pd.date_range(start='2018/4/1',periods=20,freq='2H20min38S')
Out[ ]:
DatetimeIndex(['2018-04-01 00:00:00', '2018-04-01 02:20:38',
'2018-04-01 04:41:16', '2018-04-01 07:01:54',
'2018-04-01 09:22:32', '2018-04-01 11:43:10',
'2018-04-01 14:03:48', '2018-04-01 16:24:26',
'2018-04-01 18:45:04', '2018-04-01 21:05:42',
'2018-04-01 23:26:20', '2018-04-02 01:46:58',
'2018-04-02 04:07:36', '2018-04-02 06:28:14',
'2018-04-02 08:48:52', '2018-04-02 11:09:30',
'2018-04-02 13:30:08', '2018-04-02 15:50:46',
'2018-04-02 18:11:24', '2018-04-02 20:32:02'],
dtype='datetime64[ns]', freq='8438S')
- 移動(dòng)數(shù)據(jù)是沿著時(shí)間索引將數(shù)據(jù)向前移或者向后移,通過用shift方法可以完成移動(dòng)數(shù)據(jù)操作。
date4=pd.date_range('2018/4/1',periods=5)
s=pd.Series(np.arange(5),index=date4)
s
Out[ ]:
2018-04-01 0
2018-04-02 1
2018-04-03 2
2018-04-04 3
2018-04-05 4
Freq: D, dtype: int32
s.shift(2)
Out[ ]:
2018-04-01 NaN
2018-04-02 NaN
2018-04-03 0.0
2018-04-04 1.0
2018-04-05 2.0
Freq: D, dtype: float64
s.shift(-2)
Out[ ]:
2018-04-01 2.0
2018-04-02 3.0
2018-04-03 4.0
2018-04-04 NaN
2018-04-05 NaN
Freq: D, dtype: float64
如果再shift方法中傳入頻率參數(shù)freq,就是修改索引了。
s.shift(2,freq='D')
Out[ ]:
2018-04-03 0
2018-04-04 1
2018-04-05 2
2018-04-06 3
2018-04-07 4
Freq: D, dtype: int32
四、時(shí)期
1. 時(shí)期基礎(chǔ)
Peries可以創(chuàng)建時(shí)期數(shù)據(jù)類型,傳入字符串或者整數(shù)、頻率即可。
p=pd.Period(2018,'A-DEC')
p
Out[ ]:
Period('2018', 'A-DEC')
p+2
Out[ ]:
Period('2020', 'A-DEC')
類似于pd.date_range,pd.period_range函數(shù)可以創(chuàng)建時(shí)期范圍,PeriodIndex索引同樣可以構(gòu)造Series或者DataFrame。
date5=pd.period_range('2018/4/1','2018/10/5',freq='M')
date5
Out[ ]:
PeriodIndex(['2018-04', '2018-05', '2018-06', '2018-07', '2018-08', '2018-09',
'2018-10'],
dtype='period[M]', freq='M')
2. 頻率轉(zhuǎn)換
Period和PeriodIndex對(duì)象可以通過asfreq方法轉(zhuǎn)換頻率,如將年度轉(zhuǎn)換為月度。
p=pd.Period(2018,freq='A-DEC')
p
Out[ ]:
Period('2018', 'A-DEC')
p.asfreq('M',how='start')
Out[ ]:
Period('2018-01', 'M')
date6=pd.period_range('2014','2018',freq='A-DEC')
date6
Out[ ]:
PeriodIndex(['2014', '2015', '2016', '2017', '2018'], dtype='period[A-DEC]', freq='A-DEC')
ps=pd.Series(np.arange(5),index=date6)
ps
Out[ ]:
2014 0
2015 1
2016 2
2017 3
2018 4
Freq: A-DEC, dtype: int32
利用to_period方法可以將由時(shí)間戳索引的時(shí)間序列數(shù)據(jù)轉(zhuǎn)換為以時(shí)期為索引,通過to_timestamp方法可以進(jìn)行逆操作。
date7=pd.date_range('2018/4/1',periods=4,freq='M')
s=pd.Series(np.arange(4),index=date7)
s
Out[ ]:
2018-04-30 0
2018-05-31 1
2018-06-30 2
2018-07-31 3
Freq: M, dtype: int32
ps=s.to_period()
ps
Out[ ]:
2018-04 0
2018-05 1
2018-06 2
2018-07 3
Freq: M, dtype: int32
五、頻率轉(zhuǎn)換與重采樣
1. 重采樣
pd.resample用于各種頻率的轉(zhuǎn)換工作,如將間隔為‘天’的頻率聚合轉(zhuǎn)換為‘月度’的頻率。
date=pd.date_range('2018/4/1',periods=100,freq='D')
s=pd.Series(np.arange(100),index=date)
s.head(10)
Out[ ]:
2018-04-01 0
2018-04-02 1
2018-04-03 2
2018-04-04 3
2018-04-05 4
2018-04-06 5
2018-04-07 6
2018-04-08 7
2018-04-09 8
2018-04-10 9
Freq: D, dtype: int32
s.resample('M').mean()
Out[ ]:
2018-04-30 14.5
2018-05-31 45.0
2018-06-30 75.5
2018-07-31 95.0
Freq: M, dtype: float64