将时间戳转换为新鲜度索引
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
。
我在数据框中有一列,其中包含文章及其发布日期(时间戳)。我需要使用这些信息来找出一篇文章的新鲜度分数。
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
。