Einige der unten stehenden Codes überflüssig sein könnte, aber es scheint zu funktionieren:
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')
So Sie Timedelta zu Minuten konvertieren , dann runden Sie es auf 30 und schließlich ordnen Sie diesen Wert ein. Es kann auch ein Einzeiler, wenn Sie bitte:
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()
- alle Termine subtrahieren jüngste
(df['score']/np.timedelta64(1, 'm'))
- konvertieren Timedelta in Minuten
.apply(lambda x: (round(x/30) * 30 + 30)/30 if x else x)
- Rundum 30 Minuten ohne den letzten Zeitstempel
.rank(method='max')
Ordnen Sie die Ergebnisse den oberen Werten für alle diejenigen zu, die denselben Rang haben.
EDIT:
Um Rang derer älter als 2 Tage ändern Sie diese verwenden können:
df['diff'] = (df['publicationDate'] - df['publicationDate'].max()).apply(lambda x: x.days)
df.loc[df['diff']<=-2, 'score'] = 0
Erste Zeile Sie geben Timedelta in ganzen Tagen, und zweite auf Rang ändern 0
wobei die Tage kleiner oder gleich -2
sind.
Danke .. Aber könntest du sagen was '(df ['score']/np.timedelta64 (1, 'm'))' tut? –
Sicher, es konvertiert das Timedelta in Minuten. – zipa
Wenn ich nur die Artikel ordnen möchte, die zwischen den letzten 2 Tagen veröffentlicht wurden, und die restlichen Artikel auf Platz 0, dann könnte das der Workaround sein? –