Pandas时间序列:重采样及频率转换方式

Pandas 时间序列:重采样及频率转换方式

在 Pandas 中,时间序列数据的处理是一种非常常见的操作。其中一个常用的工具就是重采样(resampling),其可以将时间序列的频率更改为另一个频率,比如将小时频率的数据转换成天频率的数据。本文将介绍 Pandas 中的重采样方法及其频率转换方式。

什么是重采样

重采样顾名思义就是重新采样,其目的是将原时间序列的数据转换成更加频繁或是不那么频繁的形式。在 Pandas 中,时间序列的重采样可以通过resample()方法来实现。

resample()方法的核心参数为rule参数,即重新采样的规则,可以是时间间隔也可以是某个时间点,具体的时间规则可以使用 Pandas 内置的时间散列字符串(参考文档Offset Aliases)。

使用 resample() 方法可以将时间序列的频率变得更加或者更少的规则,从而得到新的时间序列:

import pandas as pd
import numpy as np

# 构造时间序列数据
rng = pd.date_range('1/1/2018', periods=12, freq='T')
ts = pd.Series(np.arange(12), index=rng)

# 将数据重采样为每5分钟的频率
ts_resample = ts.resample('5T').sum()

print(ts)
print('-' * 30)
print(ts_resample)

运行上面的代码,输出结果如下:

2018-01-01 00:00:00     0
2018-01-01 00:01:00     1
2018-01-01 00:02:00     2
2018-01-01 00:03:00     3
2018-01-01 00:04:00     4
2018-01-01 00:05:00     5
2018-01-01 00:06:00     6
2018-01-01 00:07:00     7
2018-01-01 00:08:00     8
2018-01-01 00:09:00     9
2018-01-01 00:10:00    10
2018-01-01 00:11:00    11
Freq: T, dtype: int64
------------------------------
2018-01-01 00:00:00    10
2018-01-01 00:05:00    35
2018-01-01 00:10:00    21
Freq: 5T, dtype: int64

上面的代码通过 resample('5T').sum() 将原时间序列的频率变成了5分钟,结果显示了每五分钟之内的总和。首先原始时间序列的频率是每分钟一次,而通过变换后得到的是每5分钟的总和,同时对应于每5分钟的最后一条数据。

重采样的频率转换方式

在数据分析中,频率转换是一个常见的操作。例如,有一份每年的销售额数据,我们需要将其转换成每季度和每月的季度销售额。而 Pandas 中常用的涉及到时间序列的统计函数是与已知频率的数据(规律数据)相关的,如每日、每月、每季度,甚至是每年生命周期的统计。因此,我们在进行数据统计时,常常需要将数据转换成这些已知的频率。

我们通常使用以下方式中的一种来将数据转换成相对应频率的数据:

  • 重采样(resampling): 将数据从原始频率转换到另一种频率。数据会被聚合到新的频率间隔中,例如,从每分钟转换到每5分钟。
  • 向前填充和向后填充: 向前填充 (ffill) 和向后填充 (bfill) 是在将高频数据转换为低频数 据时使用的技术。向前填充将已知的值向低频望去的时间段上插入;向后填充将下一个已知值向望去的时间段上插入。例如:从每秒钟到每5分钟。
  • 插值(interpolation): 插值是一种从数据中提取信息的过程,它可以计算出在不同时间间隔内获得的数据。插值方式包括线性插值、最近邻插值、高阶插值等。

下面我们举两个例子进行更细致的解释。

重采样实例

我们先构造一份两周的时间序列数据,然后将其重采样为每小时,每天和每月:

import pandas as pd
import numpy as np

