2017-02-26 91 views
1

我有一個DataFrame包含EffectiveDate列。 我想通過Key值對DataFrame進行分組,然後計算每個組中EffectiveDate列的所有日期值的平均時間間隔。熊貓得到組內的平均時間間隔

例如,對於數據幀:

EffectiveDate 
1 2015-08-17 07:00:00 
1 2015-08-18 07:00:00 
1 2015-08-19 07:00:00 
2 2015-08-20 07:00:00 
2 2015-08-21 07:00:00 
2 2015-09-16 07:00:00 
2 2015-10-15 07:00:00 
2 2015-11-16 08:00:00 

欲GROUPBY指數並計算在EFFECTIVEDATE列中的日期值之間的平均間隔。

15199 2015-08-17 07:00:00 
15214 2015-08-18 07:00:00 
15219 2015-08-19 07:00:00 
15233 2015-08-20 07:00:00 
15254 2015-08-21 07:00:00 
15687 2015-09-16 07:00:00 
199  2015-10-15 07:00:00 
1123 2015-11-16 08:00:00 
Name: EffectiveDate, dtype: datetime64[ns] 

在單系列這似乎很好地工作:當我使用相同的功能,在大熊貓據幀一GROUPBY彙總然而

EffectiveDate.diff().astype('timedelta64[s]').mean() 

df.groupby('Key').agg({ 
    'EffectiveDate': lambda x: x.diff().astype('timedelta64[s]').mean() 
}) 

結果是

    EffectiveDate        
1 1970-01-01 00:00:00.016747425 
2 1970-01-01 00:00:00.017765280 
3 1970-01-01 00:00:00.034776096 
4 1970-01-01 00:00:00.002052450 
5 1970-01-01 00:00:00.018238800 
6 1970-01-01 00:00:00.024005438 
7 1970-01-01 00:00:00.

我期望每列中的整數字段。我正在使用熊貓0.19.2

+0

的結果將是每個組中的'Key'列,這似乎不符合您的輸出平均值。你能否包括你的完整數據框,以及你正在做什麼? – miradulo

+0

另外,你使用的是什麼版本的熊貓?我不能用0.18.1重現這一點。 – miradulo

+0

@你說得對。我無法在0.18.1中重現這一點,我正在使用0.19.2 – user113531

回答

2

GroupBy.agg似乎試圖將返回轉換爲0.19.2中EffectiveDate列的原始dtype。通常我認爲這可能是有意義的,因爲我們期望在列下面的聚合具有相同的dtype。

要解決此問題,您可以使用GroupBy.apply代替0.19.2,該代碼之後不會執行相同的轉換。

df.groupby(df.index).apply(
    lambda x: x.diff().astype('timedelta64[s]').mean() 
) 

貌似這並沒有使用這樣的情況,我只能鑄造的EFFECTIVEDATE列的原始D型後重現0.18.1你的行爲。

0.18.1

>>> df 
     EffectiveDate 
1 2015-08-17 07:00:00 
1 2015-08-18 07:00:00 
1 2015-08-19 07:00:00 
2 2015-08-20 07:00:00 
2 2015-08-21 07:00:00 
2 2015-09-16 07:00:00 
2 2015-10-15 07:00:00 
2 2015-11-16 08:00:00 

>>> df.groupby(df.index).agg({ 
     'EffectiveDate': lambda x: x.diff().astype('timedelta64[s]').mean() 
}) 

    EffectiveDate 
1  86400.0 
2  1901700.0 

>>> df.groupby(df.index).agg({ 
     'EffectiveDate': lambda x: x.diff().astype('timedelta64[s]').mean() 
}).astype(df.EffectiveDate.dtype) 

        EffectiveDate 
1 1970-01-01 00:00:00.000086400 
2 1970-01-01 00:00:00.001901700