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_datetime
的unit
一致, 否則會出現轉換錯誤, 比如
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')
得到的輸入是錯誤的