如何从Unix时间戳提取当日秒数作为分类特征?
如何从Unix时间戳提取当日累计秒数作为时段特征?
我有一份时序数据,其中包含一列Unix秒级时间戳(还有其他列):
import pandas as pd df = pd.DataFrame( { 'user': [3,3,3,3,3,6,6,6], 'timestamp': [1459467971, 1459468020, 1459468026, 1459468031, 1459468036,1513974852, 1513974853, 1513974854] } )
这份数据集用于事件分类任务,部分事件在早晨频发,其余则在下午频发,我认为**当日时段(time-of-day)**是该任务中的重要判别特征。我已经知道可以使用pd.to_datetime将时间戳转换为HH:MM:SS格式:
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s') df['time'] = df['timestamp'].dt.time print(df)
输出结果:
user timestamp time 0 3 2016-03-31 23:46:11 23:46:11 1 3 2016-03-31 23:47:00 23:47:00 2 3 2016-03-31 23:47:06 23:47:06 3 3 2016-03-31 23:47:11 23:47:11 4 3 2016-03-31 23:47:16 23:47:16 5 6 2017-12-22 20:34:12 20:34:12 6 6 2017-12-22 20:34:13 20:34:13 7 6 2017-12-22 20:34:14 20:34:14
现在想找到简便方法提取代表时段的累计秒数,得到如下结果:
user timestamp time-of-day 0 3 2016-03-31 23:46:11 85571 1 3 2016-03-31 23:47:00 85620 2 3 2016-03-31 23:47:06 85626 3 3 2016-03-31 23:47:11 85631 4 3 2016-03-31 23:47:16 85636 5 6 2017-12-22 20:34:12 74052 6 6 2017-12-22 20:34:13 74053 7 6 2017-12-22 20:34:14 74054
解决方案
这里有几种简洁高效的方法可以实现需求:
方法1:直接拆分时分秒计算
通过dt.hour、dt.minute、dt.second提取各时间分量,再转换为累计秒数:
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s') df['time-of-day'] = df['timestamp'].dt.hour * 3600 + df['timestamp'].dt.minute * 60 + df['timestamp'].dt.second
方法2:计算与当日午夜的时间差
利用dt.normalize()获取当日午夜的时间戳,再计算时间差的总秒数:
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s') # 获取当日午夜的datetime对象 midnight = df['timestamp'].dt.normalize() # 计算时间差并转换为总秒数,转为整数类型 df['time-of-day'] = (df['timestamp'] - midnight).dt.total_seconds().astype(int)
方法3:转换为Timedelta后取总秒数
将dt.time转换为字符串后转为Timedelta类型,再提取总秒数:
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s') df['time-of-day'] = pd.to_timedelta(df['timestamp'].dt.time.astype(str)).dt.total_seconds().astype(int)
以上三种方法都能得到你需要的time-of-day列,结果完全一致。
内容的提问来源于stack exchange,提问作者Amina Umar
相关产品推荐
相关产品推荐

