熊猫滚动窗口和日期时间索引:“偏移”是啥意思?

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

以上是关于熊猫滚动窗口和日期时间索引:“偏移”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:如何在偏移日期合并两个数据框?

SwiftUI:ScrollView 偏移滚动内容

熊猫:从日期时间索引合并日期和小时

熊猫日期时间和日期时间日期时间之间的区别

分组日期滚动中最新非空值的 Pandas 日期索引

具有时间偏移熊猫的滚动平均值