如何理解Pandas resample方法中的closed与label参数?
closed='right'和label='right'的逻辑 嘿,我来帮你拆解这个让你困惑的重采样结果~ 先把你的示例代码和结果摆出来,再一步步分析:
原始Series代码与输出
import pandas as pd index = pd.date_range('1/1/2000', periods=9, freq='T') series = pd.Series(range(9), index=index) series
2000-01-01 00:00:00 0
2000-01-01 00:01:00 1
2000-01-01 00:02:00 2
2000-01-01 00:03:00 3
2000-01-01 00:04:00 4
2000-01-01 00:05:00 5
2000-01-01 00:06:00 6
2000-01-01 00:07:00 7
2000-01-01 00:08:00 8
Freq: T, dtype: int64
重采样代码与实际结果
series.resample('3T', label='right', closed='right').sum()
2000-01-01 00:00:00 0
2000-01-01 00:03:00 6
2000-01-01 00:06:00 15
2000-01-01 00:09:00 15
你的理解偏差与正确区间划分
你之前划分的区间是左闭右开的常规思路,但这里设置了closed='right',意味着重采样的区间是左开右闭的,再结合label='right'用区间的右边界作为结果的索引标签,我们逐个拆解:
- 第一个区间:
(1999-12-31 23:57:00, 2000-01-01 00:00:00]
这个区间里只包含原始Series的2000-01-01 00:00:00,求和为0,标签用右边界2000-01-01 00:00:00 - 第二个区间:
(2000-01-01 00:00:00, 2000-01-01 00:03:00]
包含00:01、00:02、00:03三个时间点,值为1+2+3=6,标签用右边界00:03:00 - 第三个区间:
(2000-01-01 00:03:00, 2000-01-01 00:06:00]
包含00:04、00:05、00:06,值为4+5+6=15,标签00:06:00 - 第四个区间:
(2000-01-01 00:06:00, 2000-01-01 00:09:00]
包含00:07、00:08,值为7+8=15,标签00:09:00
这样就完全对应上了实际的重采样结果~ 核心差异就是closed='right'改变了区间的闭合方向,不是你默认的左闭右开,而是左开右闭。
补充参数说明
closed:决定区间的哪个端点是闭合(包含数据)的,默认是'left'(左闭右开),你设置成'right'就变成左开右闭label:决定用区间的哪个端点作为结果的索引标签,'right'就是用右边界
如果你想得到你预期的结果(标签为00:02、00:05、00:08,求和3、12、21),其实需要调整参数:比如用默认的closed='left'(左闭右开区间[00:00,00:03)、[00:03,00:06)等),同时设置label='right'并偏移标签,比如加上loffset='-1T',代码如下:
series.resample('3T', label='right', loffset='-1T').sum()
输出会是:
2000-01-01 00:02:00 3
2000-01-01 00:05:00 12
2000-01-01 00:08:00 21
内容的提问来源于stack exchange,提问作者mingchau

