【Python数据科学手册】Pandas——十二、处理时间序列

十二、处理时间序列

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。

  1. pd.to_datetime()可以将很多日期格式解析成pandas.timestamp,任何 DatetimeIndex 类型都可以通过 to_period() 方法和一个频率代码转换成 PeriodIndex类型。
    在这里插入图片描述
    当用一个日期减去另一个日期时,返回的结果是 TimedeltaIndex 类型
    在这里插入图片描述
  2. 有规律的时间序列
    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 操作类似的结果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章