簡體   English   中英

更快地將 Pandas 日期時間列轉換為字符串

[英]Faster conversion of Pandas datetime colum to string

在將 Pandas dataframe 日期列轉換為字符串列時,我遇到了一個主要的性能問題。 目前我正在使用下面的代碼。 date_column 列(通常)包含我想通過使用 strftime('%d.%m.%Y') 將其轉換為更易於閱讀的字符串的日期時間對象。 因為它發生在我在 model 中使用的先前數據中,所以我檢查值是字符串還是 NA,即沒有日期時間 object。 在這種情況下,我希望 output 為“無日期”。

不幸的是,我的方法非常緩慢。 特別是對於大數據(10m 行或更多),可能需要 1-2 分鍾甚至更長的時間。 非常感謝有關性能改進的任何建議。 到目前為止,我在 stackoverflow 上找不到任何解決方案。

謝謝!

dataframe_input.loc[:,date_column] = (dataframe_input.loc[:,date_column].map(lambda x: x.strftime('%d.%m.%Y') if pd.notnull(x) and not isinstance(x, str) else "no date")).apply(str)

如果假設大量記錄具有相同的日期是正確的(對於具有 1000 萬條記錄的數據集來說似乎很可能),我們可以利用它並通過不一遍又一遍地將相同的日期轉換為字符串來提高效率。

例如,這是從 2021-01-01 到 2021-02-01 的每秒數據(大約 270 萬條記錄)的樣子:

df = pd.DataFrame({'dt': pd.date_range('2021-01-01', '2021-02-01', freq='1s')})

這是應用於整個列的strftime

%%time
df['dt_str'] = df['dt'].dt.strftime('%d.%m.%Y')

Output:

CPU times: user 8.07 s, sys: 63.9 ms, total: 8.14 s
Wall time: 8.14 s

這里將map應用於去重值:

%%time
dts = df['dt'].astype('datetime64[D]').drop_duplicates()
m = pd.Series(dts.dt.strftime('%d.%m.%Y'), dts)
df['dt_str'] = df['dt'].map(m)

Output:

CPU times: user 207 ms, sys: 32 ms, total: 239 ms
Wall time: 240 ms

它大約快 30 倍。 當然,加速取決於唯一日期值的數量——數量越大,我們使用這種方法獲得的收益就越少。

暫無
暫無

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

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