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

Converting a timestamp to freshness index

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

 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     

最近的文章应该得到更高的分数。 Timewindow应该是半小时(半小时内发表的2篇文章必须同分)

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

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

第一行会为您提供全天的时间增量,第二行会将排名更改为 0,其中天数小于或等于 -2