簡體   English   中英

將int64系列轉換為日期時間的最有效方法?

[英]Most efficient way to convert an int64 series to datetime?

設置場景:我有一個dtype int64的Series對象。 我需要將它們轉換為僅包含日期的日期時間對象(不包括小時和秒)

到目前為止我可以使用的...

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對象,平均大約需要27毫秒才能完成轉換。 不錯 ...但是,我可以輕松擁有可以增長到數百萬行的Series對象。 對於這些,我看到轉換時間進入1-2分鍾范圍內。 與其他我使用相同大小的Series和DataFrame進行的其他操作相比,這似乎太慢了。

我的第一個想法是嘗試使用np.vectorize對函數進行偽向量化。 但是,這實際上使轉換了大約10倍。

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

盡管這仍然給了我正確的答案,但將較小的Series對象的轉換時間增加到約350ms,對於我使用的較大Series,我不得不從腳本中按ctrl + c,因為這花費了太長時間。

對我來說,將時間戳轉換為日期時間對象將是我程序的瓶頸,這似乎有點荒謬:(我必須相信,在某個地方可以有更有效的方法。有人可以指出正確的方向嗎?目前,我已經用盡了所有的熊貓法力,如果您已經讀完這里的所有內容,我將非常感謝。

謝謝。

這些看起來像紀元秒,因此只需使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM