pandas滚动窗口和日期时间索引:`offset`是什么意思?

asc*_*ter 9 python datetime dataframe pandas

pandas.DataFrame.rollingpandas 0.22 的滚动窗口函数采用window如下所述的参数:

window:int或offset

移动窗口的大小.这是用于计算统计量的观测数.每个窗口都是固定大小.

如果是偏移量,那么这将是每个窗口的时间段.每个窗口将是基于时间段中包括的观察值而变化的大小.这仅适用于类似datetime的索引.这是0.19.0中的新功能

在这种情况下,实际上是一个偏移量

Joh*_*hnE 11

简而言之,如果你使用offset类似"2d"(2天),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
Run Code Online (Sandbox Code Playgroud)

注意(1)索引是日期时间,但也(2)它缺少'2018-01-03'.所以,如果你使用像2纯整数,rolling将只是看最后两行,而不管datetime值(在一定意义上它表现得像的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
Run Code Online (Sandbox Code Playgroud)

相反,如果您使用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
Run Code Online (Sandbox Code Playgroud)

另请注意,在使用日期偏移时,您需要按升序对索引进行排序,但使用简单整数时无关紧要(因为您无论如何都只是忽略索引).

  • @Legolas,这个信息出人意料地很难找到,尽管在这种情况下猜测通常很有效;-)我会使用“我们”,但“微”或“微秒”也应该有效。请参阅此处了解更多信息:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Timedelta.html#pandas.Timedelta (3认同)
  • @thakis这可能有点愚蠢,但如果你真的想出于某种原因使用“天”,你可以这样做,通过显式转换为 timedelta:`df.rolling(pd.Timedelta('2days') )).count()` (2认同)