Python 如何理解熊猫重采样方法中的闭参数和标签参数?

Python 如何理解熊猫重采样方法中的闭参数和标签参数?,python,pandas,dataframe,time-series,Python,Pandas,Dataframe,Time Series,根据此处的熊猫文档: 举例如下: >>> 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:0

根据此处的熊猫文档:

举例如下:

>>> 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
=========bin 01=========
2000-01-01 00:00:00    0
2000-01-01 00:01:00    1
2000-01-01 00:02:00    2

=========bin 02=========
2000-01-01 00:03:00    3
2000-01-01 00:04:00    4
2000-01-01 00:05:00    5

=========bin 03=========
2000-01-01 00:06:00    6
2000-01-01 00:07:00    7
2000-01-01 00:08:00    8
在我看来,重新采样后的垃圾箱应该是这样的:

>>> 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
=========bin 01=========
2000-01-01 00:00:00    0
2000-01-01 00:01:00    1
2000-01-01 00:02:00    2

=========bin 02=========
2000-01-01 00:03:00    3
2000-01-01 00:04:00    4
2000-01-01 00:05:00    5

=========bin 03=========
2000-01-01 00:06:00    6
2000-01-01 00:07:00    7
2000-01-01 00:08:00    8
我这一步对吗

所以在
.sum
之后,我认为应该是这样的:

2000-01-01 00:02:00     3
2000-01-01 00:05:00    12
2000-01-01 00:08:00    21
我只是不明白它是怎么出来的:

2000-01-01 00:00:00

(因为在这种情况下,
label='right'
,2000-01-01 00:00:00不能是任何箱子的任何右边缘)

2000-01-01 00:09:00 15


(标签2000-01-01 00:09:00甚至在原始系列中都不存在。

简短回答:如果您使用
closed='left'
loffset='2T'
,那么您将得到您所期望的:

series.resample('3T', label='left', closed='left', loffset='2T').sum()

2000-01-01 00:02:00     3
2000-01-01 00:05:00    12
2000-01-01 00:08:00    21

详细回答:(或者,考虑到您使用的参数,您得到的结果是正确的原因)文档中可能不清楚这一点,但此设置中的“打开”和“关闭”是关于严格与非严格不等式(例如,
重要的是,通过首先生成一个光栅来执行重采样,光栅是一系列的实例(不是周期、间隔、持续时间),它独立于“标签”和“关闭”参数进行。它仅使用“频率”参数和“loffset”。在您的情况下,系统将生成以下光栅:

2000-01-01 00:00:00
2000-01-01 00:03:00
2000-01-01 00:06:00
2000-01-01 00:09:00
请再次注意,此时没有间隔或句点的解释。您可以使用“loffset”来移动它

然后,系统将使用ordre中的“closed”(关闭)参数在两个选项中进行选择:

  • (开始,结束]

  • [开始,结束]

此处“开始”和“结束”是光栅中两个相邻的时间戳。“标签”参数用于选择是将“开始”还是“结束”用作间隔的代表

在您的示例中,如果选择closed='right',则将获得以下时间间隔:

( previous_interval , 2000-01-01 00:00:00] - {0}
(2000-01-01 00:00:00, 2000-01-01 00:03:00] - {1,2,3}
(2000-01-01 00:03:00, 2000-01-01 00:06:00] - {1,2,3}
(2000-01-01 00:06:00, 2000-01-01 00:09:00] - {4,5,6}
(2000-01-01 00:09:00, next_interval ] - {7,8}

请注意,在对这些时间间隔的值进行聚合后,结果将显示为两个版本,具体取决于“label”参数,也就是说,同一个时间间隔是由其左时间戳表示还是由右时间戳表示。

根据约翰的回答,我整理了一个有用的信息图表,可以一劳永逸地解决这个问题:


否,
closed='right'
表示这是另一种方式。@JohnE感谢您的回复。我理解closed=right表示间隔中包含右边缘。通过
系列重新采样后,您能告诉我3个箱子的外观吗。重新采样('3T',label='right',closed='right'))
?我原以为
2000-01-01 00:00:00 0不应该出现在
.sum
之后。我原以为我在回答中已经提到了这一点,但我会尽量说得更清楚。谢谢你的回答。我现在明白了。再次感谢你。明洲-你应该投票支持他回答你的问题-基本礼仪你知道怎么做吗将重采样日期指定为原始数据帧的新列?例如,300*24行,日期列为fromat like
%Y-%m-%d%H
(300天,小时)。我需要每隔7天按他们分组,最后一天锚定到今天,以7*24回滚。因为有一些原因,我不能使用resample.agg,所以我需要将resampled date列设置回原始dataframe@Mithril这是一个有趣的问题,你可能想发布一个新的问题,以得到一个好的和具体的答案在我看来,我可以看到两种替代方法:(1)使用
merge\u asof
合并回原始数据,或(2)使用
插值,而不是重新采样
2000-01-01 00:00:00
2000-01-01 00:03:00
2000-01-01 00:06:00
2000-01-01 00:09:00
( previous_interval , 2000-01-01 00:00:00] - {0}
(2000-01-01 00:00:00, 2000-01-01 00:03:00] - {1,2,3}
(2000-01-01 00:03:00, 2000-01-01 00:06:00] - {1,2,3}
(2000-01-01 00:06:00, 2000-01-01 00:09:00] - {4,5,6}
(2000-01-01 00:09:00, next_interval ] - {7,8}