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}