在 Pandas 中关于时间序列的常见对象有 6 种,分别是 Timestamp(时间戳)、DatetimeIndex(时间戳索引)、Period(时间段)、PeriodIndex(时间段索引)、以时间为元素的 Series 和以及以时间索 引的 DataFrame。
Timestamp
时间戳表示时间轴上的某一点,以下不同代码都可以生成相同时间戳。
传入一个三元组
传入一个时间格式的字符串
传入一个时间对象
Period 时间段表示时间轴上的某一区间,以下代码都可以生成相同时间段。
时间段可以通过加减法来进行变化
Period() 函数后面通常有两个参数,第二个 freq 参数决定时间段的分割长度。
Pandas 中常用 to_datetime() 函数可以创建以时间为元素的 Series。
要生成带有时间戳的索引,可以使用 DatetimeIndex() 构造函数,并传入列表或 Series 对象:
实际运用中我们经常需要大量的的时间戳的索引。可以使用 date_range() 和 bdate_range() 来批量创建相同时间间隔的时间戳索引。
创建以 2018 年 9 月 30 日为开始的 250 条时间索引,相邻索引间隔时间长度为一天。
创建以 2018 年 10 月 1 日为开始的 111 条时间索引,相邻索引间隔时间长度为一个工作日。
在 date_range() 和 bdate_range() 中可以巧妙使用 start,end, periods,freq 等参数的各种 组合轻松批量创建时间索引。
在 2017 年 10 月 1 日到 2018 年 10 月 1 日间,每隔一周创建一条索引。
对于频率的参数可参照附录中的表1
同时,时间段和时间戳都可以作为索引
下面是时间戳作为索引的例子
下面是时间段作为索引的例子
时间段也可以作为索引创建DataFrame 对象。在 2017 年第一季度和 2018 年第四季度之间每隔一个季度创建一条索引。
就以前面的dataframe为例
使用 truncate() 切下 2017 年 11 月 26 日与 2018 年 4 月 29 日间的记录。
除了元素可以被移动,索引本身也能被移动,需要加上 freq 参数。将索引列向上移动一条:
如图所示,索引被整体移动了
重采样可以通俗得理解为改变时间索引的个数,通过增大或减小相邻索引的时间间隔以达到减小或 增加索引数量的效果,在 Pandas 中使用 resample() 函数。
重采样生成的类似GroupBy
上采样:减小时间间隔频率,增加记录的数量。
原来间隔为日的索引列,间隔被缩小成 12 小时,增加采样点的值为空值。
fill() 函数可以将新增的索引值以相邻的前一条索引值进行填充。
也可使用插值方法
用agg方法可以同时使用多种求职类型
r.agg({'A': ['sum', 'std'], 'B': ['mean', 'std']})
还有类似这种方法可供使用
首先要导入 pandas.tseries.offsets 模块,Pandas 所有常用时间类都在该模块中。
使用 DateOffset() 实现时间戳位移。
也可以用时间戳加减常用时间类以实现时间戳位移。向前移动 10 个工作日
from pandas.tseries.offsets import BDay d - 10 * BDay()
向后移动一个月末。
from pandas.tseries.offsets import BMonthEnd d + BMonthEnd()
个性化定制日期。虽然日历规定年末是 12 月,加入参数后相当于人为规定 2 月是年末。 向后移动到上两个年末。
from pandas.tseries.offsets import YearEnd d + YearEnd(month=2)
向前移动到上一个周四。
from pandas.tseries.offsets import Week d - Week(weekday=4)
可以使用 rollforward() 将指定时间向前或向后移动到一个制定常用时间类的时间戳上。将时间 移动到下一个月末:
offset = BMonthEnd() offset.rollforward(d)