2017-10-15 4 views
1

J'ai une colonne 'Posting Date' dans l'image au format '2017-03-01'. Le type est <datetime64>[ns]. Et je veux changer la valeur si c'est après '2017-03-31' à '2017-03-31', et tous les autres restent inchangés.Remplacement conditionnel de datetime - python

Lorsque je tape df['Posting Date']>'2017-03-31', il peut correctement me montrer toutes les lignes où la condition est remplie. Donc, je suppose que la fonction de filtrage de date fonctionne.

Cependant, quand je numpy.where d'écrire la condition que celle-ci:

df['Posting Date'] = np.where(df['Posting Date']>'2017-03-31','2017-03-31,'df['Posting Date']) 

il incurrs une erreur invalid type promotion.

J'ai également essayé df.loc et la même erreur se produit.

df.loc[df['Posting Date']>'2017-03-31','Posting Date']='2017-03-31' 

ValueError: invalid literal for int() with base 10: '2017-03-31'

Je me demande pourquoi l'erreur se produit. Comment puis-je remplacer la date correctement? Quelle que soit la méthode qui fonctionne, c'est bien.

+0

Je pense que vous avez une erreur couper-coller. '' 2017-03-31, 'df [' Posting Date '] 'est une erreur de syntaxe. (La virgule devrait être _outside_ les guillemets.) Si cela est en fait une syntaxe numpy correcte, mes excuses. –

+0

Je n'ai pas essayé mais vous pouvez essayer. df ['Date d'affichage']. clip (upper = pd.Timestamp ('2017-03-31')) – piRSquared

Répondre

0

Sa cause de tentent de remplacer datetime avec chaîne dans datetime colonne DTYPE donc passer un datetime dans np.where-à-dire

df['Posting Date'] = np.where(df['Posting Date']>'2017-03-31',pd.to_datetime(['2017-03-31']),df['Posting Date']) 

sortie Exemple:

df = pd.DataFrame({'Posting Date': pd.to_datetime(['20-4-2017','20-4-2017','20-4-2017','20-3-2017','20-2-2017'])}) 
df['Posting Date'] = np.where(df['Posting Date']>'2017-03-31',pd.to_datetime(['2017-03-31']),df['Posting Date']) 

Sortie:

 
Posting Date 
0 2017-03-31 
1 2017-03-31 
2 2017-03-31 
3 2017-03-20 
4 2017-02-20 

Un meilleur posté par @pirSquared dans les commentaires en utilisant clip soit

df['Posting Date'] = df['Posting Date'].clip(upper=pd.Timestamp('2017-03-31')) 
+0

Merci beaucoup! Il a résolu mon problème parfaitement. –

+0

Content d'aider @LavenderPan – Dark