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 () 的应用。