pandas中重采样的核心是resample()函数,用于改变时间序列数据的频率。1. 确保数据是时间序列数据,索引为datetimeindex类型;2. 使用resample()方法并传入新的频率规则,如'd'、'w'、'm'等;3. 指定聚合函数如mean()、sum()等计算每个周期内的值;4. 升采样时使用ffill()、bfill()或interpolate()处理缺失值;5. 可通过closed和label参数控制降采样区间闭合方式和标签;6. 处理不规则数据时,可使用asfreq()、reindex()或fillna()方法。

重采样在Pandas中,就是改变时间序列数据的频率。可以升采样(增加频率,比如从月到天)或者降采样(降低频率,比如从天到月)。核心是
resample()

Pandas的
resample()
resample()
确保数据是时间序列数据:首先,确保你的Pandas DataFrame的索引是DatetimeIndex类型。如果不是,可以使用
pd.to_datetime()

import pandas as pd
import numpy as np
# 创建一个示例DataFrame
dates = pd.date_range('2023-01-01', periods=100, freq='D')
data = np.random.randn(100)
df = pd.DataFrame({'value': data}, index=dates)
# 确保索引是DatetimeIndex
# df.index = pd.to_datetime(df.index) # 如果需要转换使用resample()
resample()
# 降采样到每周,计算均值
weekly_mean = df.resample('W').mean()
print(weekly_mean.head())
# 升采样到每小时,用前一个值填充缺失值
hourly_filled = df.resample('H').ffill()
print(hourly_filled.head())指定聚合函数:
resample()
mean()
sum()
count()
min()
max()

# 降采样到每月,计算总和
monthly_sum = df.resample('M').sum()
print(monthly_sum.head())处理缺失值:升采样会引入缺失值。可以使用
ffill()
bfill()
interpolate()
# 升采样到每小时,并使用线性插值填充缺失值
hourly_interpolated = df.resample('H').interpolate()
print(hourly_interpolated.head())自定义聚合函数:你还可以使用
agg()
# 自定义聚合函数,计算每个月的范围(最大值 - 最小值)
def range_func(x):
return x.max() - x.min()
monthly_range = df.resample('M').agg(range_func)
print(monthly_range.head())closed
label
closed
label
closed
'right'
'left'
label
'right'
'left'
举个例子,假设你按天降采样到周,
closed='right'
label='right'
closed='left'
label='left'
# 降采样到每周,指定闭合区间和标签
weekly_sum_right = df.resample('W', closed='right', label='right').sum()
weekly_sum_left = df.resample('W', closed='left', label='left').sum()
print("Right closed and labeled:\n", weekly_sum_right.head())
print("\nLeft closed and labeled:\n", weekly_sum_left.head())升采样必然会引入缺失值,但可以通过选择合适的填充方法来减少其影响。
ffill()
bfill()
interpolate()
除了选择合适的填充方法,还可以考虑使用更短的重采样频率,例如,如果你的数据是按天记录的,可以先升采样到小时,然后再进行插值,这样可以减少插值的误差。
另外,了解你的数据特性非常重要。例如,如果你的数据是季节性的,可以考虑使用季节性分解方法,然后对分解后的数据进行重采样和插值。
# 升采样到每小时,并使用时间加权插值填充缺失值
hourly_time_based = df.resample('H').interpolate(method='time')
print(hourly_time_based.head())真实世界的数据往往是不规则的,例如,某些日期可能缺少数据,或者数据的时间间隔不一致。Pandas提供了一些方法来处理这些情况。
首先,可以使用
asfreq()
其次,可以使用
reindex()
此外,还可以使用
fillna()
# 创建一个不规则的时间序列
irregular_dates = pd.to_datetime(['2023-01-01', '2023-01-03', '2023-01-05', '2023-01-08'])
irregular_data = np.random.randn(4)
irregular_df = pd.DataFrame({'value': irregular_data}, index=irregular_dates)
# 转换为规则的时间序列,并填充缺失值
regular_df = irregular_df.asfreq('D', fill_value=0)
print(regular_df)以上就是Pandas中怎样实现数据的重采样?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号