一、日期范围、频率和移位
(1)日期范围
1.使用data_range函数可以创建指定长度的DatetimeIndex索引
import pandas as pd
index=pd.date_range('2021-9-12','2021-10-1')
index
结果:
DatetimeIndex(['2018-12-28', '2018-12-29', '2018-12-30', '2018-12-31',
'2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
'2019-01-05', '2019-01-06', '2019-01-07', '2019-01-08',
'2019-01-09', '2019-01-10'],
dtype='datetime64[ns]', freq='D')
在默认情况下,产生的DatetimeIndex索引的间隔为天,如果只传递一个起始或结束日期,则必须传递一个用于生成范围的数字
2.在date_range中指定开始日期和长度
index=pd.date_range(start='2021-9-1',periods=6)
index
结果:
DatetimeIndex(['2021-09-01', '2021-09-02', '2021-09-03', '2021-09-04',
'2021-09-05', '2021-09-06'],
dtype='datetime64[ns]', freq='D')
3.在date_range中指定结束日期和长度
index=pd.date_range(end='2021-9-8',periods=4)
index
结果:
DatetimeIndex(['2021-09-05', '2021-09-06', '2021-09-07', '2021-09-08'], dtype='datetime64[ns]', freq='D')
(2)频率和移位
时间序列的频率由基础频率和日期偏置组成,可以通过freq参数使用其他频率,基础时间序列频率如下:
类型 | 偏置类型 | 描述 |
---|---|---|
D | Day | 日历中的每天 |
B | BusinessDay | 工作日的每天 |
H | Hour | 每小时 |
T或min | Minute | 每分钟 |
S | Second | 每秒 |
M | MonthEnd | 每月最后一个工作日 |
BM | BusinessMonthEnd | 工作日的月底日期 |
MS | MonthBegin | 工作日的月初日期 |
A-JAN | BusinessYearEnd | 每月指定月份的最后一个日历日(A-接JAN\FEB等) |
1.使用freq设置频率‘M’
import pandas as pd
index = pd.date_range('2021-3-10','2021-9-8',freq = 'M')
index
结果:
DatetimeIndex(['2021-03-31', '2021-04-30', '2021-05-31', '2021-06-30',
'2021-07-31', '2021-08-31'],
dtype='datetime64[ns]', freq='M')
2.使用freq设置频率‘2H’
index = pd.date_range(start = '2021-9-8',periods = 4,freq = '2H')
index
结果:
DatetimeIndex(['2021-09-08 00:00:00', '2021-09-08 02:00:00',
'2021-09-08 04:00:00', '2021-09-08 06:00:00'],
dtype='datetime64[ns]', freq='2H')
3.设置频率字符串
index = pd.date_range(start = '2021-9-8',periods = 4,freq = '2H15T15S')
index
结果:
DatetimeIndex(['2021-09-08 00:00:00', '2021-09-08 02:15:15',
'2021-09-08 04:30:30', '2021-09-08 06:45:45'],
dtype='datetime64[ns]', freq='8115S')
“位移”是指将日期向前或向后移动,Series和DataFrame都有一个shift方法用于简单地前向或后向移位,而不改变索引。
4.时间数据的移位
wdate = pd.Series(np.random.randn(4),index = pd.date_range('2021/9/18',periods = 4,freq = 'M'))
print(wdate)
wdate.shift(2)
结果:
2021-09-30 1.353133
2021-10-31 2.249730
2021-11-30 0.772792
2021-12-31 1.400437
Freq: M, dtype: float64
2021-09-30 NaN
2021-10-31 NaN
2021-11-30 1.353133
2021-12-31 2.249730
Freq: M, dtype: float64
单纯的移动不会修改索引,而是使部分数据被丢弃,如果在shift方法中传入频率参数,这样就会修改索引了
5.在shift方法中传入频率参数修改索引
wdate.shift(2,freq='D')
结果:
2021-10-02 1.353133
2021-11-02 2.249730
2021-12-02 0.772792
2022-01-02 1.400437
dtype: float64
二、时期
时期表示的是时间区间,如数天、数月或数年等
Period可以创建时期型的数据,传入字符串、整数或频率即可
1.使用Period可以创建时期型数据
w = pd.Period(2021,freq = 'A-DEC')
print(w)
print(w+2)
结果:
2021
2023
2.PeriodIndex索引的用法
wdate = pd.period_range('2021/6/1','2021/11/1',freq = 'M')
pd.Series(np.arange(6),index = wdate)
结果:
2021-06 0
2021-07 1
2021-08 2
2021-09 3
2021-10 4
2021-11 5
Freq: M, dtype: int32
3.频率转换
p = pd.Period(2021,freq = 'A-FEB')
print(p.asfreq('M',how = 'start'))
print(p.asfreq('M',how = 'end'))
结果:
2020-03
2021-02
4.日期数据的转换
w = pd.date_range('2021/6/1','2021/11/1',freq = 'M')
y = pd.Series(np.arange(5),index = w)
print(y)
ps = y.to_period()
print(ps)
结果:
2021-06-30 0
2021-07-31 1
2021-08-31 2
2021-09-30 3
2021-10-31 4
Freq: M, dtype: int32
2021-06 0
2021-07 1
2021-08 2
2021-09 3
2021-10 4
Freq: M, dtype: int32
三、重采样、降采样和升采样
1.将间隔为天的频率转换为间隔为月的频率
w = pd.date_range(start = '2021/9/1',periods = 100,freq = 'D')
y = pd.Series(np.arange(100),index = w)
print(y.head(8))
ps = y.resample('M').mean()
print(ps)
结果:
2021-09-01 0
2021-09-02 1
2021-09-03 2
2021-09-04 3
2021-09-05 4
2021-09-06 5
2021-09-07 6
2021-09-08 7
Freq: D, dtype: int32
2021-09-30 14.5
2021-10-31 45.0
2021-11-30 75.5
2021-12-31 95.0
Freq: M, dtype: float64
resample方法的参数与描述
参数 | 描述 |
---|---|
freq | 转换频率 |
axies=0 | 重采样的轴 |
closed=‘right’ | 在降采样中,设置各时间段哪端是闭合的 |
label=‘right’ | 在降采样中,如何设置聚合值的标签 |
loffset=None | 设置时间偏移 |
kind=None | 聚合到时期,默认为时间序列的索引类型 |
convention | 升采样采用的约定(start或end),默认为end |
2.降采样
wdate = pd.date_range(start = '2021/9/1',periods = 10,freq = 'D')
w = pd.Series(np.arange(10),index = wdate)
print(w)
w.resample('3D',closed = 'right',label = 'right').sum()
结果:
2021-09-01 0
2021-09-02 1
2021-09-03 2
2021-09-04 3
2021-09-05 4
2021-09-06 5
2021-09-07 6
2021-09-08 7
2021-09-09 8
2021-09-10 9
Freq: D, dtype: int32
2021-09-01 0
2021-09-04 6
2021-09-07 15
2021-09-10 24
Freq: 3D, dtype: int32
3.升采样
在升采样中主要是数据的插值,即对缺失值进行填充
ydata = [datetime.datetime(2021,9,1),datetime.datetime(2021,9,6)]
y = pd.Series([1,6],index = ydata)
print(y)
y.resample('D').ffill()
结果:
2021-09-01 1
2021-09-06 6
dtype: int64
2021-09-01 1
2021-09-02 1
2021-09-03 1
2021-09-04 1
2021-09-05 1
2021-09-06 6
Freq: D, dtype: int64