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

yizhihongxing

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日

相关文章

  • 详解Pandas merge合并操作的4种方法

    pandas 中的 merge 函数可以将两个数据集按照指定的列进行合并,类似于 SQL 中的 join 操作。merge 函数有多种合并方式,包括 inner join、left join、right join 和 outer join 等。 下面我们就来详细介绍一下 merge 函数的使用方法。 数据准备 我们首先准备两个数据集,一个是包含员工基本信息的…

    Pandas 2023年3月5日
    00
  • 如何在 Python 中为 CSV 文件添加页眉

    在Python中,我们可以使用csv模块来方便地处理CSV文件。以下是如何为CSV文件添加页眉的详细步骤: 1.导入csv和io模块 import csv import io 2.创建一个新的字符串IO对象并写入页眉 header_list = [‘姓名’, ‘性别’, ‘年龄’] s_io = io.StringIO() writer = csv.writ…

    python-answer 2023年3月27日
    00
  • 浅析pandas随机排列与随机抽样

    浅析pandas随机排列与随机抽样 1. pandas随机排列 pandas提供了一个sample()方法来对DataFrame和Series进行随机排列。sample()方法接受一个整数参数n,表示随机抽取的数量,默认为1,也可以为float类型,表示百分比。以下示例展示如何对DataFrame进行随机排列: import pandas as pd df …

    python 2023年5月14日
    00
  • 如何用Python检查时间序列数据是否是静止的

    时间序列数据的静止性指的是数据的均值、方差和协方差都不随时间而变化,这在时间序列分析中很重要,因为只有当时间序列是静止的时,我们才能应用一些常见的时间序列分析方法。 Python中有一些常见的方法可以检查时间序列的静止性,下面详细介绍这些方法。 画出时间序列的子序列和滚动统计图 一种初步检查时间序列是否静止的方法是画出时间序列的子序列和滚动统计图。可以先将时…

    python-answer 2023年3月27日
    00
  • 如何在Python中改变Pandas的日期时间格式

    在Python中,Pandas是一个非常流行的数据处理库,它可以用来读取、处理、分析和操作各种数据类型,其中包括日期时间数据。在使用Pandas进行数据分析时,经常需要对日期时间格式进行操作,比如将日期时间格式改变为另一种格式。下面是在Python中改变Pandas的日期时间格式的完整攻略,包括常见的转换方法和实例说明。 1. 读取数据 首先,我们需要读取包…

    python-answer 2023年3月27日
    00
  • 浅谈python数据类型及类型转换

    这里是详细讲解“浅谈python数据类型及类型转换”的完整攻略。 一、Python数据类型 Python中常见的数据类型有以下几种: 1. 整型(int) Python中可以表示整数,例如:1, 2, 3, 4等等。整型是可以进行数值运算的。 2. 浮点型(float) 浮点型可以表示小数,例如:1.2, 3.5, 6.7等等。浮点型也是可以进行数值运算的。…

    python 2023年5月14日
    00
  • 如何扩展Pandas DataFrame的列

    首先,将术语解释一下,因为Pandas里的数据是以DataFrame对象的形式存储的,DataFrame可以理解为一个二维表格,行对应数据的条目,列对应数据的属性。从这个角度来看,在Pandas中我们所说的“扩展DataFrame的列”,指的是添加新的列(也就是属性)到DataFrame对象中。 下面是一个添加新列到DataFrame中的完整攻略(注:以下所…

    python-answer 2023年3月27日
    00
  • pandas时间序列之如何将int转换成datetime格式

    当我们使用pandas对时间序列数据进行分析时,常常需要将整型数据表示的时间转化为datetime格式,以实现更精确的数据分析。 这里提供一种将int转换为datetime的方法: 首先需要引入pandas库和datetime库: import pandas as pd from datetime import datetime 其次,我们需要定义一个转换函…

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