pandasresample的用法與應用

pandas是Python數據分析中的一個重要工具,而pandas的時間序列數據同樣扮演着至關重要的角色。為了更加方便地對時間序列數據進行分析和處理,pandas提供了resample功能,這種方法能夠對時間序列數據進行重採樣、降採樣以及升採樣等操作。

一、基本概念

在介紹resample之前,我們需要先了解一些時間序列數據中的基本概念:

  • 時間戳(Timestamp):即具體某一個時刻(瞬間)的時間點,例如2022年3月5日11點23分。
  • 時間間隔(Time interval):兩個連續時間戳之間所經過的時間,例如1秒、5分鐘。
  • 時間段(Time period):例如一個小時、一天、一周、一個月、一個季度或一年等,是時間間隔的固定長度。

在pandas中,用Timestamp表示時間戳,用Timedelta表示時間間隔,用Period表示時間段。

二、重採樣方法

resample方法是pandas中對時間序列數據進行重採樣的一個函數。resample方法需要哪些參數呢?

  • rule:是指重採樣的頻率,例如’H’表示按小時重採樣,’D’表示按天重採樣,’M’表示按月重採樣,見下表。
別名偏移量類型描述
BBusinessDay每個工作日(不包括周六日)
CCustomBusinessDay自定義工作日
DCalendarDay每日日曆日
WWeekly每周
MMonthEnd每月月末
QQuarterEnd每季度季末
AYearEnd每年年底
  • how:是指對所選重採樣的時間頻率進行降採樣的方法,例如’mean’、’first’、’last’、’sum’、’max’、’min’等等。
  • fill_method:是指在降採樣的時候,被填充的缺失值用哪個值來填充,例如’bfill’(向後填充)等。
  • closed/left_index:是指重採樣區間的閉合方式,例如’left’表示左閉右開,’right’表示右閉左開,’both’表示閉合。

那麼下面讓我們來看下resample的具體代碼實現:


import pandas as pd

# 創建時間序列數據
date_range = pd.date_range(start='2022-03-01 10:00:00', end='2022-03-10 20:00:00', freq='H')
ts = pd.Series(range(len(date_range)), index=date_range)
print('原始時間序列數據:')
print(ts.head(10))

# 按天重採樣
ts_resample = ts.resample(rule='D').sum()
print('按天重採樣後的結果:')
print(ts_resample.head())

# 按5天重採樣
ts_resample = ts.resample(rule='5D').mean()
print('按5天重採樣後的結果:')
print(ts_resample.head())

# 按周重採樣
ts_resample = ts.resample(rule='W').max()
print('按周重採樣後的結果:')
print(ts_resample.head())

三、降採樣和升採樣

根據時間序列數據的長度和要求,我們可能需要將數據從高頻率重採樣到低頻率,這個過程稱之為降採樣。相反地,我們將數據從低頻率重採樣到高頻率,就稱之為升採樣。

舉個例子,假設我們有一段每秒採集的時間序列數據,現在我們要將它降採樣到每5秒一次。代碼如下:


import pandas as pd

# 創建時間序列數據
date_range = pd.date_range(start='2022-03-01 10:00:00', end='2022-03-01 10:01:00', freq='S')
ts = pd.Series(range(len(date_range)), index=date_range)
print('原始時間序列數據:')
print(ts.head())

# 降採樣
ts_resample = ts.resample(rule='5S').sum()
print('降採樣後的結果:')
print(ts_resample.head())

同樣地,如果我們要將數據升採樣,代碼如下:


import pandas as pd

# 創建時間序列數據
date_range = pd.date_range(start='2022-03-01 10:00:00', end='2022-03-01 10:01:00', freq='S')
ts = pd.Series(range(len(date_range)), index=date_range)
print('原始時間序列數據:')
print(ts.head())

# 升採樣
ts_resample = ts.resample(rule='500ms').ffill()
print('升採樣後的結果:')
print(ts_resample.head())

在升採樣中,我們通常需要使用插值函數來填補空缺值。ffill表示使用前一個非空值填補缺失值,bfill表示使用後一個非空值填補缺失值。

四、時間段的重採樣

在較為複雜的時間序列數據處理過程中,我們可能希望把某個時間段的數據重採樣為另一個時間段的數據。例如,我們有一段數據是按照月份進行採集的,現在我們需要將其按照季度進行採集,這就需要用到時間段的重採樣。

實現時間段重採樣的關鍵在於將時間戳轉化為時間段,例如將月份轉化為季度:


import pandas as pd

# 創建時間序列數據
date_range = pd.date_range(start='2022-01-01', end='2022-12-01', freq='M')
ts = pd.Series(range(len(date_range)), index=date_range)
print('原始時間序列數據:')
print(ts.head())

# 將月份轉化為季度
ts_period = ts.to_period(freq='Q')
print('時間段重採樣前的結果:')
print(ts_period.head())

# 時間段重採樣
ts_resample = ts_period.resample(rule='A').sum()
print('時間段重採樣後的結果:')
print(ts_resample.head())

上例中,我們將原始數據中的時間戳轉化為時間段,然後按照一年為單位進行重採樣。需要注意的是,在進行時間段的重採樣時,rule參數的選取需要與時間段匹配。

總結

通過本文的介紹,我們了解了pandasresample的基本概念、重採樣方法、降採樣和升採樣、時間段的重採樣,並且給出了相應的代碼示例。pandasresample是pandas中用來處理時間序列數據的一個非常強大的工具,能夠便捷地進行時間序列數據的重採樣、降採樣和升採樣等操作。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/306998.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-02 18:05
下一篇 2025-01-02 18:05

發表回復

登錄後才能評論