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’表示按月重採樣,見下表。
別名 | 偏移量類型 | 描述 |
---|---|---|
B | BusinessDay | 每個工作日(不包括周六日) |
C | CustomBusinessDay | 自定義工作日 |
D | CalendarDay | 每日日曆日 |
W | Weekly | 每周 |
M | MonthEnd | 每月月末 |
Q | QuarterEnd | 每季度季末 |
A | YearEnd | 每年年底 |
- 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