2017-09-19 3 views
1

J'ai une colonne dans l'élément de données qui contient l'article et sa date de publication (horodatage). J'ai besoin d'utiliser cette information pour trouver un score de fraîcheur d'un article.Conversion d'un horodatage en index de fraîcheur

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  

L'article le plus récent devrait obtenir un score plus élevé. Fenêtre temporelle devrait être une demi-heure (2 articles publiés dans une demi-heure doit obtenir même score)

Répondre

0

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.

+0

Merci .. Mais pourriez-vous dire ce que '(df ['score']/np.timedelta64 (1, 'm'))' est en train de faire? –

+0

Bien sûr, il convertit le timedelta en minutes. – zipa

+0

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? –