1
votes

Python Calculer la nouvelle date en fonction de la plage de dates

J'ai un Python Pandas DataFrame contenant les dates de naissance des joueurs de hockey qui ressemble à ceci:

Data['Birth Date'] = Data['Birth Date'].str.split('-').str[1:]

Je veux créer une nouvelle colonne intitulée "Draft Year" qui est calculée en fonction de cette règle :

Player         Birth Year    Birth Date     Draft Year
Player A         1990        1990-05-12      2008
Player B         1991        1991-10-30      2010
Player C         1992        1992-09-10      2010
Player D         1990        1990-11-15      2009

Cela ferait la sortie de l'exemple:

If MM-DD is before 09-15, Draft Year = Birth Year + 18
Else if MM-DD is after 09-15 Draft Year = Birth Year + 19

J'ai essayé de séparer le MM-DD de le format de date en utilisant

Player         Birth Year    Birth Date
Player A         1990        1990-05-12
Player B         1991        1991-10-30
Player C         1992        1992-09-10
Player D         1990        1990-11-15

Mais cela me renvoie une liste de [mm, jj] avec laquelle il est difficile de travailler. Toute suggestion sur la façon de procéder de manière concise serait grandement appréciée!


1 commentaires

Hockey sur glace, hockey sur gazon ou hockey sur air?


3 Réponses :


2
votes

Utilisez numpy.where :

    Player  Birth Year Birth Date  Draft Year
0  PlayerA        1990 1990-05-12        2008
1  PlayerB        1991 1991-10-30        2010
2  PlayerC        1992 1992-09-10        2010
3  PlayerD        1990 1990-11-15        2009

Sortie

data['Birth Date']=pd.to_datetime(data['Birth Date']) #to convert to datetime
cond=(df['Birth Date'].dt.month>=9)&(df['Birth Date'].dt.day>=15)
cond2=(df['Birth Date'].dt.month>=10)
data['Draft Year']=np.where(cond|cond2,data['Birth Year']+19,data['Birth Year']+18)

print(data)


0 commentaires

1
votes

Rapide et sale

Créez une colonne correspondant à 100 * le mois et ajoutez-la au jour

cutoff = df['Birth Date'].pipe(lambda d: d.dt.month * 100 + d.dt.day)
df['Draft Year'] = df['Birth Year'] + 18 + (cutoff > 915)

df

     Player  Birth Year Birth Date  Draft Year
0  Player A        1990 1990-05-12        2008
1  Player B        1991 1991-10-30        2010
2  Player C        1992 1992-09-10        2010
3  Player D        1990 1990-11-15        2009


0 commentaires

1
votes

Les dates et heures au format aaaa-mm-jj peuvent être triées sous forme de chaînes. Cette solution tire parti de ce fait:

df['Draft Year'] = df['Birth Year'] + np.where(df['Birth Date'].dt.strftime('%m-%d') < '09-15', 18, 19)


0 commentaires