0

シーンの設定: dtype int64 の Series オブジェクトを取得しました。これらを日付だけで(時間と秒なしで)datetimeオブジェクトに変換する必要があります

これまで取り組んできたこと...

foo.head() =

0    1382400000
1    1382400000
2    1382054400
3    1381708800
4    1380758400
Name: da_0, dtype: int64

この機能:

def convert_stamp_to_date(stamp):
    try:
        d = datetime.datetime.utcfromtimestamp(stamp)
    except:
        d = datetime.datetime.utcfromtimestamp(0)
    d = datetime.datetime(d.year, d.month, d.day)
    return d

問題のシリーズを処理しているときに、次のように呼び出します。

foo = foo.apply(lambda x: convert_stamp_to_date(x))

これで正しい解決策が得られます:

0   2013-10-22 00:00:00
1   2013-10-22 00:00:00
2   2013-10-18 00:00:00
3   2013-10-14 00:00:00
4   2013-10-03 00:00:00
Name: da_0, dtype: datetime64[ns]

これは私が望むものを与えてくれますが、かなり遅いと思います(そうあるべきですよね?仕事をする単純な方法だからです)。

長さが ~5000 の小さな Series オブジェクトの場合、変換には平均で ~27ms かかります。悪くはありませんが、何百万行にもなる Series オブジェクトを簡単に作成できます。そして、それらの場合、コンバージョン時間は 1 ~ 2 分の範囲になることがわかります。そして、同じサイズの Series と DataFrames で私が行う他のことと比較すると、これは遅すぎるようです。

私の最初のアイデアは、 を使用して関数を疑似ベクトル化することnp.vectorizeでした。ただし、これにより実際には変換が約 10 倍遅くなります

vconvert_stamp_to_date = np.vectorize(convert_stamp_to_date)
foo = foo.apply(lambda x: vconvert_stamp_to_date(x))

これでも正しい答えが得られますが、小さい Series オブジェクトの変換時間は約 350 ミリ秒に跳ね上がります。また、使用している大きい Series オブジェクトでは、時間がかかりすぎたため、スクリプトから ctrl+c を実行する必要がありました。 .

タイムスタンプを日時オブジェクトに変換することが私のプログラムのボトルネックになるのは少しばかげているように思えます:(どこかでこれを行うためのより効率的な方法があると信じなければなりません。誰かが私を正しい方向に向けてもらえますか?とりあえず、パンダのマナを使い果たしました. ここまで読んでくれてありがとう.

ありがとうございました。

4

1 に答える 1

5

これらはエポック秒のように見えるので、そのまま使用してくださいpd.to_datetime

In [12]: arr = [1382400000] * 1000000

In [14]: pd.to_datetime(arr,unit='s')
Out[14]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-10-22 00:00:00, ..., 2013-10-22 00:00:00]
Length: 1000000, Freq: None, Timezone: None

In [15]: %timeit pd.to_datetime(arr,unit='s')
10 loops, best of 3: 122 ms per loop
于 2013-10-31T16:00:35.710 に答える