十二、处理时间序列
1.Python的日期与时间工具
1)Python原生的日期使劲按工具:datetime和dateutil
datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
2)时间类型数组:Numpy的datetime64类型
性能相对原生工具好
NumPy 会自动判断输入时间需要使用的时间单位,也可使设置格式。
代码 | 含义 | 时间跨度 (相对) | 时间跨度 (绝对) |
---|---|---|---|
Y | 年(year) | ± 9.2e18 年 | [9.2e18 BC, 9.2e18 AD] |
M | 月(month) | ± 7.6e17 年 | [7.6e17 BC, 7.6e17 AD] |
W | 周(week) | ± 1.7e17 年 | [1.7e17 BC, 1.7e17 AD] |
D | 日(day) | ± 2.5e16 年 | [2.5e16 BC, 2.5e16 AD] |
h | 时(hour) | ± 1.0e15 年 | [1.0e15 BC, 1.0e15 AD] |
m | 分(minute) | ± 1.7e13 年 | [1.7e13 BC, 1.7e13 AD] |
s | 秒(second) | ± 2.9e12 年 | [ 2.9e9 BC, 2.9e9 AD] |
ms | 毫秒(millisecond) | ± 2.9e9 年 | [ 2.9e6 BC, 2.9e6 AD] |
us | 微秒(microsecond) | ± 2.9e6 年 | [290301 BC, 294241 AD] |
ns | 纳秒(nanosecond) | ± 292 年 | [ 1678 AD, 2262 AD] |
ps | 皮秒(picosecond) | ± 106 天 | [ 1969 AD, 1970 AD] |
fs | 飞秒(femtosecond) | ± 2.6 小时 | [ 1969 AD, 1970 AD] |
as | 原秒(attosecond) | ± 9.2 秒 | [ 1969 AD, 1970 AD] |
3)pandas的日期时间工具:Timestamp 对象
Pandas 所有关于日期与时间的处理方法全部都是通过 Timestamp 对象实现的,它利用numpy.datetime64 的有效存储和向量化接口将 datetime 和 dateutil 的易用性有机结合起来。
注释:datetime.timedelta对象代表两个时间之间的时间差,两个date或datetime对象相减就可以返回一个timedelta对象
2.Pandas时间序列:用时间作索引
Pandas时间序列工具非常适合用来处理带时间戳的索引数据。pd.DatetimeIndex可以构建一个时间index
同样可以使用series取值方法
再次基础上还可以汇总取值
3.Pandas时间序列数据结构
时间戳数据:原生timestamp- numpy.datetime64 -->pandas.timestamp。对应的索引数据结构是 DatetimeIndex。
时间周期数据: numpy.datetime64 将固定频率的时间间隔进行编码–>pandas.Period。对应的索引数据结构是 PeriodIndex。
时间增量和持续时间:原生datetime.timedelta -numpy.timedelta64->pands.Timedelta。对应的索引数据结构是 TimedeltaIndex。
- pd.to_datetime()可以将很多日期格式解析成pandas.timestamp,任何 DatetimeIndex 类型都可以通过 to_period() 方法和一个频率代码转换成 PeriodIndex类型。
当用一个日期减去另一个日期时,返回的结果是 TimedeltaIndex 类型
- 有规律的时间序列
pd.date_range() 可以处理时间戳、 pd.period_range() 可以处理周期、 pd.timedelta_range() 可以处理时间间隔。
pd.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, **kwargs)
4.时间频率与偏移量
代码 | 描述 | 代码 | 描述 |
---|---|---|---|
D | 天(calendar day,按日历算,含双休日) | B | 天(business day,仅含工作日) |
W | 周(weekly) | ||
M | 月末(month end) | BM | 月末(business month end,仅含工作日) |
Q | 季末(quarter end) | BQ | 季末(business quarter end,仅含工作日) |
A | 年末(year end) | BA | 年末(business year end,仅含工作日) |
H | 小时(hours) | BH | 小时(business hours,工作时间) |
T | 分钟(minutes) | ||
S | 秒(seconds) | ||
L | 毫秒(milliseonds) | ||
U | 微秒(microseconds) | ||
N | 纳秒(nanoseconds) |
代码 | 频率 |
---|---|
MS | 月初(month start) |
BMS | 月初(business month start,仅含工作日) |
QS | 季初(quarter start) |
BQS | 季初(business quarter start,仅含工作日) |
AS | 年初(year start) |
BAS | 年初(business year start,仅含工作日) |
在频率代码后面加三位月份缩写字母来改变季、年频率的开始时间
所有这些频率代码都对应 Pandas 时间序列的偏移量,具体内容可以在pd.tseries.offsets模块中找到。例如from pandas.tseries.offsets import BDay
,参数freq=BDay()
等价与freq='B'
5.重新取样、迁移和窗口
1)重新取样与频率转换
处理时间序列数据时,经常需要按照新的频率(更高频率、更低频率)对数据进行重新取样。你可以通过 resample() 方法解决这个问题,或者用更简单的 asfreq() 方法。这两个方法的主要差异在于, resample() 方法是以数据累计(data aggregation,计算平均之类)为基础,而asfreq() 方法是以数据选择(data selection,最后一天之类)为基础。
2)时间迁移
另一种常用的时间序列操作是对数据按时间进行迁移。 Pandas 有两种解决这类问题的方法: shift() 和 tshift()。简单来说, shift() 就是迁移数据,而 tshift() 就是迁移索引。
3) 移动时间窗口
Pandas 处理时间序列数据的第 3 种操作是移动统计值(rolling statistics)。这些指标可以通过 Series 和 DataFrame 的 rolling() 属性来实现,它会返回与 groupby 操作类似的结果