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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM