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')
得到的输入是错误的
转载:https://blog.csdn.net/weixin_42902669/article/details/105094384
查看评论