1

次のコードを使用して、各グループごとに最新のインスタンスを取得しようとしています。Timestamp が numpy.datetime に変換され、日付が 1 日減算されることを除いて、それは私が望むことを行います。これは正しい動作とは思えません。これはバグですか、それとも何か不足していますか。

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 プリセットがある場合にのみ、タイムスタンプの列がめちゃくちゃになるようです。

4

2 に答える 2

0

あなたの例をどのように構築したかは不明です。Pls は、実際のフレームと 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
于 2013-10-22T16:48:08.493 に答える
0

これらは正しい時刻のように見えますが、タイム ゾーン オフセットを含む UTC タイムスタンプです (例: -0700in 2013-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)

なぜ彼らはそのように変換されているのか: 私にはわかりません. バグかもしれませんが、applyすべてをまっすぐに保つのに十分なほど単純でなければなりません。

于 2013-10-22T16:25:11.407 に答える