You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解Pandas resample方法中的closed与label参数?

理清Pandas重采样中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:52:36