Pandas2.2 DataFrame
Time Series-related
方法 描述 DataFrame.asfreq(freq[, method, how, …]) 用于**將時間序列數據轉換為指定頻率(resample to frequency)**的方法 DataFrame.asof(where[, subset]) 用于查找時間序列中最接近指定時間點的非 NaN 值 的方法 DataFrame.shift([periods, freq, axis, …]) 用于**將 DataFrame 的數據沿著指定軸移動(平移)**的方法 DataFrame.first_valid_index() 用于獲取 DataFrame 中第一個非空(非 NaN)值所在的行索引 的方法 DataFrame.last_valid_index() 用于獲取 DataFrame 中最后一個非空(非 NaN)值所在的行索引 的方法 DataFrame.resample(rule[, axis, closed, …]) 用于**對時間序列數據進行重采樣(resampling)**的核心方法
pandas.DataFrame.resample()
pandas.DataFrame.resample()
是 Pandas 中用于**對時間序列數據進行重采樣(resampling)**的核心方法。它類似于 SQL 中的“GROUP BY 時間窗口”操作,常用于將高頻時間序列數據聚合為低頻(如從分鐘級到小時級、日級等),也支持升采樣(插值填充)。
📌 方法簽名
DataFrame. resample( rule, axis= 0 , closed= None , label= None , convention= 'start' , kind= None , on= None , level= None , origin= 'start_day' , offset= None , group_keys= False
)
🔧 參數說明:
參數 說明 rule
時間頻率字符串,如 'D'
(天)、'W'
(周)、'M'
(月)、'Q'
(季度)、'A'
(年)等 axis
操作軸方向,默認為 0
(行方向) closed
區間閉合方式,可選 'left'
或 'right'
,表示區間端點是否包含 label
聚合后標簽的位置,可選 'left'
或 'right'
convention
升采樣時的時間點對齊方式,如 'start'
, 'end'
(默認 'start'
) kind
返回類型,可選 'period'
或 'timestamp'
on
對非索引的時間列進行 resample(適用于普通列而非 DatetimeIndex) level
多級索引中指定某一級作為時間索引 origin
起始時間對齊方式,可選 'epoch'
或 'start_day'
(默認) offset
時間偏移量,如 '1D'
表示起始時間向后偏移一天 group_keys
是否在分組鍵中顯示時間標簽(一般不需修改)
? 返回值
返回一個 Resampler
對象,需要配合 .mean()
, .sum()
, .max()
等聚合函數使用; 原始數據不會被修改;
🧪 示例代碼及結果
示例 1:基本用法(按天聚合)
import pandas as pd
import numpy as np
index = pd. date_range( '2025-01-01' , periods= 6 , freq= 'H' )
df = pd. DataFrame( { 'value' : [ 10 , 20 , 30 , 40 , 50 , 60 ]
} , index= index) print ( "Original DataFrame:" )
print ( df)
輸出:
value
2025-01-01 00:00:00 10
2025-01-01 01:00:00 20
2025-01-01 02:00:00 30
2025-01-01 03:00:00 40
2025-01-01 04:00:00 50
2025-01-01 05:00:00 60
resampled = df. resample( '2H' ) . mean( )
print ( "\nAfter resample('2H').mean():" )
print ( resampled)
輸出:
value
2025-01-01 00:00:00 15.0
2025-01-01 02:00:00 35.0
2025-01-01 04:00:00 55.0
示例 2:按天聚合并求和
resampled = df. resample( 'D' ) . sum ( )
print ( "\nAfter resample('D').sum():" )
print ( resampled)
輸出:
value
2025-01-01 210
示例 3:自定義閉合方式與標簽位置
resampled = df. resample( '2H' , closed= 'right' , label= 'right' ) . mean( )
print ( "\nresample('2H', closed='right', label='right'):" )
print ( resampled)
輸出:
value
2025-01-01 02:00:00 15.0
2025-01-01 04:00:00 35.0
2025-01-01 06:00:00 55.0
示例 4:升采樣 + 插值填充(ffill
)
resampled = df. resample( '30T' ) . ffill( )
print ( "\nresample('30T').ffill():" )
print ( resampled)
輸出(部分):
value
2025-01-01 00:00:00 10
2025-01-01 00:30:00 10
2025-01-01 01:00:00 20
2025-01-01 01:30:00 20
2025-01-01 02:00:00 30
...
示例 5:使用 on=
指定時間列進行 resample
df_reset = df. reset_index( )
df_reset. rename( columns= { 'index' : 'timestamp' } , inplace= True )
resampled = df_reset. resample( '2H' , on= 'timestamp' ) . mean( )
print ( "\nresample(..., on='timestamp').mean():" )
print ( resampled)
輸出:
value
timestamp
2025-01-01 00:00:00 15.0
2025-01-01 02:00:00 35.0
2025-01-01 04:00:00 55.0
示例 6:使用 kind='period'
返回 Period 類型
resampled = df. resample( '2H' , kind= 'period' ) . mean( )
print ( "\nresample(..., kind='period').mean():" )
print ( resampled)
輸出:
value
timestamp
2025-01-01 00:00 15.0
2025-01-01 02:00 35.0
2025-01-01 04:00 55.0
🧠 應用場景
場景 說明 時間序列聚合 如計算每日/每周/每月的均值、總和等 降采樣(Downsampling) 將高頻率數據轉換為低頻率(如秒級 → 分鐘級) 升采樣(Upsampling) 將低頻率數據轉換為高頻率(如日級 → 小時級),通常結合 .interpolate()
或 .ffill()
缺失值處理 在升采樣后填充缺失值 可視化準備 統一時間粒度便于繪圖分析
?? 注意事項
必須確保索引或指定列為 DatetimeIndex
類型; resample()
不會直接返回結果,必須配合聚合函數(如 .mean()
, .sum()
);支持多種頻率規則,如: 'T'
/ 'min'
:分鐘'H'
:小時'D'
:天'W'
:周'M'
:月末'Q'
:季度末'A'
:年末 closed
和 label
控制時間區間的劃分方式;origin
可控制時間窗口起點;offset
可設置時間窗口偏移(如從 1:30 開始);on=
可用于對非索引的時間列進行 resample。
? 總結對比
方法 是否聚合 是否支持升采樣 是否支持降采樣 是否支持非索引時間列 .resample()
? ? ? ?(通過 on=
) .asfreq()
? ? ? ? .rolling()
? ? ? ? .groupby(pd.Grouper(freq='D'))
? ? ? ?
📈 頻率規則參考表(常用)
規則 含義 'T'
/ 'min'
每分鐘 'H'
每小時 'D'
每天 'W'
每周(默認周日為一周開始) 'M'
每月最后一天 'Q'
每季度最后一天 'A'
每年最后一天 'MS'
每月初第一天 'QS'
每季度初第一天 'AS'
每年初第一天
? 推薦組合使用方式
df. resample( 'D' ) . mean( )
df. resample( 'T' ) . ffill( )
df. resample( 'T' ) . interpolate( 'linear' )
如果你希望對時間序列進行降采樣統計、升采樣插值、或統一時間粒度 ,resample()
是非常強大且靈活的工具,是時間序列分析中的核心方法之一。