2013-10-22 133 views
1

我想使用下面的代碼每個組獲得最新的實例。它做我想做的,除了時間戳被轉換爲numpy.datetime並且日期被減去一天。 這似乎不是正確的行爲。這是一個錯誤還是我錯過了一些東西。大熊貓:時間戳搞砸後羣

In [37]: df 
Out[37]: 

ticker currency date 
0 AACE NaN NaT 
1 AAP US Dollar 2012-12-29 00:00:00 
2 AAP US Dollar 2013-04-20 00:00:00 
3 AAP US Dollar 2013-07-13 00:00:00 
4 ABBEY British Pound 2012-12-31 00:00:00 
5 ABBEY British Pound 2013-03-30 00:00:00 
6 ABBEY British Pound 2013-06-30 00:00:00 
7 ABBNVX NaN NaT 
8 ABBV US Dollar 2012-12-31 00:00:00 
9 ABBV US Dollar 2013-03-31 00:00:00 
10 ABBV US Dollar 2013-06-30 00:00:00 


In [38]: df.date[3] 
Out[38]: Timestamp('2013-07-13 00:00:00', tz=None) 

In [39]: df.groupby('ticker').last() 
Out[39]: 


currency date ticker 

AACE NaN NaN 
AAP US Dollar 2013-07-12T17:00:00.000000000-0700 
ABBEY British Pound 2013-06-29T17:00:00.000000000-0700 
ABBNVX NaN NaN 
ABBV US Dollar 2013-06-29T17:00:00.000000000-0700 


In [40]: df.groupby('ticker').last().date[1] 
Out[40]: numpy.datetime64('2013-07-12T17:00:00.000000000-0700') 

In [41]: 

編輯:

我沒有原來的例子,但這裏是另一個例子複製相同的行爲。

In [57]: df 
Out[57]: 


ticker currency date 
3227 WWW US Dollar 2013-03-23 00:00:00 
3228 WWW US Dollar 2012-12-29 00:00:00 
3229 WWW US Dollar 2013-06-15 00:00:00 
3230 WWW US Dollar 2013-09-07 00:00:00 
3231 WYLE NaN NaT 
3232 YALUNI NaN NaT 
3233 YKBNK NaN NaT 
3234 YZCOAL NaN NaT 
3235 ZACHRY NaN NaT 
3236 ZAYOGR US Dollar 2013-03-31 00:00:00 
3237 ZAYOGR US Dollar 2013-06-30 00:00:00 
3238 ZAYOGR US Dollar 2012-12-31 00:00:00 
3239 ZINC US Dollar 2013-06-30 00:00:00 
3240 ZINC US Dollar 2012-12-31 00:00:00 
3241 ZINC US Dollar 2013-03-31 00:00:00 


In [58]: df.dtypes 
Out[58]: 
ticker    object 
currency   object 
date  datetime64[ns] 
dtype: object 

In [59]: df.tail(7).groupby('ticker').last() 
Out[59]: 


    currency date 
ticker 
ZACHRY NaN NaN 
ZAYOGR US Dollar 2012-12-30T16:00:00.000000000-0800 
ZINC US Dollar 2013-03-30T17:00:00.000000000-0700 


In [60]: df.tail(6).groupby('ticker').last() 
Out[60]: 


    currency date 
ticker 
ZAYOGR US Dollar 2012-12-31 00:00:00 
ZINC US Dollar 2013-03-31 00:00:00 

In [61]: 

它看起來像時間戳的列只有當有NaT預設時纔會搞砸。

回答

0

那些看起來像是正確的時間,但它們是帶有時區偏移的UTC時間戳(例如,-07002013-07-12T17:00:00.00-0700)。

見下文:

In [93]: x = np.datetime64('2013-07-12T17:00:00.000000000-0700') 

In [94]: x 
Out[94]: numpy.datetime64('2013-07-12T17:00:00.000000000-0700') 

In [95]: pandas.Timestamp(x) 
Out[95]: Timestamp('2013-07-13 00:00:00', tz=None) 

爲什麼他們被轉換這樣的:我不知道。可能是一個錯誤,但它應該很簡單,以至於可以保持一切順利。

0

目前還不清楚你是如何構建你的例子。請顯示實際的框架和dtypes。有可能你沒有使用和對象dtype(因爲它有一個時區),所以它不能被正確解釋。

In [10]: df = DataFrame(dict(
       A = ['AACE','AAP','AAP','ABBEY','ABBEY'], 
       B = ['20121229','20130420','20130723','20121231','20130330'])) 

In [11]: df['B'] = pd.to_datetime(df['B']) 

In [12]: df 
Out[12]: 
     A     B 
0 AACE 2012-12-29 00:00:00 
1 AAP 2013-04-20 00:00:00 
2 AAP 2013-07-23 00:00:00 
3 ABBEY 2012-12-31 00:00:00 
4 ABBEY 2013-03-30 00:00:00 

In [13]: df.groupby('A').last() 
Out[13]: 
         B 
A       
AACE 2012-12-29 00:00:00 
AAP 2013-07-23 00:00:00 
ABBEY 2013-03-30 00:00:00 

In [14]: df.groupby('A').last().dtypes 
Out[14]: 
B datetime64[ns] 
dtype: object 
+0

數據類型是pandas.tslib.Timestamp。如果我將時間戳轉換爲日期時間,然後執行groupby,它會正常工作。但是還不清楚爲什麼轉換是必要的?我真的不明白爲什麼類型必須是日期時間而不是時間戳,因爲groupby()。last()才起作用。謝謝。 – ezbentley

+0

我的意思是你可以顯示你開始的df,例如顯示df.head()和df.dtypes,還在日期列中打印元素,例如, df.ix [0, '日期']。我認爲你使用的時區可能無法正確工作(可能是一個錯誤) – Jeff