我在数据框中有一个专栏,其中包含文章及其发布日期(时间戳)。我需要使用这些信息来找出文章的新鲜度。
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
最近的文章应该得到更高的分数。时间窗应该是半小时(在半小时内发表的两篇文章必须得到相同的分数)
答案 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
。