熊猫滚动窗口和日期时间索引:“偏移”是啥意思?
Posted
技术标签:
【中文标题】熊猫滚动窗口和日期时间索引:“偏移”是啥意思?【英文标题】:pandas rolling window & datetime indexes: What does `offset` mean?熊猫滚动窗口和日期时间索引:“偏移”是什么意思? 【发布时间】:2018-07-29 01:15:48 【问题描述】:pandas 0.22 的滚动窗口函数pandas.DataFrame.rolling
采用window
参数,描述如下:
窗口:整数或偏移量
移动窗口的大小。这是用于观察的数量 计算统计量。每个窗口的大小都是固定的。
如果它是一个偏移量,那么这将是每个窗口的时间段。 每个窗口的大小将根据观察结果变化 包含在时间段内。这仅对 datetimelike 有效 索引。这是 0.19.0 中的新功能
在这种情况下,偏移实际上是什么?
【问题讨论】:
【参考方案1】:简而言之,如果您使用像“2D”(2 天)这样的offset
,pandas 将使用索引中的日期时间信息(如果可用),可能会考虑任何缺失的行或不规则的频率。但是如果你使用简单的int
像 2,那么 pandas 会将索引视为简单的整数索引 [0,1,2,...] 并忽略索引中的任何日期时间信息。
一个简单的例子应该可以清楚地说明这一点:
df=pd.DataFrame('x':range(4),
index=pd.to_datetime(['1-1-2018','1-2-2018','1-4-2018','1-5-2018']))
x
2018-01-01 0
2018-01-02 1
2018-01-04 2
2018-01-05 3
请注意 (1) 索引是日期时间,但 (2) 它缺少“2018-01-03”。因此,如果您使用像 2 这样的普通整数,rolling
将只查看最后两行,而不管日期时间值如何(在某种意义上,它的行为类似于 iloc[i-1:i]
,其中 i
是当前行):
df.rolling(2).count()
x
2018-01-01 1.0
2018-01-02 2.0
2018-01-04 2.0
2018-01-05 2.0
相反,如果您使用 2 天的偏移量 ('2D'
),rolling
将使用实际的日期时间值并说明日期时间索引中的任何不规则情况。
df.rolling('2D').count()
x
2018-01-01 1.0
2018-01-02 2.0
2018-01-04 1.0
2018-01-05 2.0
另请注意,使用日期偏移量时,您需要按升序对索引进行排序,但使用简单整数时并不重要(因为您只是忽略了索引)。
【讨论】:
以微秒为单位给出偏移量(比如10),将使用什么字符串?,我试过'10f',没用 @Legolas 这个信息出奇地难以找到,尽管在这种情况下猜测通常很有效;-) 我会使用“我们”,但“微”或“微秒”也应该有效。更多信息请看这里:pandas.pydata.org/pandas-docs/stable/reference/api/… @JohnE 该文档没有像示例中那样提到小写的d
,只有days
。但似乎只有2d
有效,而2days
无效(?)。
@thakis 感谢您注意到这一点。我不太确定为什么“天”在这里不起作用。在其他情况下,您可以通过其他方式指定天数的偏移量(例如尝试pd.Timedelta('2days')
),但我也无法在这里工作“天数”。 FWIW,我认为'D'可能是在这里指定“天”的最标准或最规范的方式,所以我将上面的示例更改为使用2D
而不是2d
@thakis 这可能有点傻,但是如果您出于某种原因真的想使用“天”,您可以这样做,通过显式转换为时间增量:df.rolling(pd.Timedelta('2days')).count()
以上是关于熊猫滚动窗口和日期时间索引:“偏移”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章