pandas dataframe 時間欄位 diff 函式

shoufengwei發表於2020-10-28

pandas

pandas 是資料處理的利器,非常方便進行表格資料處理,用過的人應該都很清楚,沒接觸的可以自行查閱pandas 官網

需求介紹

最近在使用 pandas 的過程中碰到一個問題,需要計算資料中某時間欄位下一行相對上一行的時間差,之前有用過 dataframe 的 diff 函式,但是官方的教程裡只介紹了數值欄位的操作,即結果為當前行減去上一行的差值,所以直觀的以為時間欄位無法進行此項操作。於是我使用了最原始的方式,迴圈遍歷 dataframe 每一行,逐行求時間差,將其存入陣列中,最後此陣列即為結果。

解決方案

今天,再看程式碼的時候,想到為什麼不嘗試一下 diff 對於時間欄位到底會得到什麼結果呢?於是嘗試了一下,並發現了些新東西,本文就將這個過程記錄一下。

資料存在 csv 檔案中,內容如下:

time
2020-02-01 8:00
2020-02-01 8:10
2020-02-01 8:20
2020-02-01 8:30
2020-02-01 8:40
2020-02-01 9:00
2020-02-01 9:10
2020-02-01 9:40
2020-02-01 10:00
2020-02-02 10:00

讀取檔案,並進行 diff 操作,程式碼段如下:

import pandas as pd
df = pd.read_csv('/your/file/path.csv', parse_dates=['time'])
time_diff = df['time'].diff()
print(time_diff)

其中 read_csv 為從硬碟中讀取檔案,parse_dates=['time'] 表示將 time 欄位解析為時間。得到如下結果:

0               NaT
1   0 days 00:10:00
2   0 days 00:10:00
3   0 days 00:10:00
4   0 days 00:10:00
5   0 days 00:20:00
6   0 days 00:10:00
7   0 days 00:30:00
8   0 days 00:20:00
9   1 days 00:00:00
Name: time, dtype: timedelta64[ns]

從中我們可以看出, diff 操作對於時間欄位確實有效,並真實的得到了上下行之間的時間差,只是使用 timedelta64[ns] 進行儲存,而不是我們通常想到的秒。這樣我們的問題就變的簡單了,只需要將結果中的 timedelta64[ns] 型別轉為秒數就可以了,之前從未接觸過 timedelta64[ns] 欄位,如何轉呢?google 了一下,找到一個非常簡單的解決方案,只需要將 timedelta64[ns] 強制轉為 timedelta64[s] 即可,如下:

time_diff = time_diff.astype('timedelta64[s]')
print(time_diff)

結果如下:

0        NaN
1      600.0
2      600.0
3      600.0
4      600.0
5     1200.0
6      600.0
7     1800.0
8     1200.0
9    86400.0
Name: time, dtype: float64

可以看到,我們已經得到了以秒數為單位的上下行時間差,達到了想要的效果。

One more thing

我司推出了悟空流程化資料處理平臺,訪問地址:https://wk.phitrellis.com/,無需複雜的 Excel 公式和程式設計,即可完成上述計算時間差以及其他常用資料分析操作(包含100+常用操作和如站點資料處理等業務類操作),並可像流程圖一樣實現鏈式操作,歡迎嘗試並提出寶貴意見!

相關文章