将时间戳转换为新鲜度索引

时间:2017-09-19 09:18:16

标签: python-2.7 timedelta

我在数据框中有一个专栏,其中包含文章及其发布日期(时间戳)。我需要使用这些信息来找出文章的新鲜度。

 articleId       publicationDate  
0      581354   2017-09-17 15:16:55  
1      581655   2017-09-18 07:37:51     
2      580864    2017-09-16 06:44:39     
3      581610    2017-09-18 06:30:30     
4      581605    2017-09-18 07:22:24     

最近的文章应该得到更高的分数。时间窗应该是半小时(在半小时内发表的两篇文章必须得到相同的分数)

1 个答案:

答案 0 :(得分:0)

下面的一些代码可能是多余的,但似乎有效:

df['score'] = df['publicationDate'] - df['publicationDate'].max()
df['score'] = (df['score'] / np.timedelta64(1, 'm')).apply(lambda x: (round(x / 30) * 30 + 30) / 30 if x else x).rank(method='max')

因此,您将timedelta转换为分钟,然后将其舍入为30,最后对该值进行排名。 如果你愿意,它也可以是一个单行:

df['score'] = ((df['publicationDate'] - df['publicationDate'].max()) / np.timedelta64(1, 'm')).apply(lambda x: (round(x / 30) * 30 + 30) / 30 if x else x).rank(method='max')

阐释:

(df['publicationDate'] - df['publicationDate'].max() - 减去最近一次的所有日期

(df['score'] / np.timedelta64(1, 'm')) - 将timedelta转换为分钟

.apply(lambda x: (round(x / 30) * 30 + 30) / 30 if x else x) - 将最近时间戳排除在外的30分钟

.rank(method='max')对结果进行排名,给所有具有相同排名的人带来上限值。

修改

要更改超过2天的人的排名,您可以使用此功能:

df['diff'] = (df['publicationDate'] - df['publicationDate'].max()).apply(lambda x: x.days)
df.loc[df['diff']<=-2, 'score'] = 0

第一行会在一天内给你timedelta,第二行会将等级更改为0,其中天数小于或等于-2