当前位置: 首页 > 面试题库 >

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

乌骏
2023-03-14
问题内容

根据此处的熊猫文档:Docs

和例子:

>>> 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

我在这一步上正确吗?

所以在.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 0

(因为label='right'在这种情况下,2000年1月1日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

长答案:( 或者给定您使用的参数,为什么您得到的结果是正确的)从文档中可能不清楚,但是在这种设置下打开和关闭是关于严格不严格不平等(例如<vs
<=)的问题。

一个例子应该使这一点变得清楚。使用示例中的内部间隔,这与更改以下值的区别closed

closed='right' =>  ( 3:00, 6:00 ]  or  3:00 <  x <= 6:00
closed='left'  =>  [ 3:00, 6:00 )  or  3:00 <= x <  6:00

您可以在类似此处的许多地方找到间隔符号的说明(括号和括号),例如:https
:
//en.wikipedia.org/wiki/Interval_(mathematics)

label参数仅控制显示左侧(3:00)还是右侧(6:00),但不会影响结果本身。

另请注意,您可以使用loffset参数(应将其输入为时间增量)更改间隔的起点。

回到示例,在这里我们仅将标签从“ right”更改为“ left”:

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

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

1999-12-31 23:57:00     0
2000-01-01 00:00:00     6
2000-01-01 00:03:00    15
2000-01-01 00:06:00    15

如您所见,结果是相同的,只是索引标签改变了。大熊猫仅可以显示在左边或右边的标签,但如果它表现出 两个
,那么它看起来像这样(在下面,我用标准的索引符号,其中(左侧手段打开和]右侧被封闭):

( 1999-12-31 23:57:00, 2000-01-01 00:00:00 ]   0   # = 0
( 2000-01-01 00:00:00, 2000-01-01 00:03:00 ]   6   # = 1+2+3
( 2000-01-01 00:03:00, 2000-01-01 00:06:00 ]  15   # = 4+5+6
( 2000-01-01 00:06:00, 2000-01-01 00:09:00 ]  15   # =   7+8

请注意,第一个bin(23:57:00,00:00:00]不为空,只是它包含一行并且该行中的值为零。如果将“ sum”更改为“ count”这变得更加明显:

series.resample('3T', label='left', closed='right').count()

1999-12-31 23:57:00    1
2000-01-01 00:00:00    3
2000-01-01 00:03:00    3
2000-01-01 00:06:00    2


 类似资料:
  • 我有一个小熊猫DataFrame我想重新取样,我希望你能帮我:) 我不能给你看,因为它是保密的,但我可以给你描述一个更简单的版本。 它有4列: -日期(YYYY-MM-DD格式) -国家 -数量 -频率 下面是我想做的: 根据行的不同,频率为每年或每月如果恰好是每月,则无需执行任何操作。 但如果是每年一次,我想将其改为每月一次,并插入11个新行,以便在考虑的12行(现有行和11个新行)中,国家将保

  • 我试图将x轴和y轴标签以及标题放在我通过熊猫创建的三面板直方图上,但似乎无法正确放置。我在标题和三个图中最后一个的x轴标签中得到的唯一结果。我想要一个总的标题,XLabel和YLabel。制作该图的代码如下。有什么建议吗?

  • 问题内容: 给定下面的熊猫DataFrame: 我想对数据重新采样以每小时计数一次,同时按位置分组以生成如下所示的数据框: 我尝试了resample()和groupby()的各种组合,但是没有运气。我将如何处理? 问题答案: 在我的原始帖子中,我建议使用。如今,使用代替。语法在很大程度上是相同的,但现在已不支持。 此外,虽然只能按DatetimeIndex分组,但可以按日期时间 列进行分组,而您可

  • 人们可以使用熊猫轻松地从数据框中创建子情节: 现在如何将x和y标签添加到生成的绘图中?这里是一个单一的情节解释。因此,如果我想向特定子批次添加标签,我可以: 这就产生了: 如何添加标签,使它们居中,而不仅仅是指一行/列?

  • 我有一个熊猫时期对象: 从书(Python for Data Analysis)中,的意思是 季度日期固定在每个月的最后一个日历日,在指定月份(1月、2月、3月、4月、5月、6月、7月、8月、9月、10月、11月或12月)结束的年份 这到底是什么意思? 从我的常识来看,包括八月、九月和十月。那么在这里如何处理十二月()呢? 任何人都可以简明扼要地解释变量吗?提前感谢您。:)

  • 我有如下的XML文件。 我想解析crewMember标签,并从中获取id、姓氏、姓氏以及flightQualification中的iSaventured标签,所有这些都放在一个Pandas数据框中,如下所示: 我知道这将涉及一个for循环来检索firstName和lastName值,但在提取我需要的所有值时遇到困难。有没有快速的方法来做到这一点?