pandas dataframe 時間字段 diff 函數

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+常用操作和如站點數據處理等業務類操作),並可像流程圖一樣實現鏈式操作,歡迎嘗試並提出寶貴意見!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章