# 构造时间序列数据
rng = pd.date_range('1/1/2018', periods=14, freq='D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
print(ts)
print('-' * 30)

# 重采样为每小时
ts_hourly = ts.resample('H').mean()
print(ts_hourly)
print('-' * 30)

# 重采样为每天
ts_daily = ts.resample('D').mean()
print(ts_daily)
print('-' * 30)

# 重采样为每月
ts_monthly = ts.resample('M').mean()
print(ts_monthly)

输出结果为:

2018-01-01   -0.315093
2018-01-02    0.102139
2018-01-03    0.457386
2018-01-04    0.725825
2018-01-05    1.250042
2018-01-06   -1.473972
2018-01-07    0.447782
2018-01-08    0.193237
2018-01-09    0.473884
2018-01-10   -1.862161
2018-01-11    0.578145
2018-01-12    0.813398
2018-01-13    0.100000
2018-01-14   -0.468288
Freq: D, dtype: float64
------------------------------
2018-01-01 00:00:00   -0.315093
2018-01-01 01:00:00         NaN
2018-01-01 02:00:00         NaN
2018-01-01 03:00:00         NaN
2018-01-01 04:00:00         NaN
                         ...   
2018-01-13 19:00:00         NaN
2018-01-13 20:00:00         NaN
2018-01-13 21:00:00         NaN
2018-01-13 22:00:00         NaN
2018-01-13 23:00:00         NaN
Freq: H, Length: 336, dtype: float64
------------------------------
2018-01-01   -0.011925
2018-01-02    0.860529
2018-01-03   -0.020814
2018-01-04    0.598670
2018-01-05    0.138494
2018-01-06   -0.482595
2018-01-07    0.951332
2018-01-08    0.425560
2018-01-09   -0.282365
2018-01-10   -1.138321
2018-01-11   -0.041740
2018-01-12    1.068705
2018-01-13   -0.184144
2018-01-14   -0.468288
Freq: D, dtype: float64
------------------------------
2018-01-31    0.142121
Freq: M, dtype: float64

上面的代码通过 resample 方法将原始的时间序列按照不同的频率重新采样,其中:

  • ts_hourly = ts.resample('H').mean() 将时间序列的频率重采样为每小时,并且聚合方式为求均值。
  • ts_daily = ts.resample('D').mean() 将时间序列的频率重采样为每天,并且聚合方式为求均值。
  • ts_monthly = ts.resample('M').mean() 将时间序列的频率重采样为每月,并且聚合方式为求均值。

向前填充和向后填充实例

下面我们通过一个例子演示向前填充和向后填充。假设有一份每秒钟的数据,我们要将其转换为每5秒钟的数据,并使用向前填充的方式补充缺失的数据。

import pandas as pd
import numpy as np

# 构造时间序列数据
rng = pd.date_range('1/1/2018', periods=6, freq='S')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
print(ts)
print('-' * 30)

# 重采样为每5秒钟,向前填充
ts_resample = ts.resample('5S').ffill()
print(ts_resample)

输出结果为:

2018-01-01 00:00:00    1.232623
2018-01-01 00:00:01   -1.330196
2018-01-01 00:00:02   -0.114359
2018-01-01 00:00:03    1.144459
2018-01-01 00:00:04   -0.011030
2018-01-01 00:00:05    1.158529
Freq: S, dtype: float64
------------------------------
2018-01-01 00:00:00    1.232623
2018-01-01 00:00:05    1.158529
Freq: 5S, dtype: float64

上面的代码通过resample('5S').ffill()将原始的时间序列重采样为每5秒钟,并使用向前填充的方式补充缺失的数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pandas时间序列:重采样及频率转换方式 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • 教你使用Python根据模板批量生成docx文档

    教你使用Python根据模板批量生成docx文档 简介 docx是Microsoft Word的文档格式,使用Python可以根据给定模板批量生成docx文档。本文将会介绍如何使用Python进行docx文件的自动化生成。 安装所需模块 在进行下一步之前,需要安装以下模块: docx:处理docx文件格式的Python库。可通过这个链接进行安装。 pip i…

    python 2023年6月14日
    00
  • 详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法

    我给你详细讲解一下“详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法”。 1.使用pandas.DataFrame.values方法 首先,我们可以使用pandas.DataFrame.values方法将DataFrame转换成Numpy array。该方法返回一个二维数组,其中每一行对应于DataFrame中每一行数据…

    python 2023年5月14日
    00
  • 使用zip从列表中创建pandas数据框架

    首先,为了使用zip从列表中创建pandas数据框架,我们需要掌握以下步骤: 步骤1:导入必要的库和模块 首先需要导入需要的库和模块,即pandas。 import pandas as pd 步骤2:创建列表 接下来需要创建需要用于创建数据框架的列表。 例如,我们可以创建一个包含各列对应的列表,然后将它们组合成一个新的列表,如下所示: names = [‘A…

    python-answer 2023年3月27日
    00
  • pandas DataFrame.shift()函数的具体使用

    pandas提供了许多函数来处理数据集,其中shift()函数就是其中一个非常常用的函数,用于对DataFrame在行方向或列方向上进行位移操作。本篇攻略将详细讲解pandas的shift()函数的具体使用方法,包括函数参数、返回值、使用示例等。 函数参数 shift()函数有如下主要参数: periods: 整数,指定位移的距离,正数表示向下移动,负数表示…

    python 2023年5月14日
    00
  • pyspark自定义UDAF函数调用报错问题解决

    关于“pyspark自定义UDAF函数调用报错问题解决”的完整攻略,以下是具体步骤: 1. 定义自定义UDAF函数 首先,定义自定义UDAF函数的主要步骤如下: 1.继承 pyspark.sql.functions.UserDefinedAggregateFunction 类。 2.重写 initialize、update 和 merge 方法,分别实现聚合…

    python 2023年5月14日
    00
  • Pandas – 查找两个数据帧之间的差异

    背景介绍 我们在进行数据分析时,有时需要比较两个数据帧之间的差异。Pandas提供了许多方法来实现这个目标,今天我们将介绍其中的两种方法:merge和compare。通过本篇文章的学习,你将会掌握两种方法的使用和相应的应用场景。 merge方法 merge方法可以通过连接两个数据帧并将它们作为一个整体来找出两个数据帧之间的差异。我们先来看一下这个方法的语法:…

    python-answer 2023年3月27日
    00
  • 如何使用Python Pandas将excel文件导入

    使用Python Pandas库可以非常方便地将Excel文件导入到Python中进行数据处理和分析。下面详细讲解如何使用Python Pandas将Excel文件导入: 1.首先导入Pandas库: import pandas as pd 2.读取Excel文件 可以使用以下语句读取Excel文件: df = pd.read_excel("文件路…

    python-answer 2023年3月27日
    00
  • 如何用Python制作微信好友个性签名词云图

    制作微信好友个性签名词云图是一项很有趣的Python项目。下面是详细的制作攻略。 1. 准备数据 要制作词云图,首先需要获取微信好友的签名数据。可以使用itchat这个Python库来获取微信好友信息。使用以下代码获取微信好友信息并将签名数据保存到文本文件中: import itchat # 登录微信 itchat.auto_login() # 获取好友列表…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部