一、datetime模块
1.datetime构造
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类数据为两个datetime类数据的差,可通过datetime类对象加或减timedelta类对象,来获取新的datetime类对象。
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.数据转换
转化为字符串
test=datetime.datetime(2018,5,12)
test
Out[ ]:datetime.datetime(2018, 5, 12, 0, 0)
str(test)
Out[ ]:'2018-05-12 00:00:00'
转化为特定格式的字符串
test.strftime('%Y/%m/%d')
Out[ ]:'2018/05/12'
test.strftime('%W')
Out[ ]:'19'
通过datetime.strptime方法可以将字符串格式转换为datetime数据类型
value='2018-4-12'
datetime.datetime.strptime(value,'%Y-%m-%d')
Out[ ]:datetime.datetime(2018, 4, 12, 0, 0)
在pandas中,可以通过to_datetime方法将一列字符串转换为时间数据
salary['HireDate']=pd.to_datetime(salary['HireDate'])
二、时间序列基础
1.时间序列构造
pandas 中的时间序列指的是以时间数据为索引的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
对于长时间序列来说,可以通过年、月来轻松获取时间序列的切片。
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函数可以创建指定长度的DatetimeIndex索引,默认时间频率是天,通过freq参数可以使用其他频率。
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函数中传入起始或结束日期,再用period参数传入一个表示一段时间的数据,就可以创建指定长度的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:每日历日
B:每工作日
H:每小时
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')
- 移动数据是沿着时间索引将数据向前移或者向后移,通过用shift方法可以完成移动数据操作。
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方法中传入频率参数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
四、时期
1. 时期基础
Peries可以创建时期数据类型,传入字符串或者整数、频率即可。
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函数可以创建时期范围,PeriodIndex索引同样可以构造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. 频率转换
Period和PeriodIndex对象可以通过asfreq方法转换频率,如将年度转换为月度。
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方法可以将由时间戳索引的时间序列数据转换为以时期为索引,通过to_timestamp方法可以进行逆操作。
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
五、频率转换与重采样
1. 重采样
pd.resample用于各种频率的转换工作,如将间隔为‘天’的频率聚合转换为‘月度’的频率。
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