Pandas resample文档介绍
在本文中,我们将介绍Pandas库的resample功能,它对时间序列数据进行重采样。通过这个功能,我们可以将数据从较高的频率重采样为较低的频率,并通过应用聚合函数在时间间隔内汇总数据。这样,我们可以将一段时间内的数据归约为一个汇总值,从而更好地实现数据的可视化和分析。
阅读更多:Pandas 教程
什么是重采样?
Pandas中的resample函数可以将数据的频率从高到低转换。例如,我们有秒级别的数据,但是我们希望将其转换为分钟级别的数据,这时我们可以使用Pandas的resample函数来将一分钟的数据归约为一分钟的数据,同时进行统计汇总。
在下面的示例中,我们将使用一个包含一周工作日每小时的数据集。我们将创建一个新的DataFrame,将频率从小时级别重采样到天级别,同时将所有值求和。
import pandas as pd
# 创建一个DataFrame
df = pd.DataFrame({'date': pd.date_range('2022-02-14', periods=24*5, freq='1H'),
'value': range(24*5)})
# 将频率从小时级别重采样到天级别
df_day = df.resample('D', on='date').sum()
# 打印结果
print(df_day)
运行结果为:
value
date
2022-02-14 276
2022-02-15 300
2022-02-16 324
2022-02-17 348
2022-02-18 372
在这个例子中,我们使用了resample函数来重采样数据。我们将'D'作为重采样规则,表示重采样到天级别。同时,我们指定了on='date',表示我们要重采样的数据是我们DataFrame中的日期列,而不是索引。我们使用sum函数来计算每天的总和,并将结果存储在一个新的DataFrame中。
重采样规则
在Pandas的resample函数中,我们可以使用多种规则对时间序列数据进行重采样。主要规则如下:
- A:年份的最后一个日历日。
- M: 月份的最后一个日历日。
- W:每周的星期一。
- D:每个日历日。
- H:每个小时(00:00至00:59之间的数据)。
- T或min:每个分钟(00:00至00:01之间的数据)。
- S:每个秒(00:00至00:00之间的数据)。
- L或ms:每个毫秒(00:00至00:000之间的数据)。
- U:每个微秒(00:00至00:000000之间的数据)。
- N:每个纳秒(00:00至00:000000000之间的数据)。
下面的示例将演示如何使用这些规则:
# 创建一个DataFrame
df = pd.DataFrame({'date': pd.date_range('2022-02-14', periods=24*5, freq='1H'),
'value': range(24*5)})
# 将频率从小时级别重采样到每分钟级别
df_minute = df.resample('T', on='date').sum()
# 将频率从小时级别重采样到每5分钟级别
df_5minute = df.resample('5T', on='date').sum()
# 将频率从小时级别重采样到每小时级别(与原数据相同)
df_hourly = df.resample('H', on='date').sum()
# 打印结果
print('每分钟采样间隔')
print(df_minute.head())
print('每5分钟采样间隔')
print(df_5minute.head())
print('每小时采样间隔')
print(df_hourly.head())
输出结果为:
每分钟采样间隔
value
date
2022-02-14 00:00:00 0
2022-02-14 00:01:00 1
2022-02-14 00:02:00 2
2022-02-14 00:03:00 3
2022-02-14 00:04:00 4
每5分钟采样间隔
value
date
2022-02-14 00:00:00 10
2022-02-14 00:05:00 35
2022-02-14 00:10:00 60
2022-02-14 00:15:00 85
2022-02-14 00:20:00 110
每小时采样间隔
value
date
2022-02-14 00:00:00 276
2022-02-14 01:00:00 300
2022-02-14 02:00:00 324
2022-02-14 03:00:00 348
2022-02-14 04:00:00 372
我们首先创建了一个与前面相同的DataFrame,但是这次我们使用了1小时的采样间隔。然后,我们分别使用resample函数将频率从小时级别重采样为分钟级别、5分钟级别和小时级别,并使用sum函数汇总数据。我们可以看到,不同的重采样规则导致了不同的频率。
聚合函数
在进行重采样时,我们可以使用多种聚合函数对数据进行汇总,例如sum、mean、max、min、std和count等。这些函数可以将时间区间内的多个数据点进行合并,产生一个单一的数据点,从而使得时间序列数据的可视化和分析更容易。
下面的示例将展示如何使用聚合函数:
# 创建一个DataFrame
df = pd.DataFrame({'date': pd.date_range('2022-02-14', periods=24*5, freq='1H'),
'value': range(24*5)})
# 使用聚合函数mean计算每天的平均值
df_mean = df.resample('D', on='date').mean()
# 使用聚合函数max计算每天的最大值
df_max = df.resample('D', on='date').max()
# 使用聚合函数min计算每天的最小值
df_min = df.resample('D', on='date').min()
# 打印结果
print('每天平均值')
print(df_mean)
print('每天最大值')
print(df_max)
print('每天最小值')
print(df_min)
输出结果为:
每天平均值
value
date
2022-02-14 11.50
2022-02-15 35.50
2022-02-16 59.50
2022-02-17 83.50
2022-02-18 107.50
每天最大值
value
date
2022-02-14 23
2022-02-15 47
2022-02-16 71
2022-02-17 95
2022-02-18 119
每天最小值
value
date
2022-02-14 0
2022-02-15 24
2022-02-16 48
2022-02-17 72
2022-02-18 96
在这个示例中,我们使用多个不同的聚合函数来计算每天的平均值、最大值和最小值。这些函数通过对每个时间块内的数据进行统计汇总,计算单一的汇总值。
重采样中的填充和插值
在Pandas的resample函数中,我们可以使用fillna()方法或interpolate()方法来处理重采样后的缺失值。fillna()方法可以用固定的值替换NaN值,而interpolate()方法可以使用插值法对NaN值进行计算并替换。
下面的示例将演示如何使用这些方法:
# 创建一个DataFrame,其中第二天的数据被删除了
df = pd.DataFrame({'date': pd.date_range('2022-02-14', periods=24*4, freq='1H'),
'value': range(24*4)}).drop(24*2, axis=0)
# 使用fillna方法将所有NaN值替换为0
df_fillna = df.resample('D', on='date').sum().fillna(0)
# 使用interpolate方法对NaN值进行插值
df_interpolate = df.resample('D', on='date').sum().interpolate()
# 打印结果
print('使用fillna方法')
print(df_fillna)
print('使用interpolate方法')
print(df_interpolate)
输出结果为:
使用fillna方法
value
date
2022-02-14 276.0
2022-02-15 0.0
2022-02-16 324.0
2022-02-17 348.0
使用interpolate方法
value
date
2022-02-14 276.000000
2022-02-15 300.000000
2022-02-16 322.666667
2022-02-17 345.333333
在这个示例中,我们首先创建了一个DataFrame,其中第二天的数据被删除了。然后,我们使用resample函数将数据从小时级别重采样到天级别,并汇总每天的数据。在fillna方法中,我们使用0来填充NaN值。在interpolate方法中,我们使用默认的线性插值来计算NaN值。可以看到,fillna方法将NaN值替换为了0,而interpolate方法使用了插值法来计算第二天的数据。
总结
Pandas的resample功能使我们能够对时间序列数据进行重采样,从而将数据从高频率转换为低频率,并通过聚合函数进行汇总。使用不同的重采样规则和聚合函数,我们可以产生不同的汇总结果。在重采样过程中,我们还可以使用fillna()方法或interpolate()方法来处理缺失值。因此,重采样是在处理时间序列数据时非常有用的工具。
极客教程