Une partie du code ci-dessous pourrait être redondant, mais il semble fonctionner:
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')
Vous convertir timedelta en minutes , puis arrondis à 30, et finalement classer cette valeur. Il peut aussi être un one-liner si vous s'il vous plaît:
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')
Explaination:
(df['publicationDate'] - df['publicationDate'].max()
- soustrayez toutes les dates de la plus récente
(df['score']/np.timedelta64(1, 'm'))
- convertir timedelta en minutes
.apply(lambda x: (round(x/30) * 30 + 30)/30 if x else x)
- arrondi à 30 minutes excluant l'horodatage le plus récent
.rank(method='max')
classer les résultats donnant une valeur supérieure à tous ceux qui ont le même rang.
EDIT:
Pour changer le rang des plus de 2 jours, vous pouvez utiliser ceci:
df['diff'] = (df['publicationDate'] - df['publicationDate'].max()).apply(lambda x: x.days)
df.loc[df['diff']<=-2, 'score'] = 0
Première ligne vous donnera timedelta en jours entiers, et deuxième changera rang 0
où les jours sont inférieurs ou égaux à -2
.
Merci .. Mais pourriez-vous dire ce que '(df ['score']/np.timedelta64 (1, 'm'))' est en train de faire? –
Bien sûr, il convertit le timedelta en minutes. – zipa
Si je veux classer seulement les articles publiés entre les 2 derniers jours et les articles de repos être classé 0 alors quelle pourrait être la solution de contournement? –