[Python] 使用 Pandas 向量化處理時間戳

1. 字符串日期 >> 時間戳 (單個)

對於單個的字符串格式的日期, 可以使用time模塊得到其時間戳

date = '1970-01-01 10:00:00'
time.mktime(time.strptime(date, '%Y-%m-%d %H:%M:%S'))

或者使用numpy

date = '1970-01-01 10:00:00'
(np.datetime64(date) - np.datetime64('1970-01-01 08:00:00')) / np.timedelta64(1, 's')

兩種方法結果一致
在這裏插入圖片描述
需要注意的是, 使用time模塊可以直接得到中國時間時區對應的時間戳, 而通過numpy得到的是格林威治時間的時間戳, 兩個時區相差8個時區, 所以第二種方法中需要減去'1970-01-01 08:00:00'

2. 時間戳 >> 字符串日期 (單個)

使用to_datetime函數可以直接將時間戳轉爲 Pandas 的日期格式數據, 注意轉換時需要根據時間戳的精度指定日期的最小單位

pd.to_datetime(7200, unit='s', origin=pd.Timestamp('1970-01-01 08:00:00')).strftime('%Y-%m-%d %H:%M:%S')
pd.to_datetime(7200000, unit='ms', origin=pd.Timestamp('1970-01-01 08:00:00')).strftime('%Y-%m-%d %H:%M:%S')

在這裏插入圖片描述
Pandas 在處理時間戳時存在跟numpy相同的時區問題, 所以爲了保證得到正確的時間, 需要設置origin參數

3. 字符串日期 >> 時間戳 (批量)

當要處理的日期數據有很多行時, 用apply或者map函數逐個轉換的方法會很慢, 這時需要利用 Pandas 的向量化操作來處理

dates = pd.Series(pd.date_range('20200101', '20201231'))
(dates.values - np.datetime64('1970-01-01 08:00:00')) / np.timedelta64(1, 's')

在這裏插入圖片描述
這裏的處理邏輯是這樣的: 先通過.values獲取np.datetime64格式的日期數據, 且數據結果從 Pandas 的Series轉變成了 Numpy 的ndarray, 然後根據時間戳的計算原理算出時間戳.

4. 時間戳 >> 字符串日期 (批量)

與轉換單個時間戳類似, 使用to_datetime函數來批量轉換時間戳

dates = pd.Series(pd.date_range('20200101', '20201231'))
dates_timestamp = (dates.values - np.datetime64('1970-01-01 08:00:00')) / np.timedelta64(1, 's')
pd.to_datetime(dates_timestamp, unit='s', origin=pd.Timestamp('1970-01-01 08:00:00')).strftime('%Y-%m-%d %H:%M:%S')

需要注意的是, 第二行代碼中np.timedelta64(1, 's')的時間單位必須跟第三行中to_datetimeunit一致, 否則會出現轉換錯誤, 比如

dates = pd.Series(pd.date_range('19700101', '19700110'))
dates_timestamp = (dates.values - np.datetime64('1970-01-01 08:00:00')) / np.timedelta64(1, 'ms')
pd.to_datetime(dates_timestamp, unit='s', origin=pd.Timestamp('1970-01-01 08:00:00')).strftime('%Y-%m-%d %H:%M:%S')

得到的輸入是錯誤的
在這裏插入圖片描述

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