熊猫滚动窗口& datetime索引:`offset`是什么意思?

时间:2018-02-18 18:57:15

标签: python pandas datetime dataframe

pandas 0.22的滚动窗函数pandas.DataFrame.rolling采用window参数描述如下:

  

窗口:int或offset

     

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

     

如果是偏移量,那么这将是每个窗口的时间段。   每个窗口将根据观察结果变化   包括在时间段内。这仅适用于datetimelike   索引。这是0.19.0中的新内容

在此上下文中实际上是偏移量

1 个答案:

答案 0 :(得分:8)

简而言之,如果你使用像{2}这样的offset(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

注意(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

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