[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')

得到的输入是错误的
在这里插入图片描述

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