Pandas 时间序列相关总结
1. 前言
前面四小节我们通过 Pandas 时间序列的概述,常用三种时间序列类型的创建、常用属性和方法,以及对应的索引类型的的创建和使用等知识的学习,基本掌握了时间序列数据类型的处理方法,本小节我们将对时间序列的相关知识进行总结,以及这三种常用时间序列类型的相互转换,通过进一步的学习,帮助我们今后更加高效的处理和分析时间序列相关的数据集。
2. 频率和偏移
我们在学习三种时间序列类型时,经常会接触到创建对象时指定的频率和时间偏移量,Pandas 时间序列中提供了时间或日期偏移量,对于每一个偏移量的 Pandas 都有对应的频率值:
频率值 | 偏移量 | 说明 |
---|---|---|
D | Day | 日历日 |
H | Hour | 小时 |
T 或 min | Minute | 分 |
S | Second | 秒 |
L 或 ms | Milli | 毫秒 |
U | Micro | 微秒 |
M | MonthEnd | 每月最后一个日历日 |
BM | BusinessMonthEnd | 每月最后一个工作日 |
3. 时间序列类型转换
我们在用到时间序列的三种常用类型时,经常要用到他们之间的相互转换,便于我们对数据的进一步分析处理。下面我们就来学习一下用于时间序列类型转换的三个函数:
2.1 to_datetime() 函数
该函数将数据值转换为时间戳。
pd.to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False, utc=None, box=True, format=None, exact=True, unit=None, infer_datetime_format=False, origin='unix', cache=True)
参数名 | 说明 |
---|---|
arg | 要转为时间戳对象的内容,类型可以为 str、int、float 等等 |
errors | 对于无效解析的相应方式有三种值:ignore,raise,coerce,默认是 raise |
exact | 精度 |
format | 解析出来的时间格式 |
下面我们通过代码演示将一个日期时间格式的字符串转换为时间戳 Timestamp :
# 导入 pandas 数据包
import pandas as pd
# 通过 to_datetime() 将 str 数据类型 函数转换为 时间戳
pd.to_datetime('2020-01-03')
# --- 输出结果 ---
Timestamp('2020-01-03 00:00:00')
2.2 to_period() 函数
该函数用于将时间戳转换为时期数据。转换时要指定转换的频率,因为时间戳表示的是固定的时间点,而时期表示的是时间区间。
# 导入 pandas 数据包
import pandas as pd
tms_res=pd.Timestamp('2020-11-23 10:40:00')
print(tms_res)
# --- 输出结果 ---
2020-11-23 10:40:00
# 通过 to_period 函数指定转换频率,转换成时期对象
period_res=tms_res.to_period('H')
print(period_res)
print(type(period_res))
# --- 输出结果 ---
2020-11-23 10:00
<class 'pandas._libs.tslibs.period.Period'>
2.3 to_timestamp() 函数
该函数用于将时期数据转换为时间戳。
# 导入 pandas 数据包
import pandas as pd
# 定义时期对象
period_res=pd.Period('2020-11-23 10:40')
print(period_res)
# --- 输出结果 ---
2020-11-23 10:40
# 通过函数 to_timetamp() 转换为 时间戳
tms_res=period_res.to_timestamp()
print(tms_res)
print(type(tms_res))
# --- 输出结果 ---
2020-11-23 10:40:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
# 还可以通过 how 参数指定日期的开始还是结束时间进行转换为时间戳
tms_res=period_res.to_timestamp(how='end')
print(tms_res)
# --- 输出结果 ---
2020-11-23 10:40:59.999999999
4. 重采样
Pandas 时间序列重采样,是指将时间序列从一个频率转换为另外一个频率的操作,主要是通过函数 resample () 进行实现的,采样又可以分为降采样(高频率的数据聚合到低频率的数据),升采样(低频率数据转换为高频率数据)。
resample(rule, axis=0, closed=None, label=None, convention='start', kind=None, loffset=None, base=None, on=None, level=None, origin='start_day', offset=None)
下面是该函数常用参数的说明:
参数名 | 说明 |
---|---|
rule | 转换的偏移规则 |
axis | 默认是纵轴 (axis=0) |
closed | 降采样时,哪一端是闭合的,默认是 right |
label | 降采样时,设置聚合值的标签 |
convention | 重采样时期时,低频率转换为高频率所采用的约定,默认是 end |
下面我们通过代码演示一下该函数的使用:
# 导入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第25小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)
# --- 输出结果 ---
时间 人数 销售数量
0 2020-01-02 12:25:00 12 234
1 2020-01-02 12:30:00 23 300
2 2020-01-02 12:35:00 44 345
3 2020-01-02 12:40:00 56 401
4 2020-01-02 12:45:00 60 420
5 2020-01-02 12:50:00 70 623
# 将时间列的 str 值转换为 时间戳索引
data.index=pd.to_datetime(data['时间'])
del(data['时间'])
print(data)
# --- 输出结果 ---
人数 销售数量
时间
2020-01-02 12:25:00 12 234
2020-01-02 12:30:00 23 300
2020-01-02 12:35:00 44 345
2020-01-02 12:40:00 56 401
2020-01-02 12:45:00 60 420
2020-01-02 12:50:00 70 623
# 1. 降采样 我们之前的采样的频率为 5 分钟,我们将采样频率调整为 10 分钟
ss=data.resample('10MIN').mean()
print(ss)
# --- 输出结果 ---
人数 销售数量
时间
2020-01-02 12:20:00 12.0 234.0
2020-01-02 12:30:00 33.5 322.5
2020-01-02 12:40:00 58.0 410.5
2020-01-02 12:50:00 70.0 623.0
# 2.升采样 我们将之前的采样频率 5 分钟,改成 2 分钟进行重采样,这里注意 默认使用 NaN 进行填充
ss=data.resample('3MIN').mean()
print(ss)
# --- 输出结果 ---
人数 销售数量
时间
2020-01-02 12:24:00 12.0 234.0
2020-01-02 12:27:00 NaN NaN
2020-01-02 12:30:00 23.0 300.0
2020-01-02 12:33:00 44.0 345.0
2020-01-02 12:36:00 NaN NaN
2020-01-02 12:39:00 56.0 401.0
2020-01-02 12:42:00 NaN NaN
2020-01-02 12:45:00 60.0 420.0
2020-01-02 12:48:00 70.0 623.0
5. 小结
本小节我们主要对时间序列的知识进行总结,主要包括时间序列频率和偏移的概念,数据类型之间的转换,数据的重采样。本节课程的重点如下:
- 时间序列数据类型之间的转换函数 to_datetime () , to_period () , to_timestamp ();
- 重采样函数 resample () 的应用。